五分钟学会怎么用python做一个简单的贪吃蛇


Posted in Python onJanuary 12, 2021

Pygame 是一组用来开发游戏软件的 Python 程序模块,基于 SDL 库的基础上开发。我们今天将利用它来制作一款大家基本都玩过的小游戏——贪吃蛇。

五分钟学会怎么用python做一个简单的贪吃蛇

一、需要导入的包

import pygame
import time
import random
  • pygame:获取图形组件构建游戏
  • time:主要用来设置帧率
  • random:主要用来设置食物的刷新位置

二、窗口界面设置

首先我们初始化游戏,建立一个窗口

pygame.init()

然后我们定义游戏中需要使用的颜色,在这个示例中,我们定义了六种颜色

white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

接下来,我们设置窗口的尺寸和标题栏,在这个示例中,我们将窗口设置为800*600

dis_width = 800
dis_height = 600

dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('贪吃蛇游戏')

三、游戏中的变量

初始化一个clock变量,使用开头导入的time包。这个变量将用来处理游戏的帧率。

clock = pygame.time.Clock()

定义蛇的速度与大小。可以随意更改,选择你适应的即可

snake_block = 10
snake_speed = 12

设置分数显示和其他信息的字体大小与样式。

font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)

四、设置功能函数

定义三个辅助功能函数,实现以下功能。

  • 显示计算分数
  • 蛇的参数
  • 其他消息显示,比如失败后的重玩提示。

首先,定义一个计算分数的函数

def Your_score(score):
    value = score_font.render("Your Score: " + str(score), True, yellow)
    dis.blit(value, [0, 0]

接下来定义蛇的参数。我们定义了蛇的颜色,位置与大小,即snake_block。我们额外定义了一个snake_list作为输入,将在下面用到。

def our_snake(snake_block, snake_list):
 for x in snake_list:
 pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

最后定义一个消息显示函数,这个辅助函数将msg和颜色作为输入参数。我们将设置字体,然后以所需的颜色显示信息。我们需要指定信息在游戏中显示的位置。

def message(msg, colour):
 mesg = font_style.render(msg, True, colour)
 dis.blit(mesg, [width / 6, height / 3])

五、构建游戏

开始建立游戏循环,让游戏运行并能响应键盘输入。首先定义两个变量game_over和game_close,用来描述游戏的状态。第一个提示游戏是否结束,下一个定义是否关闭游戏。都定义为false

game_over = False
game_close = False

下一步,我们将定义x1和y1来表示蛇在游戏中的位置。我们分别初始化它们的宽度/2和高度/2。同时,我们将定义变量x1_change和y1_change来表示蛇的位置根据用户提供的输入而发生的变化。

x1 = width / 2
y1 = height / 2

x1_change = 0
y1_change = 0

另外,我们还需要定义snake_List和snake_length变量,分别存储蛇的所有头部位置和蛇的长度。

snake_List = []
snake_length = 1

吃掉食物新食物产生的位置,用random模块来实现。

foodx = round(random.randrange(0, width — snake_block) / 10.0) * 10.0
foody = round(random.randrange(0, height — snake_block) / 10.0) * 10.0

接下来,我们将启动一个循环,直到game_over变成True为止。

在这个循环中,我们将首先定义在 game_close 变量为 True 时要执行的指令。

下面的代码将帮助我们处理game_close等于True时的情况。

while game_close == True:
            dis.fill(blue)
            message("Lost! q quit or p again", red)
            Your_score(Length_of_snake - 1)
            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_p:
                        gameLoop()

如你所见,我们已经定义了很多东西。我们用蓝色填充显示(你当然可以选择你的颜色)。游戏结束时,我们显示一条消息,显示该用户输掉了游戏,我们应该询问用户是想再玩一次还是退出游戏。

我们也会显示用户的分数,等于蛇的长度减1。每当我们的蛇吃到食物时,我们都会更新1分。

现在,为了接受用户关于他是想再玩一次还是退出游戏的输入,我们定义了一个for-loop。当我们要求用户输入关于他的决定时,我们定义了输入的可能性。

如果用户输入的是'p',那么我们将继续我们的游戏循环。如果用户输入的是'q',那么我们就需要退出游戏。

现在,在处理完game_close的条件后,我们将定义所有需要的步骤,这将使我们的蛇根据用户的输入移动。我们将接受W、A、S、D和上、下、左、右键组合来进行游戏。你可以自由选择你的按键来玩游戏。

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:
     x1_change = -snake_block
     y1_change = 0
   elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
     x1_change = snake_block
     y1_change = 0
   elif event.key == pygame.K_UP or event.key == pygame.K_w:
     y1_change = -snake_block
     x1_change = 0
   elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
     y1_change = snake_block
     x1_change = 0

在上面的代码中,我们根据用户提供的输入改变x1_change和y1_change的值。同时,如果用户想退出游戏,我们也会退出游戏。

接下来,我们将定义输掉游戏的条件。同时,我们借助x1_change和y1_change更新x1和y1的值。我们还将用蓝色填充整个显示屏,并通过在显示屏中传递蛇和食物的出现位置来绘制它们。

if x1 >= width or x1 < 0 or y1 >= height or y1 < 0:
    game_close = True
 x1 += x1_change
 y1 += y1_change
 dis.fill(blue)
 pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])

接下来,我们定义一个名为snake_Head的列表,它将在每次迭代后存储蛇头的值。我们将x1和y1的值追加到它上面。然后,我们将该snake_Head追加到snake_List中。

然后我们检查条件检查snake_List的长度是否大于snake_length。如果是,则删除snake_List中的第一个元素。

然后,我们检查当前的snake_Head是否等于snake_List中的任何一个元素,除了新增加的那个元素,也就是被检查的snake_Head。如果是,那么我们就关闭游戏,玩家就输了。

这是因为在snake_List中出现snake_Head意味着它曾经被添加到snake_List中,再次找到相同的值意味着蛇碰到了自己。所以,此时游戏结束。

然后我们调用函数our_snake和Your_score(前面定义的),并将所需参数传递给这些函数,以显示更新后的蛇和玩家的分数。

 snake_Head = []
 snake_Head.append(x1)
 snake_Head.append(y1)
 snake_List.append(snake_Head)
 if len(snake_List) > snake_length:
   del snake_List[0]

 for x in snake_List[:-1]:
   if x == snake_Head:
     game_close = True

 our_snake(snake_block, snake_List)
 Your_score(snake_length — 1)

 pygame.display.update()

接下来,我们将在蛇吃完前一个食物后,形成新的食物。所以,为了做到这一点,我们需要在显示屏中找到一个新的随机位置来生成食物。另外,由于蛇刚吃完食物,我们需要将蛇的长度增加1。

最后,我们将蛇的速度作为参数给clock.tick,作为游戏的帧率。

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
  snake_length += 1

clock.tick(snake_speed)

功能已经完全实现,我们最后退出游戏,并再次调用游戏循环

pygame.quit()
    quit()

gameLoop()

六、完整代码

import pygame
import time
import random

pygame.init()

white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

dis_width = 800
dis_height = 600

dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('贪吃蛇')

clock = pygame.time.Clock()

snake_block = 10
snake_speed = 15

font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)

def Your_score(score):
    value = score_font.render("Score: " + str(score), True, yellow)
    dis.blit(value, [0, 0])

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])

def gameLoop():
    game_over = False
    game_close = False

    x1 = dis_width / 2
    y1 = dis_height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Length_of_snake = 1

    foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
    foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0

    while not game_over:

        while game_close == True:
            dis.fill(blue)
            message("Lost! q quit or p again", red)
            Your_score(Length_of_snake - 1)
            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_p:
                        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 or event.key == pygame.K_a:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP or event.key == pygame.K_w:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    y1_change = snake_block
                    x1_change = 0

        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        dis.fill(blue)
        pygame.draw.rect(dis, green, [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

        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)

        pygame.display.update()

        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 10.0) * 10.0
            foody = round(random.randrange(0, dis_height - snake_block) / 10.0) * 10.0
            Length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()

gameLoop()

更多关于python的文章,欢迎关注python客栈。

五分钟学会怎么用python做一个简单的贪吃蛇

以上就是五分钟学会怎么用python做一个简单的贪吃蛇的详细内容,更多关于python 贪吃蛇的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
简单的Python的curses库使用教程
Apr 11 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python matplotlib绘图可视化知识点整理(小结)
Mar 16 Python
python opencv 图像尺寸变换方法
Apr 02 Python
python机器学习之KNN分类算法
Aug 29 Python
python得到电脑的开机时间方法
Oct 15 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
使用tensorboard可视化loss和acc的实例
Jan 21 Python
python对一个数向上取整的实例方法
Jun 18 Python
解决Python中导入自己写的类,被划红线,但不影响执行的问题
Jul 13 Python
Python __slots__的使用方法
Nov 15 Python
分享Python获取本机IP地址的几种方法
Mar 17 Python
python生成word合同的实例方法
Jan 12 #Python
python中常用的数据结构介绍
Jan 12 #Python
2020年10款优秀的Python第三方库,看看有你中意的吗?
Jan 12 #Python
python3 kubernetes api的使用示例
Jan 12 #Python
python excel和yaml文件的读取封装
Jan 12 #Python
python drf各类组件的用法和作用
Jan 12 #Python
Python try except else使用详解
Jan 12 #Python
You might like
php 文章采集正则代码
2009/12/28 PHP
php文本转图片自动换行的方法
2013/03/13 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
canvas绘制爱心的几种方法总结(推荐)
2017/10/31 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
Vue执行方法,方法获取data值,设置data值,方法传值操作
2020/08/05 Javascript
Nest.js环境变量配置与序列化详解
2021/02/21 Javascript
python使用any判断一个对象是否为空的方法
2014/11/19 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python中的闭包函数
2018/02/09 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
2018/12/28 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
python hough变换检测直线的实现方法
2019/07/12 Python
python实现手势识别的示例(入门)
2020/04/15 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
大学校园毕业自我鉴定
2014/01/15 职场文书
大学生个人自荐信样本
2014/03/02 职场文书
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
2016高考感言
2015/08/01 职场文书
2019年农民幸福观调查的实践感悟
2019/12/19 职场文书
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
Windows server 2016服务器基本设置
2022/08/14 Servers