《Python程序设计》实验四报告

课程:《Python程序设计》

班级: 1923班

姓名: 金一非

学号: 20192309

实验教师:王志强

实验日期:2020年6月11日

必修/选修: 公选课

1.实验内容

Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等;

经过选择,我选择了编写一个游戏,为贪吃蛇。

2. 实验过程及结果

贪吃蛇主要是通过完成吃食物,吃到食物变长,得分增加,食物再次随机出现。直到蛇碰到边界或接触到自己的身体时,代表着游戏的结束。

首先导入pygame库和初始化并设置设置窗口大小以及标题

Python贪吃蛇游戏毕业设计 python贪吃蛇课程设计报告_解决方案


这时已经成功绘制出一个游戏窗口,接下来就要完成对游戏的编写

首先绘制蛇

我们让蛇头的大小正好占据一个格子的大小,设置蛇头颜色为白色。

head_color = (0,0,0)

绘制网格的时候,也计算了每个格子的宽度和高度,我们将计算格子的宽度和高度的代码放到函数外面,这样绘制蛇的时候也可以用到。

网格的宽度和高度:

cell_width = width/COL

cell_height = height/ROW

绘制蛇的时候,我们需要记录蛇头所在格子的位置,即格子处在第几行第几列。我们新建一个类来存储蛇头所在的行列信息。

class Point:

row = 0

col = 0

def init(self,row,col):

self.row = row

self.col = col

实例化一个蛇头对象

head = Point(row = ROW/2,col = COL/2)

第二步实现了对蛇头的绘制与蛇头的移动

Python贪吃蛇游戏毕业设计 python贪吃蛇课程设计报告_贪吃蛇Python毕业论文_02


Python贪吃蛇游戏毕业设计 python贪吃蛇课程设计报告_Python_03


Python贪吃蛇游戏毕业设计 python贪吃蛇课程设计报告_贪吃蛇_04


第三步绘制食物,并计算得分

生成食物的颜色

food_color = (255,0,0)

记录随机生成食物的位置(行列):
pos = Point(row = random.randint(0,ROW-1),col = random.randint(0,COL-1))
判断是否和蛇头碰撞:
是否撞到标志布尔值
is_coll = False
是否跟蛇碰上了
if head.row == pos.row and head.col == pos.col:
is_coll = True
定义一个函数来处理生成食物及判断是否和蛇碰上的代码:
生成食物
def create_food():
while True:
pos = Point(row = random.randint(0,ROW-1),col = random.randint(0,COL-1))
是否撞到标志布尔值
is_coll = False
是否跟蛇碰上了
if head.row == pos.row and head.col == pos.col:
is_coll = True

if not is_coll:
        break
return pos

food = create_food()
调用draw_rect()方法,在屏幕上绘制食物:

draw_rect(food,food_color)

吃到食物:
如果蛇头所在行和列等于食物所在的行和列的时候,就是吃到食物了,食物消失,得分增加1分。

吃东西
eat = (head.row == food.row and head.col == food.col)

if eat:
    food  = create_food()
    point += 1

显示得分:

设置显示文字的字体和大小

显示文字

font = pygame.font.SysFont("simhei",24)

设置显示的位置及绘制在屏幕上

显示得分

score_text = "得分:" + str(point)
score = font.render(score_text,True,(0,0,0))
score_rect = score.get_rect()
score_rect.centerx = screen.get_rect().centerx
score_rect.y = 10
screen.blit(score,score_rect)

记录原来蛇头的位置:

在Point类中增加一个copy()方法,返回的是蛇头原来的位置。

def copy(self):
return Point(row = self.row,col = self.col)

修改create_food()方法避免食物出现在蛇身体上

需要判断蛇身体的每一段的行和列是否和食物的行和列相同,如果相同,则代表相撞了,需要重新生成食物。

蛇的身子是否碰到食物

for snake in snakes:
if  snake.row == pos.row and snake.col == pos.col:
is_coll = True
break

这样一个贪吃蛇就完成了

Python贪吃蛇游戏毕业设计 python贪吃蛇课程设计报告_贪吃蛇Python毕业论文_05


Python贪吃蛇游戏毕业设计 python贪吃蛇课程设计报告_解决方案_06

代码链接:
https://gitee.com/python_programming/jinyifei20192309

  1. 实验过程中遇到的问题和解决过程
    问题一:如何移动蛇?
    解决方案:查找资料发现可以利用蛇方向的改变,通过增加行,列数来进行蛇的移动
    问题二:如何对蛇的身体加长
    解决方案:使用copy()方法对蛇头的位置进行复制,处理蛇的身体,将蛇的头的位置插入到蛇身体列表的第0位。如果蛇没有吃到食物,蛇的身体就不要增加,那么列表中原来的末尾位置就需要移除。如果蛇吃到了食物,本身蛇的身体就需要增加,所以就不要移除末尾的位置。顺便说一句CSDN永远滴神!
  2. 感悟与思考
    通过对贪吃蛇游戏的编程,发现即使一个小小的游戏里面所蕴含的编程的知识是巨大的,且发现游戏虽小,但你要考虑到的情况却一点也不能少,需要你静下心来认真分析情况,对各个情况进行测验。通过编程,感觉到锻炼了自己的逻辑思维,让自己更加严谨了。

    ---《Python编程:从入门到实践》