贪吃蛇源码百度网盘链接:
https://pan.baidu.com/s/1DIWYPRLWnGDk6Nt9bliFbQ
代码分析:
一、先想好总体的步骤
1.弄一个显示窗口出来,设置帧频 #帧频可以调节蛇走的速度
2.蛇头,蛇身,食物,把游戏循环搞出来
3.在窗口上把蛇和食物显示出来
4.让蛇动起来,检测键盘输入来控制蛇
5.检测game over
二、开始完善
1.先按着步骤少写点,用到什么就顺手创建
开始的基本框架代码如下:
#初始框架
import pygame
#初始化
pygame.init()
#游戏画面有多大 宽W高H
W=800
H=600
#格子有6行8列 W/COL就是格子的宽度 H/ROW就是格子的高度
ROW=60 #100
COL=80 #100
size=(W,H)
window=pygame.display.set_mode(size)
#display 显示模块
pygame.display.set_caption('贪吃蛇')
#游戏循环
quit=True
# 创建时钟对象 (可以控制游戏循环频率)
clock=pygame.time.Clock()
while quit:
#处理事件
for event in pygame.event.get():
#QUIT是pygame中的退出模块
if event.type == pygame.QUIT:
qiut=False
#移动
#渲染————画出来
#三个参数 (往哪里画,(颜色),(起始位,终止位))
pygame.draw.rect(window,(255,255,255),(0,0,W,H))
#用display中的flip把控制权交给系统
pygame.display.flip()
#设置帧频
clock.tick(20)
为显示窗口做一些必要的定义设置,在窗口显示就用draw,设置帧频要用到flip(),我注释的也够详细,这时也可以运行一下看看有没有窗口闪了一下出来
2.设置蛇头,蛇身,食物的坐标以及它们各自的颜色,游戏循环让窗口停留不再一闪而过,用pygame.QUIT 可以通过鼠标点右上角的❌关闭窗口,可以看到用draw画出来的白色背景了。
代码如下:
因为涉及到重复的调用,先简单定义一个Point备用,copy这里可以先不写,下面用到的时候再回来补上
class Point():
row=0
col=0
def __init__(self,row,col):
self.row=row
self.col=col
def copy(self):
return Point(row=self.row,col=self.col)
head蛇头,snakes蛇身
head=Point(row=int(ROW/2),col=int(COL/2))
head_color=(0,128,128)
snakes=[Point(row=head.row,col=head.col+1),
Point(row=head.row,col=head.col+2),
Point(row=head.row,col=head.col+3)]
snake_color=(200,200,200)
食物位置要随机变化,这一步可以先写个不动的食物用来过渡
food=Point(row=22,col=22)
#food=gen_food()
food_color=(255,255,0)
把注释掉的print(event)先放出来,运行然后依次按上下左右键wasd键,可以看到key的值,方便下一步操作
#游戏循环
clock=pygame.time.Clock()
quit=True
while quit:
for event in pygame.event.get():
if event.type==pygame.QUIT:
quit=False
elif event.type==pygame.KEYDOWN:
#print(event)
3.这里可以渲染出来蛇头和食物了,两步搞定
def rect(Point,color):
cell_width=W/COL
cell_height=H/ROW
left=Point.row*cell_width
top=Point.col*cell_height
pygame.draw.rect(window,color,(left,top,cell_width,cell_height))
rect(head,head_color)
rect(food,food_color)
for snake in snakes:
rect(snake,snake_color)#蛇身是列表,直接遍历取出渲染
让蛇头带着身子移动,让食物随机生成,把上下左右键盘控制完善
移动起来
direct先设定默认值为’left’
#移动
if direct=='left':
head.row-=1
elif direct=='right':
head.row+=1
elif direct=='up':
head.col-=1
elif direct=='down':
head.col+=1
食物随机出现,并检测蛇头是否和食物坐标重合
def gen_food():
while 1:
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
蛇吃食物后生成下一个食物,不吃食物就删除最后一节身子,吃食物不删除最后一节身子,反向思维,蛇头带着身子移动直接直接用上面的copy方法,简单的一句话
eat=(head.row==food.row and head.col==food.col)
if eat:
food=gen_food()
snakes.insert(0,head.copy())
if not eat:
snakes.pop()
完善键盘控制,让键盘可以操作蛇的移动,这一步早写晚写都不影响逻辑,其实可以在上面QUIT时直接完善,代码如下:
elif event.type==pygame.KEYDOWN:
#print(event)
if event.key==273 or event.key==119:
if direct=='left' or direct=='right':
direct='up'
elif event.key==274 or event.key==115:
if direct=='left' or direct=='right':
direct='down'
elif event.key==276 or event.key==97:
if direct=='up' or direct=='down':
direct='left'
elif event.key==275 or event.key==100:
if direct=='up' or direct=='down':
direct='right'
5.这时候的游戏基本已经做完了,检测一下何时需要game over
#检测
dead=False
#1.撞墙
if head.col<0 or head.row<0 or head.col>=COL or head.row>=ROW:
dead=True
#2.撞自己
for snake in snakes:
if head.col==snake.col and head.row==snake.row:
dead=True
break
if dead:
print('死了')
quit=False
完成