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中正则表达式 re.findall 用法
Oct 23 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
python执行精确的小数计算方法
Jan 21 Python
使用Python自动化破解自定义字体混淆信息的方法实例
Feb 13 Python
将matplotlib绘图嵌入pyqt的方法示例
Jan 08 Python
python super函数使用方法详解
Feb 14 Python
在PyCharm中遇到pip安装 失败问题及解决方案(pip失效时的解决方案)
Mar 10 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
去除python中的字符串空格的简单方法
Dec 22 Python
Django模型层实现多表关系创建和多表操作
Jul 21 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新手上路(五)
2006/10/09 PHP
php中的静态变量的基本用法
2014/03/20 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
漂亮的thinkphp 跳转页封装示例
2019/10/16 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件打包下载
2010/09/15 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
浅谈js中子页面父页面方法 变量相互调用
2016/08/04 Javascript
JS动态计算移动端rem的解决方案
2016/10/14 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python 获取et和excel的版本号
2009/04/09 Python
python简单程序读取串口信息的方法
2015/03/13 Python
Python实现二叉搜索树
2016/02/03 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
python中的协程深入理解
2019/06/10 Python
检测用户浏览器是否支持CSS3的方法
2009/08/29 HTML / CSS
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
PHP如何设置和取得Cookie值
2015/06/30 面试题
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
laravel使用redis队列实例讲解
2021/03/23 PHP
优秀信贷员先进事迹
2014/01/31 职场文书
置业顾问岗位职责
2014/03/02 职场文书
联欢晚会主持词
2014/03/25 职场文书
求职信结尾怎么写
2014/05/26 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
单位工作证明格式模板
2014/10/04 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
英语教学课后反思
2016/02/15 职场文书
总结Pyinstaller打包的高级用法
2021/06/28 Python