实验四《Python程序设计》实验报告
实验四
课程:《Python程序设计》
班级: 2031
姓名: 尹宗颐
学号: 20203121
实验教师:王志强
必修/选修: 公选课
#1.实验内容
- Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
我做的是游戏普普通通的 贪吃蛇
## 2. 实验过程及结果
1.
此前已经安装过一遍,忘记截图,此时显示已经安装过
2.
导入函数,检测版本,确定导入成功
3.
进行初始化设置
4.
开始游戏,编写标题,得分,设置背景颜色和网格,设置帧率fps并利用fps控制蛇的移速,然后随机位置刷新食物
利用collidepoint进行碰撞检测,模拟出吃掉食物的效果,并增加分数和蛇的速度
设置蛇的移动方向
从键盘获取输入,控制蛇进行移动,并且限制不能向后移动,防止因此直接死亡
5.
失败条件判定:撞到自己
6.
失败后显示结算界面,但出现问题,结算界面未显示便直接结束程序,尚未解决
码云: https://gitee.com/besti2021python/yzy20203121/blob/master/game.py
代码:
import pygame
import random
import copy
#初始方向
move_up = False
move_down = False
move_left = False
move_right = True
#初始化
pygame.init()
clock = pygame.time.Clock() #设置游戏时钟
screen = pygame.display.set_mode((800, 600)) #窗口大小
snake_list =[[10, 10]]#蛇的初始位置
food_point = [random.randint(10, 490),random.randint(10, 490)]#食物位置
#字体设置
font1 = pygame.font.SysFont('宋体', 16, True)
font_list = pygame.font.get_fonts()
game_font = pygame.font.SysFont('宋体', 16, True)
game_font1 = pygame.font.SysFont('宋体', 36, True)
#参数设置
num = -1
score = 0
a=10
b=0
c=move_left
#开始游戏
run = True
while run:
pygame.display.update()
pygame.display.set_caption("贪吃蛇 当前得分:%d " % score ) #编写标题与得分
clock.tick(a)#设置游戏fps,并利用fps控制蛇的速度
screen.fill([255, 255, 255])#
#绘制背景网格
for x in range(0,801,10):
pygame.draw.line(screen,(195,197,199),(x,0),(x,800),1)
pygame.draw.line(screen, (195, 197, 199), (0, x), (800, x), 1)
if b ==0:
food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)#显示食物
if b ==1:
food_rect = pygame.draw.circle(screen,[0,255,255],food_point,20,0)#显示食物
snake_rect = []
for pos in snake_list:
snake_rect.append(pygame.draw.circle(screen,[255,0,0],pos,5,0))
#吃掉食物
if food_rect.collidepoint(pos):
snake_list.append(food_point)
if num % 5 ==4 :
food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生成食物位置
food_rect = pygame.draw.circle(screen, [0 , 255, 255], food_point, 20, 0)# 显示食物
score += 1
num += 1
a += 2
b = 1
break
if num % 5 == 0:
score += 5
food_point = [random.randint(10,790),random.randint(10,590)]# 重新生成食物位置
food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10,0) # 显示食物
num +=1
a += 2
b = 0
break
else:
food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生食物位置
food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)# 显示食物
score += 1
num +=1
a += 2
b = 0
break
# 移动
pos = len(snake_list) - 1
while pos > 0:
snake_list[pos] = copy.deepcopy(snake_list[pos - 1])
pos -= 1
if move_right:
snake_list[pos][0] += 10
if snake_list[pos][0] > 800:
snake_list[pos][0] = 0
if move_left:
snake_list[pos][0] -= 10
if snake_list[pos][0] < 0:
snake_list[pos][0] = 800
if move_up:
snake_list[pos][1] -= 10
if snake_list[pos][1] < 0:
snake_list[pos][1] = 600
if move_down:
snake_list[pos][1] += 10
if snake_list[pos][1] > 600:
snake_list[pos][1] = 0
#位置移动
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and event.key!=c:
move_up = True
move_down = False
move_left = False
move_right = False
print('上')
c = pygame.K_DOWN
if event.key == pygame.K_RIGHT and event.key!=c:
move_up = False
move_down = False
move_left = False
move_right = True
print('右')
c = pygame.K_LEFT
if event.key == pygame.K_LEFT and event.key!=c:
move_up = False
move_down = False
move_left = True
move_right = False
print('左')
c = pygame.K_RIGHT
if event.key == pygame.K_DOWN and event.key!=c:
move_up = False
move_down = True
move_left = False
move_right = False
print('下')
c = pygame.K_UP
# 如果吃掉自己
head_rect = snake_rect[0]
count = len(snake_rect)
while count > 1:
if head_rect.colliderect(snake_rect[count - 1]):
run = False
count -= 1
while run == -1:
screen.fill([0,0,0])
screen.blit(game_font1.render(u'Game Over' % score, True, [255, 255, 255]), [200, 200])
screen.blit(game_font1.render(u'您的得分:%d' % score, True, [255, 255, 255]), [400, 400]) #显示结算界面
#结算界面暂时出现问题,尚未解决
pygame.display.update()#刷新显示内容
#结束·
## 3. 实验过程中遇到的问题和解决过程
-问题1:用pip安装python失败,显示pip不是内部和外部指令
- 问题1解决方案:在python/script/中找到pip,修改指令的路径
- 问题2:蛇每次碰到食物就会报错
- 问题2解决方案:每次碰到食物后刷新食物位置,蛇长度+1
-问题3:无法显示结算界面
-问题3解决方案:询问同学,暂未解决
## 其他(感悟、思考等)
一学期的python课程已经结束,我对python也有了大概的认识,但这只是一些皮毛,需要学习的知识还有很多。python的学习只能说是 “ 师傅领进门,修行靠个人。” 自学是非常重要的,但重要的还是要感
谢老师的引领。
回顾这学期学到的知识,元组,集合,列表,字典,封装,继承,多态,爬虫等等,不同于c语言,python真的很神奇,它非常灵活而简洁,如果能够学好python,对于以后的生活与工作一定有很大的帮助。
这次实验中,我第一次用编程的方式做出了一个游戏,虽然只是贪吃蛇这种小游戏,而且参考了许多资料,但我也学到了很多新的东西,如何使用pygame,collide函数,创建窗口,绘制图形,让图形动起
来等等,看见自己屏幕上的蛇动起来,逐渐变长,我内心的喜悦是无法描述的。虽然这次的程序还是有些瑕疵,但希望以后能够通过学习,做出更有意思的游戏或者其他小程序。
最后,正如王老师第一节课讲的:“人生苦短,我用python”,希望python的学习能成为我人生记忆中精彩的一笔。
- 云班课pygame相关内容
实验四
课程:《Python程序设计》
班级: 2031
姓名: 尹宗颐
学号: 20203121
实验教师:王志强
必修/选修: 公选课
#1.实验内容
- Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
我做的是游戏普普通通的 贪吃蛇
## 2. 实验过程及结果
1.
此前已经安装过一遍,忘记截图,此时显示已经安装过
2.
导入函数,检测版本,确定导入成功
3.
进行初始化设置
4.
开始游戏,编写标题,得分,设置背景颜色和网格,设置帧率fps并利用fps控制蛇的移速,然后随机位置刷新食物
利用collidepoint进行碰撞检测,模拟出吃掉食物的效果,并增加分数和蛇的速度
设置蛇的移动方向
从键盘获取输入,控制蛇进行移动,并且限制不能向后移动,防止因此直接死亡
5.
失败条件判定:撞到自己
6.
失败后显示结算界面,但出现问题,结算界面未显示便直接结束程序,尚未解决
码云: https://gitee.com/besti2021python/yzy20203121/blob/master/game.py
代码:
import pygame
import random
import copy
#初始方向
move_up = False
move_down = False
move_left = False
move_right = True
#初始化
pygame.init()
clock = pygame.time.Clock() #设置游戏时钟
screen = pygame.display.set_mode((800, 600)) #窗口大小
snake_list =[[10, 10]]#蛇的初始位置
food_point = [random.randint(10, 490),random.randint(10, 490)]#食物位置
#字体设置
font1 = pygame.font.SysFont('宋体', 16, True)
font_list = pygame.font.get_fonts()
game_font = pygame.font.SysFont('宋体', 16, True)
game_font1 = pygame.font.SysFont('宋体', 36, True)
#参数设置
num = -1
score = 0
a=10
b=0
c=move_left
#开始游戏
run = True
while run:
pygame.display.update()
pygame.display.set_caption("贪吃蛇 当前得分:%d " % score ) #编写标题与得分
clock.tick(a)#设置游戏fps,并利用fps控制蛇的速度
screen.fill([255, 255, 255])#
#绘制背景网格
for x in range(0,801,10):
pygame.draw.line(screen,(195,197,199),(x,0),(x,800),1)
pygame.draw.line(screen, (195, 197, 199), (0, x), (800, x), 1)
if b ==0:
food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)#显示食物
if b ==1:
food_rect = pygame.draw.circle(screen,[0,255,255],food_point,20,0)#显示食物
snake_rect = []
for pos in snake_list:
snake_rect.append(pygame.draw.circle(screen,[255,0,0],pos,5,0))
#吃掉食物
if food_rect.collidepoint(pos):
snake_list.append(food_point)
if num % 5 ==4 :
food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生成食物位置
food_rect = pygame.draw.circle(screen, [0 , 255, 255], food_point, 20, 0)# 显示食物
score += 1
num += 1
a += 2
b = 1
break
if num % 5 == 0:
score += 5
food_point = [random.randint(10,790),random.randint(10,590)]# 重新生成食物位置
food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10,0) # 显示食物
num +=1
a += 2
b = 0
break
else:
food_point = [random.randint(10, 790), random.randint(10, 590)]# 重新生食物位置
food_rect = pygame.draw.circle(screen, [255, 0, 0], food_point, 10, 0)# 显示食物
score += 1
num +=1
a += 2
b = 0
break
# 移动
pos = len(snake_list) - 1
while pos > 0:
snake_list[pos] = copy.deepcopy(snake_list[pos - 1])
pos -= 1
if move_right:
snake_list[pos][0] += 10
if snake_list[pos][0] > 800:
snake_list[pos][0] = 0
if move_left:
snake_list[pos][0] -= 10
if snake_list[pos][0] < 0:
snake_list[pos][0] = 800
if move_up:
snake_list[pos][1] -= 10
if snake_list[pos][1] < 0:
snake_list[pos][1] = 600
if move_down:
snake_list[pos][1] += 10
if snake_list[pos][1] > 600:
snake_list[pos][1] = 0
#位置移动
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP and event.key!=c:
move_up = True
move_down = False
move_left = False
move_right = False
print('上')
c = pygame.K_DOWN
if event.key == pygame.K_RIGHT and event.key!=c:
move_up = False
move_down = False
move_left = False
move_right = True
print('右')
c = pygame.K_LEFT
if event.key == pygame.K_LEFT and event.key!=c:
move_up = False
move_down = False
move_left = True
move_right = False
print('左')
c = pygame.K_RIGHT
if event.key == pygame.K_DOWN and event.key!=c:
move_up = False
move_down = True
move_left = False
move_right = False
print('下')
c = pygame.K_UP
# 如果吃掉自己
head_rect = snake_rect[0]
count = len(snake_rect)
while count > 1:
if head_rect.colliderect(snake_rect[count - 1]):
run = False
count -= 1
while run == -1:
screen.fill([0,0,0])
screen.blit(game_font1.render(u'Game Over' % score, True, [255, 255, 255]), [200, 200])
screen.blit(game_font1.render(u'您的得分:%d' % score, True, [255, 255, 255]), [400, 400]) #显示结算界面
#结算界面暂时出现问题,尚未解决
pygame.display.update()#刷新显示内容
#结束·
## 3. 实验过程中遇到的问题和解决过程
-问题1:用pip安装python失败,显示pip不是内部和外部指令
- 问题1解决方案:在python/script/中找到pip,修改指令的路径
- 问题2:蛇每次碰到食物就会报错
- 问题2解决方案:每次碰到食物后刷新食物位置,蛇长度+1
-问题3:无法显示结算界面
-问题3解决方案:询问同学,暂未解决
## 其他(感悟、思考等)
一学期的python课程已经结束,我对python也有了大概的认识,但这只是一些皮毛,需要学习的知识还有很多。python的学习只能说是 “ 师傅领进门,修行靠个人。” 自学是非常重要的,但重要的还是要感
谢老师的引领。
回顾这学期学到的知识,元组,集合,列表,字典,封装,继承,多态,爬虫等等,不同于c语言,python真的很神奇,它非常灵活而简洁,如果能够学好python,对于以后的生活与工作一定有很大的帮助。
这次实验中,我第一次用编程的方式做出了一个游戏,虽然只是贪吃蛇这种小游戏,而且参考了许多资料,但我也学到了很多新的东西,如何使用pygame,collide函数,创建窗口,绘制图形,让图形动起
来等等,看见自己屏幕上的蛇动起来,逐渐变长,我内心的喜悦是无法描述的。虽然这次的程序还是有些瑕疵,但希望以后能够通过学习,做出更有意思的游戏或者其他小程序。
最后,正如王老师第一节课讲的:“人生苦短,我用python”,希望python的学习能成为我人生记忆中精彩的一笔。
参考资料
- 云班课pygame相关内容