一、实验环境
python3.8,pycharm 需要的库:pygame,random 需要下载64位对应python37版本的pygame网址pypi.org/project/Pyg… 这里贴个安装方法。blog.csdn.net/weixin_4067…对代码的解释我都写在代码里了,可以深刻的进行理解!
二、实现思路:
1.设计表格 2.设计蛇的,食物的位置 3.处理吃食物后位置变化 4.对画面进行渲染 5.处理事务(移动) 6.结束显示
下面我分布把代码部分列出,最后有总源码
1.设计表格
#定义一个坐标类,可以调用里面的方法获取坐标位置 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) #导入两个模块,pygame和random,一个是游戏库一个是随机数库 import pygame import random #初始化 pygame.init() #建立长度为800,宽为600的游戏框 W=800 H=600 #把长度为800,宽为600的游戏框,划分为表格,20*20的表格 ROW=30 COL=40 #设置一个变量 size=(W,H) #调用pygame方法让游戏框出来 window=pygame.display.set_mode(size) #设置游戏框的名字,调用pygame中的方法进行更改 pygame.display.set_caption('贪吃蛇') #到这一步可以看到游戏框已经出来了 #定义背景颜色,蛇头的颜色,蛇的颜色 bg_color=(255,255,255) snake_color=(200,200,200) head_color=(0,128,128) #头的位置 head=Point(row=int(ROW/2), col=int(COL/2)) #蛇的位置 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) ]
2.设计蛇的,食物的位置
#食物 def gen_food(): while 1: pos=Point(row=random.randint(0,ROW), col=random.randint(0,COL)) # is_coll=False #是否跟蛇碰上了 if head.row==pos.row and head.col==pos.col: is_coll=True #蛇身子 if not is_coll: break return pos food=gen_food() food_color=(255,255,0)
3.对画面进行渲染
'''把坐标图形化''' #默认蛇的方向 direct='left' #left,right,up,down #把蛇画出来 def rect(point, color): cell_width=W/COL cell_height=H/ROW left=point.col*cell_width top=point.row*cell_height pygame.draw.rect( window, color, (left, top, cell_width, cell_height) )
4.处理事务
#处理事件 quit=True clock=pygame.time.Clock() while quit: #处理事件 for event in pygame.event.get(): if event.type==pygame.QUIT: quit=False elif event.type==pygame.KEYDOWN: 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' #吃东西 eat=(head.row==food.row and head.col==food.col) #重新产生食物 if eat: food = gen_food() #处理身子 #1.把原来的头,插入到snakes的头上 snakes.insert(0, head.copy()) #2.把snakes的最后一个删掉 if not eat: snakes.pop() #移动 if direct=='left': head.col-=1 elif direct=='right': head.col+=1 elif direct=='up': head.row-=1 elif direct=='down': head.row+=1
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 #画背景 pygame.draw.rect(window, bg_color, (0,0,W,H)) #蛇头 for snake in snakes: rect(snake, snake_color) rect(head, head_color) rect(food, food_color) pygame.display.flip() #设置帧频,也就是速度 clock.tick(10)
OK,恭喜你已经理解了贪吃蛇怎么设计的!
6.源码
#定义一个坐标类,可以调用里面的方法获取坐标位置 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) #导入两个模块,pygame和random,一个是游戏库一个是随机数库 import pygame import random #初始化 pygame.init() #建立长度为800,宽为600的游戏框 W=800 H=600 #把长度为800,宽为600的游戏框,划分为表格,20*20的表格 ROW=30 COL=40 #设置一个变量 size=(W,H) #调用pygame方法让游戏框出来 window=pygame.display.set_mode(size) #设置游戏框的名字,调用pygame中的方法进行更改 pygame.display.set_caption('贪吃蛇') #到这一步可以看到游戏框已经出来了 #定义背景颜色,蛇头的颜色,蛇的颜色 bg_color=(255,255,255) snake_color=(200,200,200) head_color=(0,128,128) #头的位置 head=Point(row=int(ROW/2), col=int(COL/2)) #蛇的位置 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) ] #食物 def gen_food(): while 1: pos=Point(row=random.randint(0,ROW), col=random.randint(0,COL)) # is_coll=False #是否跟蛇碰上了 if head.row==pos.row and head.col==pos.col: is_coll=True #蛇身子 if not is_coll: break return pos food=gen_food() food_color=(255,255,0) '''把坐标图形化''' #默认蛇的方向 direct='left' #left,right,up,down #把蛇画出来 def rect(point, color): cell_width=W/COL cell_height=H/ROW left=point.col*cell_width top=point.row*cell_height pygame.draw.rect( window, color, (left, top, cell_width, cell_height) ) #处理事件 quit=True clock=pygame.time.Clock() while quit: #处理事件 for event in pygame.event.get(): if event.type==pygame.QUIT: quit=False elif event.type==pygame.KEYDOWN: 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' #吃东西 eat=(head.row==food.row and head.col==food.col) #重新产生食物 if eat: food = gen_food() #处理身子 #1.把原来的头,插入到snakes的头上 snakes.insert(0, head.copy()) #2.把snakes的最后一个删掉 if not eat: snakes.pop() #移动 if direct=='left': head.col-=1 elif direct=='right': head.col+=1 elif direct=='up': head.row-=1 elif direct=='down': head.row+=1 #游戏结束 #检测 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 #画背景 pygame.draw.rect(window, bg_color, (0,0,W,H)) #蛇头 for snake in snakes: rect(snake, snake_color) rect(head, head_color) rect(food, food_color) pygame.display.flip() #设置帧频,也就是速度 clock.tick(10)