吃豆 游戏,豆豆吃豆豆的游戏

  吃豆 游戏,豆豆吃豆豆的游戏

  本文主要介绍如何利用Python中的Pygame模块实现模仿吃豌豆的游戏。文中的样例代码讲解的很详细,对我们学习Python游戏开发很有帮助。有需要的可以参考一下。

  00-1010简介一、首先二、正式开始三、效果展示

  

目录

  昨晚玩了小时候的游戏“吃豌豆”,发现一局吃不完所有的豌豆,总是被敌人吃掉。

  于是,我就在想怎么保证自己能达到把豌豆都吃完的目标,然后我就想到了一个办法:

  找资料和素材学习模仿一个吃豌豆的小游戏,然后自己开!

  哈哈哈!没有吗?彻底解决了我的问题,完美撒谎赢了!聪明的我。使用jpeg文件交换格式存储的编码图像文件扩展名

  

导语

  1)材料

  首先找到吃豌豆游戏的界面,根据上面的材料寻找相似的图片!如下所示:

  2)环境

  本文的环境和前面的差不多:Python3,Pycharm,Pygame模块。

  模块安装:

  皮普安装-我https://pypi.douban.com/simple/皮游戏

  

一、首先

  这个吃豌豆的小游戏:主要分为四个主要内容,即。关卡. py、精灵. py、cfg.py、游戏. py

  1)配置文件:cfg.py

  导入操作系统

  定义一些颜色

  黑色=(0,0,0)

  白色=(255,255,255)

  蓝色=(0,0,255)

  绿色=(0,255,0)

  红色=(255,0,0)

  黄色=(255,255,0)

  紫色=(255,0,255)

  SKYBLUE=(0,191,255)

  游戏素材路径

  BGMPATH=os.path.join(os.getcwd(), resources/sounds/bg.mp3 )

  icon path=OS . path . join(OS . getcwd(), resources/images/icon.png )

  font path=OS . path . join(OS . getcwd(), resources/font/ALGER。TTF’)

  hero path=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 )

  pinky path=OS . path . join(OS . getcwd(), resources/images/Pinky.png )

  2)定义一些elf类:Sprites.py

  随机导入

  导入pygame

  墙壁等级

  班级墙(pygame.sprite.Sprite):

  def __init__(self,x,y,宽度,高度,颜色,**kwargs):

  py game . sprite . sprite . _ _ init _ _(self)

  self.image=pygame。表面([宽度,高度])

  self.image.fill(颜色)

  self.rect=self.image.get_rect()

  self.rect.left=x

  self.rect.top=y

  食品类别

  类食物(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, fLevel{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())

  

  

三、效果展示

  截图展示

  

  以上就是Python+Pygame实战之吃豆豆游戏的实现的详细内容,更多关于Python Pygame吃豆豆游戏的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: