110
社区成员
发帖
与我相关
我的任务
分享课程:《Python程序设计》
班级: 2322
姓名: 刘天择
学号:20232210
实验教师:王志强
实验日期:2024年5月23日
必修/选修: 公选课
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
(1):编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
(2):利用公开数据集,开展图像分类、恶意软件检测等
(3):利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
(4):爬取天气数据,实现自动化微信提醒
(5):利用爬虫,实现自动化下载网站视频、文件等。
(6):例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
由于本人才疏学浅,只编写了简单的自己搞得懂的程序。
程序描述 :两人一同进行游戏,分别使用“WS”“IK”按键(可在程序内调整)控制球拍,实现一个双人进行的可调节包括球拍大小,乒乓球飞行速度,乒乓球大小,移动步距等参数的自定义乒乓球小游戏
实现效果 :

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