• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Pygame做一期吃豆子游戏的示例代码

    Pygame的历史

    Pygame是一个利用SDL库的写就的游戏库,SDL呢,全名Simple DirectMedia Layer,是一位叫做Sam Lantinga的大牛写的,据说他为了让Loki(致力于向Linux上移植Windows的游戏的一家大好人公司,可惜已经倒闭,唉好人不长命啊……)更有效的工作,创造了这个东东。

    SDL是用C写的,不过它也可以使用C++进行开发,当然还有很多其它的语言,Pygame就是Python中使用它的一个库。Pygame已经存在很多时间了,许多优秀的程序员加入其中,把Pygame做得越来越好。

    开发工具:

    Python版本:3.6.4
    相关模块:
    pygame模块;
    以及一些Python自带的模块。

    安装Python并添加到环境变量,
    pip安装需要的相关模块即可。

    游戏简介:

    玩家通过↑↓←→键控制游戏的主角吃豆人吃掉藏在迷宫内的所有豆子,并且不能被鬼魂抓到。
    若能顺利吃完迷宫内的所有豆子并且不被鬼魂抓到,则游戏胜利,否则游戏失败。

    Step1:定义游戏精灵类

    ① 墙类:


    ② 食物类:


    ③ 角色类:

    角色类包括吃豆人和鬼魂,鬼魂由电脑控制其运动轨迹,吃豆人由玩家控制其运动轨迹。
    显然,其均需具备更新角色位置和改变角色运动方向的能力,其源代码如下:

    Step2:设计游戏地图

    ① 创建墙:


    ② 创建门:


    ③ 创建角色:


    ④ 创建食物:

    Step3:设计游戏主循环

    接下来开始设计游戏主循环。首先是初始化:


    然后定义主函数:


    其中startLevelGame函数用于开始某一关游戏,其源代码如下:


    showText函数用于在游戏结束或关卡切换时在游戏界面中显示提示性文字,其源代码如下:

    源代码:

    #吃豆子
    import os,sys
    import sys
    import pygame
    import random
    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)
    if getattr(sys, 'frozen', False):
      cur_path = sys._MEIPASS
    else:
      cur_path = os.path.dirname(__file__)
    BGMPATH = os.path.join(cur_path, 'resources/sounds/bg.mp3')
    ICONPATH = os.path.join(cur_path,'resources/images/icon.png')
    FONTPATH = os.path.join(cur_path,'resources/font/ALGER.TTF')
    HEROPATH = os.path.join(cur_path,'resources/images/pacman.png')
    BlinkyPATH = os.path.join(cur_path,'resources/images/Blinky.png')
    ClydePATH = os.path.join(cur_path,'resources/images/Clyde.png')
    InkyPATH = os.path.join(cur_path,'resources/images/Inky.png')
    PinkyPATH = os.path.join(cur_path,'resources/images/Pinky.png')
    NUMLEVELS = 1
    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]])
    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
    def startLevelGame(level, screen, font):
      clock = pygame.time.Clock()
      SCORE = 0
      wall_sprites = level.setupWalls(SKYBLUE)
      gate_sprites = level.setupGate(WHITE)
      hero_sprites, ghost_sprites = level.setupPlayers(HEROPATH, [BlinkyPATH, ClydePATH, InkyPATH, PinkyPATH])
      food_sprites = level.setupFood(YELLOW, WHITE)
      is_clearance = False
      while True:
        for event in pygame.event.get():
          if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit(-1)
          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(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:
          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, 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, WHITE),
    			  font.render('Press ENTER to continue or play again.', True, WHITE),
    			  font.render('Press ESCAPE to quit.', True, WHITE)]
      while True:
        for event in pygame.event.get():
          if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit(-1)
          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:
              pygame.quit()
              sys.exit(-1)
        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(ICONPATH)
      pygame.display.set_icon(icon_image)
      screen = pygame.display.set_mode([606, 606])
      pygame.display.set_caption('吃豆子')
      return screen
    
    def main(screen):
      try:
        pygame.mixer.init()
        pygame.mixer.music.load(BGMPATH)
        pygame.mixer.music.play(-1, 0.0)
      except:
        pass
      pygame.font.init()
      font_small = pygame.font.Font(FONTPATH, 18)
      font_big = pygame.font.Font(FONTPATH, 24)
      for num_level in range(1, NUMLEVELS+1):
        if num_level == 1:
          level = Level1()
          is_clearance = startLevelGame(level, screen, font_small)
          if num_level == NUMLEVELS:
            showText(screen, font_big, is_clearance, True)
          else:
            showText(screen, font_big, is_clearance)
    if __name__ == "__main__":
      main(initialize())
    

    到此这篇关于Pygame做一期吃豆子游戏的示例代码的文章就介绍到这了,更多相关Pygame 吃豆子内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python3+Pygame实现射击游戏完整代码
    • python pygame 愤怒的小鸟游戏示例代码
    • python基于pygame实现飞机大作战小游戏
    • python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
    • 使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
    • 教你如何在Pygame 中移动你的游戏角色
    上一篇:Python3+Pygame实现射击游戏完整代码
    下一篇:浅谈pandas中对nan空值的判断和陷阱
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Pygame做一期吃豆子游戏的示例代码 Pygame,做,一期,吃,豆子,游,