在用pygame创作贪吃蛇游戏时需要使用到图形绘画,文字绘画,窗口绘制 等知识,我们还需要不同颜色来表达蛇本身与食物,这里用绿色代表蛇,红色代表食物,蓝色用于提示文字,黑色作为整体背景色
1.引入pygame游戏外部库
2.引入random随机数库用于随机生成食物位置
3.初始化游戏窗口
import pygame
import random
# 游戏初始化
pygame.init()
# 游戏窗口大小
window_width = 800
window_height = 600
# 设置游戏窗口
window = pygame.display.set_mode((window_width, window_height))
pygame.display.set_caption('贪吃蛇')
1.颜色值
2.初始蛇头坐标
3.蛇身列表
4.初始随机食物坐标
5.初始方向
6.初始关卡与关卡游戏次数
7.单次移动像素
8.FPS 帧数 控制游戏速度
9.绘制文字字体,这里需要提前准备好字体文件放在代码同一文件夹下
10.游戏运行标志
# 颜色定义
white = (255, 255, 255)
black = (0, 0, 0)
red = (255, 0, 0)
green = (0, 255, 0)
blue =(0, 0, 255)
# 蛇头初始坐标 屏幕中间
snake_x = window_width / 2
snake_y = window_height / 2
# 蛇身列表
snake_body = [[snake_x, snake_y]]
# 食物坐标
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
# 得分
score=0
#初始方向
direction='LEFT'
#关数
Step = 1
# 当前关 使用次数
Step_num=1
# 单次移动像素
snake_speed=20
# FPS 移动速度
game_fps=5
#FPS FPS
clock = pygame.time.Clock()
#初始化字体 后续给来绘制提示文字
font = pygame.font.Font("simsun.ttc", 28)
def showText(font,text):
surf = font.render(text, True, blue)
window.blit(surf, (20, 100))
pygame.display.update()
#游戏结束标志
game_over=False
游戏主体部分应该分为游戏按键控制部分代码如下:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
direction ='LEFT'
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
direction = 'RIGHT'
elif event.key == pygame.K_UP or event.key == pygame.K_w:
direction = 'UP'
elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
direction = 'DOWN'
if direction == 'LEFT':
snake_x -= snake_speed #左 X值减少
elif direction == 'RIGHT':
snake_x += snake_speed #右 X值增加
elif direction == 'UP':
snake_y -= snake_speed #上 Y值减少
elif direction == 'DOWN':
snake_y += snake_speed #下 Y值增加
蛇身与食物绘制代码:
# 绘制背景
window.fill(black)
# 绘制蛇身
for segment in snake_body:
pygame.draw.rect(window, green, [segment[0], segment[1], 20, 20])
# 绘制食物
pygame.draw.rect(window, red, [food_x, food_y, 20, 20])
# 更新蛇身
snake_head = [snake_x, snake_y]
snake_body.append(snake_head)
if len(snake_body) > score + 1:
del snake_body[0]
游戏碰撞检测代码:
# 检测蛇与食物的碰撞
if snake_x == food_x and snake_y == food_y:
score += 1
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
# 检测蛇头与蛇身的碰撞
for segment in snake_body[:-1]:
if segment == snake_head:
game_over = True
# 检测蛇是否超出边界
if snake_x >= window_width or snake_x < 0 or snake_y >= window_height or snake_y < 0:
game_over = True
# 刷新游戏窗口
pygame.display.update()
# 控制游戏帧率
clock.tick(game_fps)
通过一关进入下关代码(如果10关都通过了判断通关):
#本关胜利 进入下关
if score>=3:
if Step>=10: #通过10关整个游戏通关
game_over = True
showText(font,"第"+str(Step)+"关挑战成功,使用"+str(Step_num)+"次,祝贺您完成通关!")
else :
#绘制文字 提示成功通关 进入下一关:
showText(font,"第"+str(Step)+"关挑战成功,使用"+str(Step_num)+"次,按空格键继续下一关:")
NoReStart=True
while NoReStart:
#判断是否继续:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
NoReStart=False
Step += 1
Step_num=1
# 蛇头坐标
snake_x = window_width / 2
snake_y = window_height / 2
# 蛇身列表
snake_body = [[snake_x, snake_y]]
# 食物坐标
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
score=0
game_fps += 3
如果游戏失败或者整体通关 游戏结束(如果关卡小于10可以重玩本关):
if game_over :
if Step<10 :
#下面三行绘制提示文字
showText(font,"游戏结束,按ENTER键退出,按空格键继续本关")
NoReStart=True
while NoReStart:
#判断是否继续:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
NoReStart=False
game_over=False
score=0
# 蛇头坐标
snake_x = window_width / 2
snake_y = window_height / 2
# 蛇身列表
snake_body = [[snake_x, snake_y]]
# 食物坐标
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
#print("继续")
Step_num += 1
break
elif event.key == pygame.K_RETURN:
NoReStart=False
print("不继续结束")
else:
#下面三行绘制提示文字
showText(font,"游戏结束,第"+str(Step)+"关挑战成功,使用"+str(Step_num)+"次,\n您已经完成通关,按ENTER键退出")
NoReStart=True
while NoReStart:
#判断是否继续:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
NoReStart=False
print("不继续结束")
游戏主体全部代码:
# 游戏循环
while not game_over:
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_over = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or event.key == pygame.K_a:
direction ='LEFT'
elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
direction = 'RIGHT'
elif event.key == pygame.K_UP or event.key == pygame.K_w:
direction = 'UP'
elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
direction = 'DOWN'
if direction == 'LEFT':
snake_x -= snake_speed #左 X值减少
elif direction == 'RIGHT':
snake_x += snake_speed #右 X值增加
elif direction == 'UP':
snake_y -= snake_speed #上 Y值减少
elif direction == 'DOWN':
snake_y += snake_speed #下 Y值增加
# 绘制背景
window.fill(black)
# 绘制蛇身
for segment in snake_body:
pygame.draw.rect(window, green, [segment[0], segment[1], 20, 20])
# 绘制食物
pygame.draw.rect(window, red, [food_x, food_y, 20, 20])
# 更新蛇身
snake_head = [snake_x, snake_y]
snake_body.append(snake_head)
if len(snake_body) > score + 1:
del snake_body[0]
# 检测蛇与食物的碰撞
if snake_x == food_x and snake_y == food_y:
score += 1
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
# 检测蛇头与蛇身的碰撞
for segment in snake_body[:-1]:
if segment == snake_head:
game_over = True
# 检测蛇是否超出边界
if snake_x >= window_width or snake_x < 0 or snake_y >= window_height or snake_y < 0:
game_over = True
# 刷新游戏窗口
pygame.display.update()
# 控制游戏帧率
clock.tick(game_fps)
#本关胜利 进入下关
if score>=3:
if Step>=10: #通过10关整个游戏通关
game_over = True
#showText(font,"第"+str(Step)+"关挑战成功,使用"+str(Step_num)+"次,祝贺您完成通关!")
else :
#绘制文字 提示成功通关 进入下一关:
showText(font,"第"+str(Step)+"关挑战成功,使用"+str(Step_num)+"次,按空格键继续下一关:")
NoReStart=True
while NoReStart:
#判断是否继续:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
NoReStart=False
Step += 1
Step_num=1
# 蛇头坐标
snake_x = window_width / 2
snake_y = window_height / 2
# 蛇身列表
snake_body = [[snake_x, snake_y]]
# 食物坐标
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
score=0
game_fps += 3
if game_over :
if Step<10 :
#下面三行绘制提示文字
showText(font,"游戏结束,按ENTER键退出,按空格键继续本关")
NoReStart=True
while NoReStart:
#判断是否继续:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
NoReStart=False
game_over=False
score=0
# 蛇头坐标
snake_x = window_width / 2
snake_y = window_height / 2
# 蛇身列表
snake_body = [[snake_x, snake_y]]
# 食物坐标
food_x = round(random.randrange(0, window_width - 20) / 20) * 20
food_y = round(random.randrange(0, window_height - 20) / 20) * 20
#print("继续")
Step_num += 1
break
elif event.key == pygame.K_RETURN:
NoReStart=False
print("不继续结束")
else:
#下面三行绘制提示文字
showText(font,"游戏结束,第"+str(Step)+"关挑战成功,使用"+str(Step_num)+"次,\n您已经完成通关,按ENTER键退出")
NoReStart=True
while NoReStart:
#判断是否继续:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RETURN:
NoReStart=False
print("不继续结束")
#循环结束
pygame.quit() #退出游戏