Pygame贪吃蛇游戏

贪吃蛇游戏

在用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() #退出游戏

游戏部分截图如下:

通过第一关(成功吃掉三个食物)
Pygame贪吃蛇游戏_第1张图片

你可能感兴趣的:(Python学习,pygame,游戏,python)