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中为什么要用self探讨
Apr 14 Python
python实现字符串和日期相互转换的方法
May 13 Python
Python生成8位随机字符串的方法分析
Dec 05 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
Python 实现文件打包、上传与校验的方法
Feb 13 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
python和c语言的主要区别总结
Jul 07 Python
django中media媒体路径设置的步骤
Nov 15 Python
tensorboard显示空白的解决
Feb 15 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
anaconda python3.8安装后降级
Jun 11 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.ini 配置文件的深入解析
2013/06/17 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
使用php方法curl抓取AJAX异步内容思路分析及代码分享
2014/08/25 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
javascript 禁用IE工具栏,导航栏等等实现代码
2013/04/01 Javascript
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
使用js实现按钮控制文本框加1减1应用于小时+分钟
2013/12/09 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
微信小程序实现轨迹回放的示例代码
2019/12/13 Javascript
js实现select下拉框选择
2020/01/11 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[04:51]TI10典藏宝瓶Ⅱ外观视频展示
2020/08/15 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
python 图像平移和旋转的实例
2019/01/10 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
通过HTML5 Canvas API绘制弧线和圆形的教程
2016/03/14 HTML / CSS
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
法国时尚童装网站:Melijoe
2016/08/10 全球购物
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
超市优秀员工事迹材料
2014/05/01 职场文书
开学典礼策划方案
2014/05/28 职场文书
班级读书活动总结
2014/06/30 职场文书
地方白酒代理协议书
2014/10/25 职场文书
python基于tkinter制作下班倒计时工具
2021/04/28 Python