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


Posted in Python onJanuary 06, 2021

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

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

一、需要导入的包

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客栈。

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

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

Python 相关文章推荐
Python中的random()方法的使用介绍
May 15 Python
Python使用剪切板的方法
Jun 06 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
python-itchat 获取微信群用户信息的实例
Feb 21 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
如何在Django配置文件里配置session链接
Aug 06 Python
Python的缺点和劣势分析
Nov 19 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
Jul 07 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
python绕过图片滑动验证码实现爬取PTA所有题目功能 附源码
Jan 06 #Python
python 获取谷歌浏览器保存的密码
Jan 06 #Python
python实现PolynomialFeatures多项式的方法
Jan 06 #Python
pytorch中index_select()的用法详解
Jan 06 #Python
Python之京东商品秒杀的实现示例
Jan 06 #Python
Python实现小黑屋游戏的完整实例
Jan 06 #Python
Jupyter Notebook 安装配置与使用详解
Jan 06 #Python
You might like
改造一台复古桌面收音机
2021/03/02 无线电
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
php安装ssh2扩展的方法【Linux平台】
2016/07/20 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
js操作css属性实现div层展开关闭效果的方法
2015/05/11 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
JS非行间样式获取函数的实例代码
2018/06/05 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python的互斥锁与信号量详解
2019/09/12 Python
python爬取微博评论的实例讲解
2021/01/15 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
Ivory Isle Designs美国/加拿大:婚礼和活动文具公司
2018/08/21 全球购物
澳大利亚在线家具、灯饰和家居装饰店:LivingStyles
2018/11/20 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
校庆团日活动总结
2014/08/28 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
仓管员岗位职责
2015/02/03 职场文书
辞职信如何写
2015/02/27 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
Python  lambda匿名函数和三元运算符
2022/04/19 Python
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS