资讯专栏INFORMATION COLUMN

python完成简单的贪吃蛇小游戏附编号

89542767 / 282人阅读

  此篇文章主要是详细介绍了python完成简单的贪吃蛇小游戏附编号,文章内容紧扣主题进行详尽的基本介绍,具有很强的参考意义,需用的朋友可以学习一下


  序言:


  不知道有没有同学们和我一样,最开始触碰程序编程的动机就是为了做一个游戏打?


  接下来要跟大家分享是指一个pygame所写的“贪食蛇”手机游戏:


  “贪食蛇”这一个手机游戏在编程设计里的熟客,由于:


  简易,最基本游戏情节你只需要蛇和食物2个就可以去了。(打手冲还要3个原素呢,想一想各是什么?)方位得话只需前后左右4个确定方位就行了。有最基本的算法设计和面向对象观念在这其中。游戏软件开发本身也要用到好多面向对象定义,而蛇的人体又是个纯天然的“双向链表”构造,很适合用于训练算法设计了。此外较为有意思的地方在于,Python这个英语单词在在英语中便是大蟒蛇的意味,贪食蛇算得上是“同名的手机游戏”了。很多高校里软件开发学科的工作都有贪食蛇的论文选题,也经常会还有同学问到有关的编号。(诺基亚对这款游戏都是十分偏爱。)之前我也做过一次《贪吃蛇大作战》的Python版本号,基于cocos2d-python开发。但那个针对新手而言有一些太复杂了。

01.png

  接下来我们做一个简要概述:


  此编号依托于pygame研发,因此运作前请保证你自己的Python里已经成功组装pygame。之后直接运行代码中的game2.py即可开始游戏。除开最后的编号外,大家还特地溶解了两个过程的py文件,供想让自己研发的同学们参照。


  大家首先来客观分析,要写下这款游戏来需用注意些什么点。


  1、蛇怎么表达?


  我们能把整个游戏场地划分为一个一个的方格,由1组连在一起方格构成“蛇”,你可以用不一样的颜色来描述,如上图所述中,我用深颜色表达情况,浅色系表达“蛇”。


  你可以用座标来描述任何一个小方格,X轴和Y轴标准都是能够定好的。通过一个目录来储存“双角”的座标,那样1条“蛇”就上来了,最终只需标注的过程中以不一样的颜色表达就可以了。


  2、蛇怎么移动?


  首先想到的就是像泥鳅肠蠕动相同,任何一个小三角往前面挪动一个,不过这样完成下去非常麻烦。本身就是被这儿不动了。


  展开想象大家玩过的游戏贪食蛇,每一次“蛇”移动觉得上有总体往前面移动了一个,过滤掉脑袋中“蛇”的“行为”,仔细想挪动时和挪动后“蛇”位置变动,当然除了首尾,其他部位根本没有变。那么就轻松了,将下一个格的座标导入到目录打头,并清除目录的最后一个元素,就等于是蛇往前面移动了一个。


  3、怎样判断比赛终止?


  “蛇”挪动远远超过了游戏区域的范畴或是不小心碰到自身即便输掉了,轴座标的范畴是预先订好,超出非常容易分辨。那样怎么判断遇到自己呢?


  假如脑中想的就是“蛇”动游戏界面,那简直较难了,但放进编号中,我们自己的“蛇”是个目录,那样只需分辨下一个格的座标是不是已经包括在“蛇”的页面上岂不是就行了?


  梳理了各种问题,大家就可以去编号了。


  定义游戏元素及界面:


  def main():
  pygame.init()
  screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
  pygame.display.set_caption('贪吃蛇')
  light=(100,100,100)#蛇的颜色
  dark=(200,200,200)#食物颜色
  font1=pygame.font.SysFont('SimHei',24)#得分的字体
  font2=pygame.font.Font(None,72)#GAME OVER的字体
  red=(200,30,30)#GAME OVER的字体颜色
  fwidth,fheight=font2.size('GAME OVER')
  line_width=1#网格线宽度
  black=(0,0,0)#网格线颜色
  bgcolor=(40,40,60)#背景色
  #方向,起始向右
  pos_x=1
  pos_y=0
  #如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER
  #b变量就是用于防止这种情况的发生
  b=True
  #范围
  scope_x=(0,SCREEN_WIDTH//SIZE-1)
  scope_y=(2,SCREEN_HEIGHT//SIZE-1)
  #蛇
  snake=deque()
  #食物
  food_x=0
  food_y=0
  初始化蛇及食物:
  #初始化蛇
  def _init_snake():
  nonlocal snake
  snake.clear()
  snake.append((2,scope_y[0]))
  snake.append((1,scope_y[0]))
  snake.append((0,scope_y[0]))
  #食物
  def _create_food():
  nonlocal food_x,food_y
  food_x=random.randint(scope_x[0],scope_x[1])
  food_y=random.randint(scope_y[0],scope_y[1])
  while(food_x,food_y)in snake:
  #为了防止食物出到蛇身上
  food_x=random.randint(scope_x[0],scope_x[1])
  food_y=random.randint(scope_y[0],scope_y[1])
  _init_snake()
 _create_food()


  全部代码:


  """
  贪吃蛇小游戏
  """
  import random
  import sys
  import time
  import pygame
  from pygame.locals import*
  from collections import deque
  SCREEN_WIDTH=600
  SCREEN_HEIGHT=480
  SIZE=20
  def print_text(screen,font,x,y,text,fcolor=(255,255,255)):
  imgText=font.render(text,True,fcolor)
  screen.blit(imgText,(x,y))
  def main():
  pygame.init()
  screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
  pygame.display.set_caption('贪吃蛇')
  light=(100,100,100)#蛇的颜色
  dark=(200,200,200)#食物颜色
  font1=pygame.font.SysFont('SimHei',24)#得分的字体
  font2=pygame.font.Font(None,72)#GAME OVER的字体
  red=(200,30,30)#GAME OVER的字体颜色
  fwidth,fheight=font2.size('GAME OVER')
  line_width=1#网格线宽度
  black=(0,0,0)#网格线颜色
  bgcolor=(40,40,60)#背景色
  #方向,起始向右
  pos_x=1
  pos_y=0
  #如果蛇正在向右移动,那么快速点击向下向左,由于程序刷新没那么快,向下事件会被向左覆盖掉,导致蛇后退,直接GAME OVER
  #b变量就是用于防止这种情况的发生
  b=True
  #范围
  scope_x=(0,SCREEN_WIDTH//SIZE-1)
  scope_y=(2,SCREEN_HEIGHT//SIZE-1)
  #蛇
  snake=deque()
  #食物
  food_x=0
  food_y=0
  #初始化蛇
  def _init_snake():
  nonlocal snake
  snake.clear()
  snake.append((2,scope_y[0]))
  snake.append((1,scope_y[0]))
  snake.append((0,scope_y[0]))
  #食物
  def _create_food():
  nonlocal food_x,food_y
  food_x=random.randint(scope_x[0],scope_x[1])
  food_y=random.randint(scope_y[0],scope_y[1])
  while(food_x,food_y)in snake:
  #为了防止食物出到蛇身上
  food_x=random.randint(scope_x[0],scope_x[1])
  food_y=random.randint(scope_y[0],scope_y[1])
  _init_snake()
  _create_food()
  game_over=True
  start=False#是否开始,当start=True,game_over=True时,才显示GAME OVER
  score=0#得分
  orispeed=0.5#原始速度
  speed=orispeed
  last_move_time=None
  pause=False#暂停
  while True:
  for event in pygame.event.get():
  if event.type==QUIT:
  sys.exit()
  elif event.type==KEYDOWN:
  if event.key==K_RETURN:
  if game_over:
  start=True
  game_over=False
  b=True
  _init_snake()
  _create_food()
  pos_x=1
  pos_y=0
  #得分
  score=0
  last_move_time=time.time()
  elif event.key==K_SPACE:
  if not game_over:
  pause=not pause
  elif event.key in(K_w,K_UP):
  #这个判断是为了防止蛇向上移时按了向下键,导致直接GAME OVER
  if b and not pos_y:
  pos_x=0
  pos_y=-1
  b=False
  elif event.key in(K_s,K_DOWN):
  if b and not pos_y:
  pos_x=0
  pos_y=1
  b=False
  elif event.key in(K_a,K_LEFT):
  if b and not pos_x:
  pos_x=-1
  pos_y=0
  b=False
  elif event.key in(K_d,K_RIGHT):
  if b and not pos_x:
  pos_x=1
  pos_y=0
  b=False
  #填充背景色
  screen.fill(bgcolor)
  #画网格线竖线
  for x in range(SIZE,SCREEN_WIDTH,SIZE):
  pygame.draw.line(screen,black,(x,scope_y[0]*SIZE),(x,SCREEN_HEIGHT),line_width)
  #画网格线横线
  for y in range(scope_y[0]*SIZE,SCREEN_HEIGHT,SIZE):
  pygame.draw.line(screen,black,(0,y),(SCREEN_WIDTH,y),line_width)
  if game_over:
  if start:
  print_text(screen,font2,(SCREEN_WIDTH-fwidth)//2,(SCREEN_HEIGHT-fheight)//2,'GAME OVER',
  red)
  else:
  curTime=time.time()
  if curTime-last_move_time>speed:
  if not pause:
  b=True
  last_move_time=curTime
  next_s=(snake[0][0]+pos_x,snake[0][1]+pos_y)
  if next_s[0]==food_x and next_s[1]==food_y:
  #吃到了食物
  _create_food()
  snake.appendleft(next_s)
  score+=10
  speed=orispeed-0.03*(score//100)
  else:
  if scope_x[0]<=next_s[0]<=scope_x[1]and scope_y[0]<=next_s[1]<=scope_y[1]
  and next_s not in snake:
  snake.appendleft(next_s)
  snake.pop()
  else:
  game_over=True
  #画食物
  if not game_over:
  #避免GAME OVER的时候把GAME OVER的字给遮住了
  pygame.draw.rect(screen,light,(food_x*SIZE,food_y*SIZE,SIZE,SIZE),0)
  #画蛇
  for s in snake:
  pygame.draw.rect(screen,dark,(s[0]*SIZE+line_width,s[1]*SIZE+line_width,
  SIZE-line_width*2,SIZE-line_width*2),0)
  print_text(screen,font1,30,7,f'速度:{score//100}')
  print_text(screen,font1,450,7,f'得分:{score}')
  pygame.display.update()
  if __name__=='__main__':
  main()


  综上所述,这篇文章就给大家介绍到这里了,希望可以给大家带来帮助。

       

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128828.html

相关文章

  • 60行Python代码实现闯关升级贪吃,很少有人能到第十关(源码和成品)

    摘要:由于年底发明,第一个公开发行版发行于年。像语言一样源代码同样遵循协议。官方宣布,年月日,停止的更新。被确定为最后一个版本。的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 ...

    cgh1999520 评论0 收藏0
  • 爆款游戏贪吃大作战》 Python 实现

    摘要:感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核。不过现在微信已经悍然屏蔽了它的分享这个游戏就是现在免费榜排名第一的贪吃蛇大作战。不过这实在是一个挺好实现的游戏,于是一时技痒,拿做了一个实现。 感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核。媒体们除了之前竞相追捧《Pokemon Go》热闹了一把,似乎也听不到什么声音了。直到最...

    chaos_G 评论0 收藏0
  • 一步步教你怎么用python贪吃游戏

    摘要:目录引言环境需求分析代码实现后记引言前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个称霸的年代,这款游戏可是经典中的经典啊而用蛇玩贪吃蛇,那再合适不过了 目录0 引言1 环境2 需求分析3 代码实现4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Python(蛇)玩Snake(贪吃蛇)...

    spademan 评论0 收藏0
  • 使用TypeScript和Canvas编写移动端贪吃大作战游戏

    摘要:基本介绍一款移动端贪吃蛇大作战游戏。主要的游戏逻辑有贪吃蛇移动碰撞检测贪吃蛇碰撞碰撞墙壁和吃食物。贪吃蛇的身体如何跟随头部移动需要分为两种情况,在单位时间内贪吃蛇移动一单位长度和贪吃蛇移动多单位长度。 基本介绍 一款移动端贪吃蛇大作战游戏。(只支持移动端) 这是一个临近 deadline 的课设项目,为了方便地使用TS,我直接使用angular-cli生成了TypeScript的项...

    AlphaWallet 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<