![aa4bca57aade9a0166175b6343189897.png](https://i-blog.csdnimg.cn/blog_migrate/250459b54c660d653ed58ccafad845f8.jpeg)
![52a963175782376a7e0c77ed603e1d3d.gif](https://i-blog.csdnimg.cn/blog_migrate/25a9eaf6a07005fbdb0a49c6ee2cc26c.gif)
今天我们用python和python的工具包pygame来编写一个贪吃蛇的小游戏
贪吃蛇游戏功能介绍
贪吃蛇的游戏规则如下:
通过上下左右键或者WASD键来移动蛇来,让它吃到食物,每吃到食物,蛇的长度变长,并获得分数。若蛇碰到游戏边际
或者自身,则蛇死亡,游戏结束。
游戏设计思路
根据游戏规则,我们需要:
1.初始化游戏环境。
2.初始化蛇、食物
3.监听键盘动作
4.蛇的运动,吃食物,是否死亡
5.该局游戏结束,是否还有再玩。
其中的难点在于如何在屏幕上展示蛇的运动,其实我们肉眼所见的蛇的运动并不是真实的,而是在后台通过刷新蛇的坐标而实现的。即可以创建一个蛇的坐标列表,每移动一次,则新的坐标加入,同时删除末尾坐标,看起来像是蛇的在移动。
一个简单地设计框图如下:
![51d97938191cd2a870fbf43a02562e07.png](https://i-blog.csdnimg.cn/blog_migrate/803b9c265d2aba2e04ec8dfc112ad994.jpeg)
代码实现
'''
my_snake.py
@author HelloWorld!
@time:2019.10.27
'''
import random
import pygame
import sys
from pygame.locals import *
windows_width=800 #游戏窗口的大小,原点在左上角
windows_height=600
cell_size=20 #snake 的大小,需被窗口长宽整除
#一些颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
gray = (230, 230, 230)
dark_gray = (40, 40, 40)
DARKGreen = (0, 155, 0)
Green = (0, 255, 0)
Red = (255, 0, 0)
blue = (0, 0, 255)
dark_blue =(0,0, 139)
BG_COLOR = (184,224,217)
#贪吃蛇的地图尺寸
map_width = int(windows_width / cell_size)
map_height = int(windows_height / cell_size)
#蛇的移动速度
snake_speed=5
#方向定义
UP = 1
DOWN = 2
LEFT = 3
RIGHT = 4
#主函数
def main_game():
pygame.init() #初始化gygame
screen=pygame.display.set_mode((windows_width,windows_height))
pygame.display.set_caption("贪吃蛇游戏")
snake_speed_clock = pygame.time.Clock() # 创建Pygame时钟对象
screen.fill(white)
while True:
run_game(screen,snake_speed_clock) #游戏主体
gameover(screen) #游戏结束
def run_game(screen,snake_speed_clock):
#初始化蛇的位置,方向,食物的位置
start_x=random.randint(3,map_width-8)
start_y=random.randint(3,map_width-8)
snake_coords=[{'x':start_x,'y':start_y},{'x':start_x-1,'y':start_y},{'x':start_x-2,'y':start_y}]#初始化snake,也可以用列表的的列表
direction = RIGHT
food=get_random_location()
#循环
while True:
for event in pygame.event.get(): #键盘事件监听
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif event.type == pygame.KEYDOWN: #按键事件
if (event.key==K_LEFT or event.key==K_a) and direction!=RIGHT:
direction=LEFT
elif (event.key==K_RIGHT or event.key==K_d) and direction!=LEFT:
direction=RIGHT
elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
direction = UP
elif (event.key == K_DOWN or event.key == K_s) and direction