pygame实现贪吃蛇游戏(下)


Posted in Python onOctober 29, 2019

接着上篇pygame实现贪吃蛇游戏(上)继续介绍

1.豆子的吃掉效果

只需在代码最后移动蛇头的代码后增加一个蛇头和豆子坐标的判断即可

if snake_x == bean_x and snake_y == bean_y:
 bean_x,bean_y = get_bean_pos()

体验一下,现在蛇头碰到豆子后,豆子已经会消失了

2.蛇身的加长

前面我们给蛇身只设置了一个坐标,既然蛇身会越加越长,当然我们用一个数组去存这个身体是更合适的,于是我们把蛇身的变量做一些修改。

在初始化body_x和body_y完成后,将这个坐标加入一个名叫body_arr的数组

body_arr = [(body_x,body_y)]

将绘制蛇身的pygame.draw.rect做下修改,用遍历数组去绘制

for body_x,body_y in body_arr:
 pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5)

蛇身的移动也同样要改成循环,分别使身体的后一节使用前一节的位置

body_arr = [(snake_x,snake_y)]+body_arr[:-1]

最后吃到豆子后蛇身的加长我们可以这么做,先把蛇最后一节的位置备份一下

last_body_x,last_body_y = body_arr[-1]

如果吃到豆子,那么把这备份下的最后一节加到身体数组最后就好了

body_arr.append((last_body_x,last_body_y))

现在基本的游戏效果可以看到了

pygame实现贪吃蛇游戏(下)

3.蛇自身碰撞的游戏失败判断

用一个标记表示游戏状态

game_state = 1 # 游戏状态1.表示正常 2.表示失败

将移动判断的代码加入标记的判断改成

if game_state == 1 and pygame.time.get_ticks() >= ticks:

在移动的最后增加一个头和身体、身体和身体的重合判断

for body_x,body_y in body_arr: # 判断下蛇头和身体是否有重合
      if snake_x == body_x and snake_y == body_y:
        game_state = 2
        break
for i in range(len(body_arr)-1):
      for j in range(i+1,len(body_arr)):
        if body_arr[i][0] == body_arr[j][0] and body_arr[i][1] == body_arr[j][1]: # 判断下身体每节是否有重合
          game_state = 2
          break

游戏失败后的效果的图如下

pygame实现贪吃蛇游戏(下)

再把网格线去了,看起来干净一点

pygame实现贪吃蛇游戏(下)

最后再附一下完整的程序

# -*- coding=utf-8 -*-
import random
import pygame
from pygame.locals import KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWN
pygame.init()
screencaption = pygame.display.set_caption('first pygame')
screen = pygame.display.set_mode((400,400)) #设置400*400窗口

snake_x = random.randint(0,9)*40+20
snake_y = random.randint(0,9)*40+20

game_state = 1 # 游戏状态1.表示正常 2.表示失败
def get_bean_pos():
 return random.randint(0,9)*40+20,random.randint(0,9)*40+20 

yellow = 255,255,0 

bean_x,bean_y = get_bean_pos()

diff_ticks = 300 # 移动一次蛇头的事件,单位毫秒
ticks = pygame.time.get_ticks()
ticks += diff_ticks

#dire = random.randint(0,3) # 假设0、1、2、3分别代表方向左、右、上、下
if snake_x < 200:
 dire = 1 # 往右移动
else: 
 dire = 0 # 往左移动 

body_y = snake_y
if dire == 0: # 向左移动
 if snake_x + 40 < 400: 
  body_x = snake_x + 40
 else: # 身体不能放右侧了,只能往上下方向放
  if snake_y > 200:
   body_x = snake_x
   body_y -= 40
  else:
   body_x = snake_x
   body_y += 40
else: # 向右移动
 if snake_x - 40 > 0:
  body_x = snake_x - 40
 else: # 身体不能放左侧了,只能往上下方向放
  if snake_y > 200:
   body_x = snake_x
   body_y -= 40
  else:
   body_x = snake_x
   body_y += 40
body_arr = [(body_x,body_y)]

def set_snake_next_pos(snake_x, snake_y):
 if dire == 0:
  if snake_x - 40 > 0:
   snake_x -= 40
 if dire == 1:
  if snake_x + 40 < 400:
   snake_x += 40
 if dire == 2:
  if snake_y - 40 > 0:
   snake_y -= 40
 if dire == 3:
  if snake_y + 40 < 400:
   snake_y += 40
 return snake_x,snake_y

while True:
 for event in pygame.event.get():
   if event.type == pygame.QUIT:
    pygame.quit()
    exit()
   if event.type == KEYDOWN:
    if event.key == K_LEFT:
     if dire!=0 and dire!=1 and snake_x - 40 > 0: # 和当前方向不是同方向或反方向并且可以左移
      dire = 0
    if event.key == K_RIGHT:
     if dire!=0 and dire!=1 and snake_x + 40 < 400: # 和当前方向不是同方向或反方向并且可以右移
      dire = 1
    if event.key == K_UP:
     if dire!=2 and dire!=3 and snake_y - 40 > 0: # 和当前方向不是同方向或反方向并且可以上移
      dire = 2
    if event.key == K_DOWN:
     if dire!=2 and dire!=3 and snake_y + 40 < 400: # 和当前方向不是同方向或反方向并且可以下移
      dire = 3

 screen.fill((0,0,255)) # 将界面设置为蓝色

 #for x in range(0,400,40):
 # pygame.draw.line(screen,(255,255,255),(x,0),(x,400),1)
 #for y in range(0,400,40):
 # pygame.draw.line(screen,(255,255,255),(0,y),(400,y),1)

 pygame.draw.circle(screen,yellow,[snake_x,snake_y],20,2)
 for body_x,body_y in body_arr:
  pygame.draw.rect(screen,yellow,[body_x-20,body_y-20,40,40],5) 
 
 pygame.draw.circle(screen,yellow,[bean_x,bean_y],10,10)
 
 if game_state == 2:
  myfont = pygame.font.Font(None,30)
  white = 255,255,255
  textImage = myfont.render("Game over", True, white)
  screen.blit(textImage, (160,190))

 
 pygame.display.update() # 必须调用update才能看到绘图显示

 if game_state == 1 and pygame.time.get_ticks() >= ticks:
  last_body_x,last_body_y = body_arr[-1]
  body_arr = [(snake_x,snake_y)]+body_arr[:-1]
  snake_x,snake_y = set_snake_next_pos(snake_x,snake_y)
  ticks += diff_ticks
  #if snake_x == bean_x and snake_y == bean_y:
  # bean_x,bean_y = get_bean_pos()
  # body_arr.append((last_body_x,last_body_y))
  for body_x,body_y in body_arr:
   if snake_x == body_x and snake_y == body_y: # 判断下蛇头和身体是否有重合
    game_state = 2
    break
  for i in range(len(body_arr)-1):
   for j in range(i+1,len(body_arr)):
    if body_arr[i][0] == body_arr[j][0] and body_arr[i][1] == body_arr[j][1]: # 判断下身体每节是否有重合
     game_state = 2
     break
 
 if snake_x == bean_x and snake_y == bean_y:
  bean_x,bean_y = get_bean_pos()
  body_arr.append((last_body_x,last_body_y))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
低版本中Python除法运算小技巧
Apr 05 Python
Python编程之属性和方法实例详解
May 19 Python
python简单实现基于SSL的IRC bot实例
Jun 15 Python
打包发布Python模块的方法详解
Sep 18 Python
Python中进程和线程的区别详解
Oct 29 Python
python实现多张图片拼接成大图
Jan 15 Python
使用虚拟环境打包python为exe 文件的方法
Aug 29 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
Python实现数值积分方式
Nov 20 Python
python中提高pip install速度
Feb 14 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 #Python
pygame实现贪吃蛇游戏(上)
Oct 29 #Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 #Python
pygame实现打字游戏
Feb 19 #Python
Python 实现自动导入缺失的库
Oct 29 #Python
python实现的读取网页并分词功能示例
Oct 29 #Python
python实现LRU热点缓存及原理
Oct 29 #Python
You might like
PHP 日,周,月点击排行统计
2012/01/11 PHP
php文件下载处理方法分析
2015/04/22 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
Yii2框架自定义类统一处理url操作示例
2019/05/25 PHP
php的优点总结 php有哪些优点
2019/07/19 PHP
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
JS基于FileSystemObject创建一个指定路径的TXT文本文件
2015/08/05 Javascript
基于dropdown.js实现的两款美观大气的二级导航菜单
2015/09/02 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
JavaScript 基础表单验证示例(纯Js实现)
2017/07/20 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
python设计模式大全
2016/06/27 Python
python安装twisted的问题解析
2018/08/21 Python
基于python中theano库的线性回归
2018/08/31 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
python3去掉string中的标点符号方法
2019/01/22 Python
wxPython实现画图板
2020/08/27 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python matplotlib.pyplot.plot()参数用法
2020/04/14 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
九年级英语教学反思
2014/01/31 职场文书
水利公司纪检监察自我鉴定
2014/02/25 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android