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标准库之循环器(itertools)介绍
Nov 25 Python
使用Python实现一个简单的项目监控
Mar 31 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
使用C#配合ArcGIS Engine进行地理信息系统开发
Feb 19 Python
解决Django模板无法使用perms变量问题的方法
Sep 10 Python
python+pyqt实现右下角弹出框
Oct 26 Python
python放大图片和画方格实现算法
Mar 30 Python
python列表,字典,元组简单用法示例
Jul 11 Python
Python中的Cookie模块如何使用
Jun 04 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
Python数据分析之pandas读取数据
Jun 02 Python
python运行脚本文件的三种方法实例
Jun 25 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
多重?l件?合查?(二)
2006/10/09 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
PHP中有关长整数的一些操作教程
2019/09/11 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
javascript getElementsByName()的用法说明
2009/07/31 Javascript
javascript 模拟JQuery的Ready方法实现并出现的问题
2009/12/06 Javascript
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能
2013/04/08 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
点击按钮或链接不跳转只刷新页面的脚本整理
2013/10/22 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
快速学习JavaScript的6个思维技巧
2015/10/13 Javascript
JavaScript获取图片像素颜色并转换为box-shadow显示
2016/03/11 Javascript
基于jQuery的checkbox全选问题分析
2016/11/18 Javascript
Angular4学习笔记之根模块与Ng模块
2017/09/09 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
zbar解码二维码和条形码示例
2014/02/07 Python
python图像处理之反色实现方法
2015/05/30 Python
Python切片知识解析
2016/03/06 Python
Django 使用logging打印日志的实例
2018/04/28 Python
Flask框架路由和视图用法实例分析
2019/11/07 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
python 字符串格式化的示例
2020/09/21 Python
Python将QQ聊天记录生成词云的示例代码
2021/02/10 Python
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
探亲邀请信范文
2014/01/30 职场文书
模特大赛策划方案
2014/05/28 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书