python做贪吃蛇代码 python贪吃蛇代码看不懂_帧频


贪吃蛇源码百度网盘链接:

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

完成