赞
踩
昨晚玩起了小时候玩的游戏“吃豆豆”,但是我发现,一局游戏三条命,我根本不能吃完所有的豆豆,总是被敌人吃掉,
于是,我在想怎么能够保证我达到吃完所有豆豆的目标,然后我就想到了一个办法:
自己找资料找素材学习仿写了一款吃豆豆的小游戏,然后给我自己无限开挂!
哈哈哈!这不?完全解决了我的问题,完美的躺赢了!聪明的我.jpg
首先找到吃豆豆游戏的界面按照上面的素材找找准备下相似的图片!如下:
本文的环境都跟之前的差不多:Python3、Pycharm、Pygame模块。
- 模块安装:
-
- pip install -i https://pypi.douban.com/simple/ pygame
这款吃豆豆的小游戏:主要分为4块主要内容,分别是。Levels.py、Sprites.py、cfg.py、Game.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')
- 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]])
- 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
- 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())
如需完整的源码主页源码基地免费领取啦~
Python小游戏之如何在“吃豆豆”小游戏中赢得胜利?
童年的吃豆豆游戏,用Python找回来!如果有帮助到你,记得三连哦~哈哈哈!
关注小编,获取更多精彩内容啦~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。