资讯专栏INFORMATION COLUMN

Python+Pygame怎么实现吃豆豆游戏?

89542767 / 304人阅读

  小编写这篇文章的一个主要目的,主要是用来给大家去做个相关的介绍,介绍的内容主要是涉及到相关的游戏实现,比如怎么去做游戏呢?比如说,怎么去做打豆豆的游戏呢?关于这方面的内容,下面就给大家详细解答下。


  序言


  前天晚上,玩起了在我们的学生时代经常玩的一些游戏,“吃豆豆”,但是我发现,在一局游戏当中,我们命的条数是比较少的,我根本不能吃完所有的豆豆,总是被敌人吃掉

01.png

  于是,我在想怎么能够保证我达到吃完所有豆豆的目标,然后我就想到了一个办法:


  所以我自己找资料,找素材,学习仿写了一款吃豆豆的小游戏,然后给我自己无限开挂!


  把这个游戏做成功之后,我就完全可以进行无限的躺平了,哈哈哈,这个游戏真的太好玩了。

02.png

  一、首先


  1)素材


  首先找到吃豆豆游戏的界面按照上面的素材找找准备下相似的图片!如下:

03.png

  2)环境


  本文的环境都跟之前的差不多:Python3、Pycharm、Pygame模块。


  模块安装:


  pip install-i https://pypi.douban.com/simple/pygame


  二、正式开始


  这款吃豆豆的小游戏:主要分为4块主要内容,分别是。Levels.py、Sprites.py、cfg.py、Game.py

04.png

  1)配置文件:cfg.py


  import os
  '''定义一些颜色'''
  BLACK=(0,0,0)
  WHITE=(255,255,255)
  BLUE=(0,0,255)
  GREEN=(0,255,0)
  RED=(255,0,0)
  YELLOW=(255,255,0)
  PURPLE=(255,0,255)
  SKYBLUE=(0,191,255)
  '''游戏素材路径'''
  BGMPATH=os.path.join(os.getcwd(),'resources/sounds/bg.mp3')
  ICONPATH=os.path.join(os.getcwd(),'resources/images/icon.png')
  FONTPATH=os.path.join(os.getcwd(),'resources/font/ALGER.TTF')
  HEROPATH=os.path.join(os.getcwd(),'resources/images/pacman.png')
  BlinkyPATH=os.path.join(os.getcwd(),'resources/images/Blinky.png')
  ClydePATH=os.path.join(os.getcwd(),'resources/images/Clyde.png')
  InkyPATH=os.path.join(os.getcwd(),'resources/images/Inky.png')
  PinkyPATH=os.path.join(os.getcwd(),'resources/images/Pinky.png')


  2)定义一些精灵类:Sprites.py


  import random
  import pygame
  '''墙类'''
  class Wall(pygame.sprite.Sprite):
  def __init__(self,x,y,width,height,color,**kwargs):
  pygame.sprite.Sprite.__init__(self)
  self.image=pygame.Surface([width,height])
  self.image.fill(color)
  self.rect=self.image.get_rect()
  self.rect.left=x
  self.rect.top=y
  '''食物类'''
  class Food(pygame.sprite.Sprite):
  def __init__(self,x,y,width,height,color,bg_color,**kwargs):
  pygame.sprite.Sprite.__init__(self)
  self.image=pygame.Surface([width,height])
  self.image.fill(bg_color)
  self.image.set_colorkey(bg_color)
  pygame.draw.ellipse(self.image,color,[0,0,width,height])
  self.rect=self.image.get_rect()
  self.rect.left=x
  self.rect.top=y
  '''角色类'''
  class Player(pygame.sprite.Sprite):
  def __init__(self,x,y,role_image_path):
  pygame.sprite.Sprite.__init__(self)
  self.role_name=role_image_path.split('/')[-1].split('.')[0]
  self.base_image=pygame.image.load(role_image_path).convert()
  self.image=self.base_image.copy()
  self.rect=self.image.get_rect()
  self.rect.left=x
  self.rect.top=y
  self.prev_x=x
  self.prev_y=y
  self.base_speed=[30,30]
  self.speed=[0,0]
  self.is_move=False
  self.tracks=[]
  self.tracks_loc=[0,0]
  '''改变速度方向'''
  def changeSpeed(self,direction):
  if direction[0]<0:
  self.image=pygame.transform.flip(self.base_image,True,False)
  elif direction[0]>0:
  self.image=self.base_image.copy()
  elif direction[1]<0:
  self.image=pygame.transform.rotate(self.base_image,90)
  elif direction[1]>0:
  self.image=pygame.transform.rotate(self.base_image,-90)
  self.speed=[direction[0]*self.base_speed[0],direction[1]*self.base_speed[1]]
  return self.speed
  '''更新角色位置'''
  def update(self,wall_sprites,gate_sprites):
  if not self.is_move:
  return False
  x_prev=self.rect.left
  y_prev=self.rect.top
  self.rect.left+=self.speed[0]
  self.rect.top+=self.speed[1]
  is_collide=pygame.sprite.spritecollide(self,wall_sprites,False)
  if gate_sprites is not None:
  if not is_collide:
  is_collide=pygame.sprite.spritecollide(self,gate_sprites,False)
  if is_collide:
  self.rect.left=x_prev
  self.rect.top=y_prev
  return False
  return True
  '''生成随机的方向'''
  def randomDirection(self):
  return random.choice([[-0.5,0],[0.5,0],[0,0.5],[0,-0.5]])


  3)定义关卡:Levels.py


  import pygame
  from.Sprites import*
  '''关卡数量'''
  NUMLEVELS=1
  '''关卡一'''
  class Level1():
  def __init__(self):
  self.info='level1'
  '''创建墙'''
  def setupWalls(self,wall_color):
  self.wall_sprites=pygame.sprite.Group()
  wall_positions=[
  [0,0,6,600],[0,0,600,6],[0,600,606,6],[600,0,6,606],[300,0,6,66],[60,60,186,6],
  [360,60,186,6],[60,120,66,6],[60,120,6,126],[180,120,246,6],[300,120,6,66],
  [480,120,66,6],[540,120,6,126],[120,180,126,6],[120,180,6,126],[360,180,126,6],
  [480,180,6,126],[180,240,6,126],[180,360,246,6],[420,240,6,126],[240,240,42,6],
  [324,240,42,6],[240,240,6,66],[240,300,126,6],[360,240,6,66],[0,300,66,6],
  [540,300,66,6],[60,360,66,6],[60,360,6,186],[480,360,66,6],[540,360,6,186],
  [120,420,366,6],[120,420,6,66],[480,420,6,66],[180,480,246,6],[300,480,6,66],
  [120,540,126,6],[360,540,126,6]
  ]
  for wall_position in wall_positions:
  wall=Wall(*wall_position,wall_color)
  self.wall_sprites.add(wall)
  return self.wall_sprites
  '''创建门'''
  def setupGate(self,gate_color):
  self.gate_sprites=pygame.sprite.Group()
  self.gate_sprites.add(Wall(282,242,42,2,gate_color))
  return self.gate_sprites
  '''创建角色'''
  def setupPlayers(self,hero_image_path,ghost_images_path):
  self.hero_sprites=pygame.sprite.Group()
  self.ghost_sprites=pygame.sprite.Group()
  self.hero_sprites.add(Player(287,439,hero_image_path))
  for each in ghost_images_path:
  role_name=each.split('/')[-1].split('.')[0]
  if role_name=='Blinky':
  player=Player(287,199,each)
  player.is_move=True
  player.tracks=[
  [0,-0.5,4],[0.5,0,9],[0,0.5,11],[0.5,0,3],[0,0.5,7],[-0.5,0,11],[0,0.5,3],
  [0.5,0,15],[0,-0.5,15],[0.5,0,3],[0,-0.5,11],[-0.5,0,3],[0,-0.5,11],[-0.5,0,3],
  [0,-0.5,3],[-0.5,0,7],[0,-0.5,3],[0.5,0,15],[0,0.5,15],[-0.5,0,3],[0,0.5,3],
  [-0.5,0,3],[0,-0.5,7],[-0.5,0,3],[0,0.5,7],[-0.5,0,11],[0,-0.5,7],[0.5,0,5]
  ]
  self.ghost_sprites.add(player)
  elif role_name=='Clyde':
  player=Player(319,259,each)
  player.is_move=True
  player.tracks=[
  [-1,0,2],[0,-0.5,4],[0.5,0,5],[0,0.5,7],[-0.5,0,11],[0,-0.5,7],
  [-0.5,0,3],[0,0.5,7],[-0.5,0,7],[0,0.5,15],[0.5,0,15],[0,-0.5,3],
  [-0.5,0,11],[0,-0.5,7],[0.5,0,3],[0,-0.5,11],[0.5,0,9]
  ]
  self.ghost_sprites.add(player)
  elif role_name=='Inky':
  player=Player(255,259,each)
  player.is_move=True
  player.tracks=[
  [1,0,2],[0,-0.5,4],[0.5,0,10],[0,0.5,7],[0.5,0,3],[0,-0.5,3],
  [0.5,0,3],[0,-0.5,15],[-0.5,0,15],[0,0.5,3],[0.5,0,15],[0,0.5,11],
  [-0.5,0,3],[0,-0.5,7],[-0.5,0,11],[0,0.5,3],[-0.5,0,11],[0,0.5,7],
  [-0.5,0,3],[0,-0.5,3],[-0.5,0,3],[0,-0.5,15],[0.5,0,15],[0,0.5,3],
  [-0.5,0,15],[0,0.5,11],[0.5,0,3],[0,-0.5,11],[0.5,0,11],[0,0.5,3],[0.5,0,1]
  ]
  self.ghost_sprites.add(player)
  elif role_name=='Pinky':
  player=Player(287,259,each)
  player.is_move=True
  player.tracks=[
  [0,-1,4],[0.5,0,9],[0,0.5,11],[-0.5,0,23],[0,0.5,7],[0.5,0,3],
  [0,-0.5,3],[0.5,0,19],[0,0.5,3],[0.5,0,3],[0,0.5,3],[0.5,0,3],
  [0,-0.5,15],[-0.5,0,7],[0,0.5,3],[-0.5,0,19],[0,-0.5,11],[0.5,0,9]
  ]
  self.ghost_sprites.add(player)
  return self.hero_sprites,self.ghost_sprites
  '''创建食物'''
  def setupFood(self,food_color,bg_color):
  self.food_sprites=pygame.sprite.Group()
  for row in range(19):
  for col in range(19):
  if(row==7 or row==8)and(col==8 or col==9 or col==10):
  continue
  else:
  food=Food(30*col+32,30*row+32,4,4,food_color,bg_color)
  is_collide=pygame.sprite.spritecollide(food,self.wall_sprites,False)
  if is_collide:
  continue
  is_collide=pygame.sprite.spritecollide(food,self.hero_sprites,False)
  if is_collide:
  continue
  self.food_sprites.add(food)
  return self.food_sprites
  4)主程序Game.py
  import sys
  import cfg
  import pygame
  import modules.Levels as Levels
  '''开始某一关游戏'''
  def startLevelGame(level,screen,font):
  clock=pygame.time.Clock()
  SCORE=0
  wall_sprites=level.setupWalls(cfg.SKYBLUE)
  gate_sprites=level.setupGate(cfg.WHITE)
  hero_sprites,ghost_sprites=level.setupPlayers(cfg.HEROPATH,[cfg.BlinkyPATH,cfg.ClydePATH,cfg.InkyPATH,cfg.PinkyPATH])
  food_sprites=level.setupFood(cfg.YELLOW,cfg.WHITE)
  is_clearance=False
  while True:
  for event in pygame.event.get():
  if event.type==pygame.QUIT:
  sys.exit(-1)
  pygame.quit()
  if event.type==pygame.KEYDOWN:
  if event.key==pygame.K_LEFT:
  for hero in hero_sprites:
  hero.changeSpeed([-1,0])
  hero.is_move=True
  elif event.key==pygame.K_RIGHT:
  for hero in hero_sprites:
  hero.changeSpeed([1,0])
  hero.is_move=True
  elif event.key==pygame.K_UP:
  for hero in hero_sprites:
  hero.changeSpeed([0,-1])
  hero.is_move=True
  elif event.key==pygame.K_DOWN:
  for hero in hero_sprites:
  hero.changeSpeed([0,1])
  hero.is_move=True
  if event.type==pygame.KEYUP:
  if(event.key==pygame.K_LEFT)or(event.key==pygame.K_RIGHT)or(event.key==pygame.K_UP)or(event.key==pygame.K_DOWN):
  hero.is_move=False
  screen.fill(cfg.BLACK)
  for hero in hero_sprites:
  hero.update(wall_sprites,gate_sprites)
  hero_sprites.draw(screen)
  for hero in hero_sprites:
  food_eaten=pygame.sprite.spritecollide(hero,food_sprites,True)
  SCORE+=len(food_eaten)
  wall_sprites.draw(screen)
  gate_sprites.draw(screen)
  food_sprites.draw(screen)
  for ghost in ghost_sprites:
  #幽灵随机运动(效果不好且有BUG)
  '''
  res=ghost.update(wall_sprites,None)
  while not res:
  ghost.changeSpeed(ghost.randomDirection())
  res=ghost.update(wall_sprites,None)
  '''
  #指定幽灵运动路径
  if ghost.tracks_loc[1]<ghost.tracks[ghost.tracks_loc[0]][2]:
  ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2])
  ghost.tracks_loc[1]+=1
  else:
  if ghost.tracks_loc[0]<len(ghost.tracks)-1:
  ghost.tracks_loc[0]+=1
  elif ghost.role_name=='Clyde':
  ghost.tracks_loc[0]=2
  else:
  ghost.tracks_loc[0]=0
  ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2])
  ghost.tracks_loc[1]=0
  if ghost.tracks_loc[1]<ghost.tracks[ghost.tracks_loc[0]][2]:
  ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2])
  else:
  if ghost.tracks_loc[0]<len(ghost.tracks)-1:
  loc0=ghost.tracks_loc[0]+1
  elif ghost.role_name=='Clyde':
  loc0=2
  else:
  loc0=0
  ghost.changeSpeed(ghost.tracks[loc0][0:2])
  ghost.update(wall_sprites,None)
  ghost_sprites.draw(screen)
  score_text=font.render("Score:%s"%SCORE,True,cfg.RED)
  screen.blit(score_text,[10,10])
  if len(food_sprites)==0:
  is_clearance=True
  break
  if pygame.sprite.groupcollide(hero_sprites,ghost_sprites,False,False):
  is_clearance=False
  break
  pygame.display.flip()
  clock.tick(10)
  return is_clearance
  '''显示文字'''
  def showText(screen,font,is_clearance,flag=False):
  clock=pygame.time.Clock()
  msg='Game Over!'if not is_clearance else'Congratulations,you won!'
  positions=[[235,233],[65,303],[170,333]]if not is_clearance else[[145,233],[65,303],[170,333]]
  surface=pygame.Surface((400,200))
  surface.set_alpha(10)
  surface.fill((128,128,128))
  screen.blit(surface,(100,200))
  texts=[font.render(msg,True,cfg.WHITE),
  font.render('Press ENTER to continue or play again.',True,cfg.WHITE),
  font.render('Press ESCAPE to quit.',True,cfg.WHITE)]
  while True:
  for event in pygame.event.get():
  if event.type==pygame.QUIT:
  sys.exit()
  pygame.quit()
  if event.type==pygame.KEYDOWN:
  if event.key==pygame.K_RETURN:
  if is_clearance:
  if not flag:
  return
  else:
  main(initialize())
  else:
  main(initialize())
  elif event.key==pygame.K_ESCAPE:
  sys.exit()
  pygame.quit()
  for idx,(text,position)in enumerate(zip(texts,positions)):
  screen.blit(text,position)
  pygame.display.flip()
  clock.tick(10)
  '''初始化'''
  def initialize():
  pygame.init()
  icon_image=pygame.image.load(cfg.ICONPATH)
  pygame.display.set_icon(icon_image)
  screen=pygame.display.set_mode([606,606])
  pygame.display.set_caption('吃豆豆小游戏')
  return screen
  '''主函数'''
  def main(screen):
  pygame.mixer.init()
  pygame.mixer.music.load(cfg.BGMPATH)
  pygame.mixer.music.play(-1,0.0)
  pygame.font.init()
  font_small=pygame.font.Font(cfg.FONTPATH,18)
  font_big=pygame.font.Font(cfg.FONTPATH,24)
  for num_level in range(1,Levels.NUMLEVELS+1):
  level=getattr(Levels,f'Level{num_level}')()
  is_clearance=startLevelGame(level,screen,font_small)
  if num_level==Levels.NUMLEVELS:
  showText(screen,font_big,is_clearance,True)
  else:
  showText(screen,font_big,is_clearance)
  '''run'''
  if __name__=='__main__':
  main(initialize())


  三、效果展示

05.png

  截图展示


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

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

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

相关文章

  • Python+Pygame实操之玩命水果游戏的完成

      吃豆人和削苹果这两个游戏想必大家都知道吧,本文运用Python里的Pygame控制模块编写出一个融合吃豆人+切水果的新手游:玩命吃苹果,有兴趣的话可以认识一下  引言  哈哈哈!木木子今天浮现——早已来给大家看了不少具体内容啦~  涉及到的人工智能、新手、网络爬虫、数据统计分析(这一块的通常但是审批)手机游戏...  PS:  吃豆人我写过了哈  Python+Pygame实战之吃豆豆游戏的实...

    89542767 评论0 收藏0
  • Python面向对象练习-通过pygame改良乌龟

    摘要:先看看最后效果图片的话是从网上小鱼儿那个案例里面拿的,实现的功能如下是通过方向键操作乌龟,进行吃鱼吃鱼的时候根据乌龟的坐标和鱼的进行检测,在碰撞区域则干掉这条鱼背景音乐和吃鱼音乐的播放分数累积鱼的平滑游动控制帧频实现代码导入一些常用的函数乌 先看看最后效果 图片的话是从网上小鱼儿那个案例里面拿的,实现的功能如下: 是通过方向键操作乌龟,进行吃鱼 吃鱼的时候根据乌龟的x,y坐标和鱼的x...

    jk_v1 评论0 收藏0
  • 秀的一批,那些你不得不知的 Python 杀手级框架!

    摘要:那在届有哪些被封神的库呢,今天就给大家介绍十个堪称杀手级别的工具包。该库是在之上完善的,自此请求就变得异常的简单,一行代码即可搞定。这是最流行的网络爬虫框架库,没有之一。最好用的框架。图像处理,该库是你的不二之选。 文 | 豆豆 来源:Python 技术「ID: pythonall」 ...

    ninefive 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • 30个Python游戏,上班摸鱼我能玩一天【内附源码】

    摘要:源码分享主函数游戏初始化九歌播放背景音乐游戏主循环按键检测更新贪吃蛇和食物判断游戏是否结束显示游戏里必要的元素屏幕更新普普通通玩法详细介绍源码点小游戏玩法通过加减乘除操作小学生都没问题的。 大家好,我是辣条。 今天给大家带来30个py小游戏,一定要收藏࿰...

    番茄西红柿 评论0 收藏2637

发表评论

0条评论

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