Python

当前位置:首页 > Python

Python+Pygame实战之吃豆豆游戏的实现 - Python

目录导语​一、首先​二、正式开始三、效果展示导语​​昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被敌人吃掉于是,...
目录

导语​

​昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被敌人吃掉

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

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

哈哈哈!这不?完全解决了我的问题,完美的躺赢了!聪明的我.jpg

一、首先

1)素材

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

2)环境

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

模块安装:

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

​二、正式开始

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

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 randomimport 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 pygamefrom .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 sysimport cfgimport pygameimport 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())

三、效果展示

截图展示

以上就是Python+Pygame实战之吃豆豆游戏的实现的详细内容,更多关于Python Pygame吃豆豆游戏的资料请关注之家其它相关文章!

相关内容

文章评论

表情

共 0 条评论,查看全部
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

评论排行榜

热门标签