20232210刘天择《Python程序设计》实验四报告

20232210刘天择 2024-05-27 15:25:11

20232210刘天择《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2322
姓名: 刘天择
学号:20232210
实验教师:王志强
实验日期:2024年5月23日
必修/选修: 公选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
(1):编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
(2):利用公开数据集,开展图像分类、恶意软件检测等
(3):利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
(4):爬取天气数据,实现自动化微信提醒
(5):利用爬虫,实现自动化下载网站视频、文件等。
(6):例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等

注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。

2. 实验过程及结果

由于本人才疏学浅,只编写了简单的自己搞得懂的程序。

双人乒乓球

程序描述 :两人一同进行游戏,分别使用“WS”“IK”按键(可在程序内调整)控制球拍,实现一个双人进行的可调节包括球拍大小,乒乓球飞行速度,乒乓球大小,移动步距等参数的自定义乒乓球小游戏

实现效果

img

设计步骤
(1):模块引入与初始化

from random import choice, random
from turtle import *
from freegames import vector

ball = vector(0, 0) 小球位置定到原点
aim = vector(value(), value()) 随机一个开球方向
state = {1: 0, 2: 0} 定义拍1和拍2

random函数用于自定义开球方向,turtle画笔用于绘制球拍,freegames是一个用于二维游戏的便利模块

(2):主程序

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: move(1, 50), 'w')
onkey(lambda: move(1, -20), 's')
onkey(lambda: move(2, 50), 'i')
onkey(lambda: move(2, -20), 'k')
draw()
done()

(3):draw函数

def draw():
    clear()  清空画布来达到小球连续移动的效果
    rectangle(-200, state[1], 10, 50)  在-200处画出球拍1
    rectangle(190, state[2], 10, 50)  在-190处画出球拍2
    ball.move(aim) 小球朝着目标方向移动
    x = ball.x 新的小球横坐标
    y = ball.y 新的小球纵坐标
    up()
    goto(x, y) 跳转到新的位置
    dot(10) 绘制一个小球(参数为小球大小)
    update() 更新画布
    if y < -200 or y > 200: 碰到上下边界则反弹
        aim.y = -aim.y
    if x < -185: 碰到左边玩家底线
        low = state[1] 
        high = state[1] + 50
        if low <= y <= high: 若处在球拍范围内弹回,游戏继续
            aim.x = -aim.x
        else:
            return 游戏结束
    if x > 185:
        low = state[2]
        high = state[2] + 50 同上
        if low <= y <=high:
            aim.x = -aim.x
        else:
            return
    ontimer(draw, 25) 计时器 更改参数可以控制小球速度

setup用于构建场地(可以更改,但是需要同时更改后续的游戏条件),hideturtle用于隐藏画笔,tracer和listen用于让游戏顺利实时运行,onkey是为了读取玩家的键盘输入从而达到乒乓球拍移动的效果,更改引号内字母和括号内数字可以调整按键以及球拍步距
(4):三个小型函数

def value():
   return (3 + random() * 2) * choice([1, -1])

def move(player, change):
    state[player] += change

def rectangle(x, y, width, height):
    up()  
    goto(x, y) 
    down()
    begin_fill() 
    for count in range(2):
        forward(width) 绘制宽与高 重复两次得到一个闭合长方形
        left(90)
        forward(height)
        left(90)
    end_fill() 将长方形补满得到球拍

value用于随机开球方向,move用于改变球拍位置(上下),rectangle用于绘制球拍
(5):程序总览

from random import choice, random
from turtle import *
from freegames import vector


def value():
    """Randomly generate value between (-5, -3) or (3, 5)."""
    return (3 + random() * 2) * choice([1, -1])


ball = vector(0, 0)
aim = vector(value(), value())
state = {1: 0, 2: 0}


def move(player, change):
    """Move player position by change."""
    state[player] += change


def rectangle(x, y, width, height):
    """Draw rectangle at (x, y) with given width and height."""
    up()
    goto(x, y)
    down()
    begin_fill()
    for count in range(2):
        forward(width)
        left(90)
        forward(height)
        left(90)
    end_fill()


def draw():
    clear()
    rectangle(-200, state[1], 10, 50)
    rectangle(190, state[2], 10, 50)
    ball.move(aim)
    x = ball.x
    y = ball.y
    up()
    goto(x, y)
    dot(10)
    update()
    if y < -200 or y > 200:
        aim.y = -aim.y
    if x < -185:
        low = state[1]
        high = state[1] + 50
        if low <= y <= high:
            aim.x = -aim.x
        else:
            return
    if x > 185:
        low = state[2]
        high = state[2] + 50
        if low <= y <=high:
            aim.x = -aim.x
        else:
            return
    ontimer(draw, 25)

setup(420, 420, 370, 0)
hideturtle()
tracer(False)
listen()
onkey(lambda: move(1, 50), 'w')
onkey(lambda: move(1, -40), 's')
onkey(lambda: move(2, 50), 'i')
onkey(lambda: move(2, -40), 'k')
draw()
done()

3. 实验过程中遇到的问题和解决过程

  • 问题1:在编写程序时遇到了画笔使游戏无法开始
  • 问题1解决方案:引入了hideturtle()
  • 问题2:只能游玩单局,需要重复开始
  • 问题2解决方案:嵌套了一个while循环,将游戏变成三局两胜制,使得可玩性加强
  • 问题3:判断球拍与球碰撞不够精确
  • 问题3解决方案:扩建了场地,缩减了坐标大小来提高精确度

其他(感悟、思考等)

【1】对本次实验的感悟
本次实验我第一次独立做了一个实时互动类的小游戏,之前也做过小游戏但是从来没有做过此类可以实时操作的,感觉心情非常激动。
此外,这个小游戏让我学到了原来freegame与turtle这两个模块可以这样结合,使得我对编写这类小游戏有了更加浓厚的兴趣。
同时,这种自定义自己游戏参数的感觉也非常令人沉醉。
通过本次实验,我觉得我独立编写代码的能力得到了很大的提升,同时对实时类的一些代码实现有了更深的理解。
【2】对于python课程的感悟
我在高中阶段学习过C++与python,但那时更多是因为应试,并没有挖掘python的有趣之处。而在王老师的课上,经过系统的学习,我感受到了python独特的魅力。王老师并不教我们像竞赛一样使用python去解题,而是教我们去用起来,去编写小游戏,去编写自己感兴趣的程序。虽然这些程序看上去十分简陋甚至有点可笑,但是这都是我们一个字符一个字符敲下的宝贵财富。说来惭愧,在python课程上我仍然有许多一知半解甚至一头雾水的知识,比如实验三,比如网络爬虫,但是经过这几周的课我也学到了许多。最后,感谢王老师。王老师不仅上课幽默风趣,教学方法也非常独特。我还记得第一次听到学英语能在py课上加分的时候我那种惊讶的感觉。总体来说,py这门课非常充实,补充了一定的计算机知识;同时也非常有趣,课程有趣,王老师更有趣!

参考资料

...全文
95 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
人生苦短,我用Python!
python3.11 高校
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧