用Python编写贪吃蛇游戏


1、 项目概述

1.1 项目目标和主要内容

实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点,得分增加,“蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。

1.2 项目的主要功能

实现贪吃蛇游戏基本功能

2、 项目设计

2.1项目总体框架

创建游戏界面
定义游戏结束函数
定义主函数
进行游戏主循环(检测按键进行转弯操作)
判断是否吃掉目标方块,进行增加蛇的长度操作
控制游戏速度

2.2 关键算法分析

贪吃蛇关键算法在于判断贪吃蛇是否吃到了食物以及吃到食物后身体长度的变化。

无论蛇是否吃到了食物,身体都要发生变化,伪代码分析如下:
if 蛇头位置==食物位置
蛇吃到食物

if 蛇没有吃到食物:
移动方向的一个格子添加到蛇首部,尾部去掉
else 蛇吃到食物:
移动方向的一个格子添加到蛇首部

3、设计步骤

3.1导入模块

import pygame
import sys
import random
import time
from pygame.locals import *
说明:用python编写游戏可以导入python专门用于游戏开发的pygame模块,该模块需要自行安装。

random模块用于随机生成食物
time模块用于设计时间

3.2定义颜色变量

定义一些接下来编写蛇身,食物等需要的颜色变量。
black_colour = pygame.Color(28, 56, 20)
white_colour = pygame.Color(255, 255, 255)
red_colour = pygame.Color(255, 34, 20)
grey_colour = pygame.Color(150, 150, 150)

3.3定义游戏结束函数

游戏结束则退出游戏界面
def gameover(gamesurface):
    # 设置提示字体的格式
    gameover_font = pygame.font.SysFont("MicrosoftYaHei", 16)
    # 设置提示字体的颜色
    gameover_colour = gameover_font.render('GameOver', True, grey_colour)  # 只能英文
    # 设置提示位置
    gameover_location = gameover_colour.get_rect()
    gameover_location.midtop = (310, 200)
    # 绑定以上设置到句柄
    gamesurface.blit(gameover_colour, gameover_location)
    # 提示运行信息
    pygame.display.flip()
    # 休眠5秒
    time.sleep(5)
    # 退出游戏
    pygame.quit()
    # 退出程序
    sys.exit()

3.4定义主函数

# 定义主函数
def main():
    # 初始化pygame,为使用硬件做准备
    pygame.init()
    pygame.time.Clock()
    ftpsClock = pygame.time.Clock()
    # 创建一个窗口
    # 设置窗口尺寸
    gamesurface = pygame.display.set_mode((640, 480))
    # 设置窗口的标题
    # pygame官方文档中的解释:If the display has a window title, this function will change the name on the window.
    pygame.display.set_caption('贪吃蛇')
    # 初始化变量
    # 初始化贪吃蛇的起始位置,贪吃蛇的身体用列表存储
    snakeposition = [100, 100]  #定义蛇头部位置
    # 初始化贪吃蛇的长度,20*20为一个标准小格子
    snakelength = [[100, 100], [80, 100], [60, 100]]

    # 初始化目标食物方块的位置
    square_purpose = [300, 300]
    # 初始化一个数来判断目标食物方块是否存在,0代表已经被吃掉,1代表还在
    square_position = 1

    # 初始化方向,用来使贪吃蛇移动,通过监听键盘输入来实现,利用键盘中的上下左右键或WASD键来控制贪吃蛇的运动。
    direction = "right"
    change_direction = direction

    # 进行游戏主循环
    while True:
        # 检测按键等pygame事件
        for event in pygame.event.get():
            if event.type == QUIT:
                # 接收到退出事件后,退出程序
                pygame.quit()
                sys.exit()
            elif event.type == KEYDOWN:
                # 判断键盘事件,用w,s,a,d来表示上下左右
                if event.key == K_RIGHT or event.key == ord('d'):
                    change_direction = "right"
                if event.key == K_LEFT or event.key == ord('a'):
                    change_direction = "left"
                if event.key == K_UP or event.key == ord('w'):
                    change_direction = "up"
                if event.key == K_DOWN or event.key == ord('s'):
                    change_direction = "down"
                if event.key == K_ESCAPE:
                    pygame.event.post(pygame.event.Event(QUIT))

        #将蛇前进方向按照键盘的输入进行转弯操作,并将蛇的头部当前的位置加入到蛇身的列表中。
        # 判断移动的方向与想要改变的方向是否相反,因为实现的时候如果操作改变的方向与实际运动方向相反,则不好操作
        if change_direction == 'left' and  direction != 'right':
            direction = change_direction
        if change_direction == 'right' and direction != 'left':
            direction = change_direction
        if change_direction == 'up' and  direction != 'down':
            direction = change_direction
        if change_direction == 'down' and  direction != 'up':
            direction = change_direction
        # 根据方向,改变蛇头部坐标
        if direction == 'left':
            snakeposition[0] -= 20  #将蛇的头部向左移一个格子
        if direction == 'right':
            snakeposition[0] += 20  #格子的坐标从左到右增加
        if direction == 'up':
            snakeposition[1] -= 20  #格子的坐标从上到下增加
        if direction == 'down':
            snakeposition[1] += 20
        # 增加蛇的长度
        #snakelength是一个列表,里面的元素是一个个列表,表示蛇身体的一个格子
        snakelength.insert( 0,list(snakeposition))  #在索引号为0的蛇身体前面插入,即在头部前插入新的头部

        # 判断是否吃掉目标方块
        if snakeposition[0] == square_purpose[0] and snakeposition[1] == square_purpose[1]:
            square_position = 0     #如果蛇头部坐标和方块坐标一致,则蛇吃掉目标方块,不进行其它操作,蛇尾部保留,算作吃到方块后新增的部位
        else:
            snakelength.pop()       #蛇没有吃到方块,则将尾部去掉

        # 方块被吃掉后随机重新生成目标方块
        if square_position == 0:
            # 随机生成x,y,扩大二十倍,在窗口范围内
            x = random.randrange(1, 32)
            y = random.randrange(1, 24)
            square_purpose = [int(x * 20), int(y * 20)]     #符合窗口大小
            square_position = 1

        # 绘制pygame显示层
        gamesurface.fill(black_colour)
        for position in snakelength:
            pygame.draw.rect(gamesurface, white_colour, Rect(position[0], position[1], 20, 20)) #用一个白色方形小格子作为蛇的身体
            pygame.draw.rect(gamesurface, red_colour, Rect(square_purpose[0], square_purpose[1], 20, 20))#红色小方格作为食物

        # 刷新pygame显示层
        pygame.display.flip()   #不更新显示层则无法显示身体变化
        # 判断是否死亡
        if snakeposition[0] < 0 or snakeposition[0] > 620:
            gameover(gamesurface)
        if snakeposition[1] < 0 or snakeposition[1] > 460:
            gameover(gamesurface)    #撞到墙壁则死亡
        for snakebody in snakelength[1:]:
            if snakeposition[0] == snakebody[0] and snakeposition[1] == snakebody[1]:
                gameover(gamesurface)   #蛇头撞到蛇身也死亡

        # 控制游戏速度
        ftpsClock.tick(4)

3.5执行主函数

if __name__ == "__main__":
   main()

3.6将.py文件转为.exe文件

步骤一:安装pyinstaller
推荐使用国内豆瓣镜像源安装,否则很可能会失败。

在cmd命令行中输入

pip install pyinstaller -i https://pypi.douban.com/simple

步骤二:
在pycharm中打开:View-Tool Windows-Terminal
打开到所要生成exe文件的该文件目录下,输入Terminal中输入:“pyinstaller -F -w ’文件名‘.py” 就可以制作出exe。
-w的用处是不出现黑色控制台窗口。

4、运行结果

在这里插入图片描述

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的!下面是使用Python编写贪吃蛇小游戏的代码: ``` python import pygame import random # 初始化 pygame.init() # 游戏区域大小 width = 500 height = 500 # 颜色定义 black = (0, 0, 0) white = (255, 255, 255) red = (255, 0, 0) # 创建窗口 screen = pygame.display.set_mode((width, height)) pygame.display.set_caption('贪吃蛇小游戏') # 定义蛇的初始位置和大小 snake_block = 10 snake_speed = 15 # 字体设置 font_style = pygame.font.SysFont(None, 30) def message(msg,color): mesg = font_style.render(msg, True, color) screen.blit(mesg, [width/6, height/3]) # 定义蛇的移动函数 def snake(snake_block, snake_List): for x in snake_List: pygame.draw.rect(screen, black, [x[0], x[1], snake_block, snake_block]) # 游戏主函数 def gameLoop(): game_over = False game_close = False x1 = width / 2 y1 = height / 2 x1_change = 0 y1_change = 0 snake_List = [] Length_of_snake = 1 foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0 # 游戏循环 while not game_over: while game_close == True: screen.fill(white) message("You Lost! Press Q-Quit or C-Play Again",red) pygame.display.update() for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: game_over = True game_close = False if event.key == pygame.K_c: gameLoop() 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: x1_change = -snake_block y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block x1_change = 0 # 是否超出边界 if x1 >= width or x1 < 0 or y1 >= height or y1 < 0: game_close = True x1 += x1_change y1 += y1_change screen.fill(white) pygame.draw.rect(screen, red, [foodx, foody, snake_block, snake_block]) snake_Head = [] snake_Head.append(x1) snake_Head.append(y1) snake_List.append(snake_Head) if len(snake_List) > Length_of_snake: del snake_List[0] for x in snake_List[:-1]: if x == snake_Head: game_close = True snake(snake_block, snake_List) pygame.display.update() if x1 == foodx and y1 == foody: foodx = round(random.randrange(0, width - snake_block) / 10.0) * 10.0 foody = round(random.randrange(0, height - snake_block) / 10.0) * 10.0 Length_of_snake += 1 clock = pygame.time.Clock() clock.tick(snake_speed) pygame.quit() quit() gameLoop() ``` 希望能帮助你了解如何使用Python编写贪吃蛇小游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值