侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

pygame实现贪吃蛇游戏(下)

Python  /  管理员 发布于 5年前   224

接着上篇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))

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

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        breakfor 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

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

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

最后再附一下完整的程序

# -*- coding=utf-8 -*-import randomimport pygamefrom pygame.locals import KEYDOWN,K_LEFT,K_RIGHT,K_UP,K_DOWNpygame.init()screencaption = pygame.display.set_caption('first pygame')screen = pygame.display.set_mode((400,400)) #设置400*400窗口snake_x = random.randint(0,9)*40+20snake_y = random.randint(0,9)*40+20game_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_yif 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 += 40else: # 向右移动 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 += 40body_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_ywhile 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))

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


  • 上一条:
    pygame实现非图片按钮效果
    下一条:
    pygame实现贪吃蛇游戏(上)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客