""" 多关卡金币收集小游戏,这个是用Arcade街机游戏模块制作的一个多关卡金币收集游戏。 安装街机模块请用:pip install arcade """ import random import arcade import os SPRITE_SCALING = 0.5 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 SCREEN_TITLE = "python的街机模块实现的多关卡金币收集小游戏" class FallingCoin(arcade.Sprite): """ Simple sprite that falls down """ def update(self): """ Move the coin """ # y坐标减小 self.center_y -= 2 # 如果到了最底下那么移到最上面 if self.top < 0: self.bottom = SCREEN_HEIGHT class RisingCoin(arcade.Sprite): """ Simple sprite that falls up """ def update(self): """ Move the coin """ # y坐标增加 self.center_y += 2 # 如果到了最上面那么移到最底下 if self.bottom > SCREEN_HEIGHT: self.top = 0 class MyGame(arcade.Window): """ Main application class. """ def __init__(self, width, height, title): """ Initialize """ # 调用父类初始化方法 super().__init__(width, height, title) # 设置工作目录 file_path = os.path.dirname(os.path.abspath(__file__)) os.chdir(file_path) # 列表定义 self.player_list = None self.coin_list = None # 玩家信息相关变量定义 self.player_sprite = None self.score = 0 self.level = 1 # 第一关 # 隐藏鼠标指针 self.set_mouse_visible(False) # 设置背景颜色 arcade.set_background_color(arcade.color.AMAZON) def level_1(self): for i in range(20): # 创建静止的金币 coin = arcade.Sprite("images/coin_01.png", SPRITE_SCALING / 3) # 随机放置位置 coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT) # 增加到金币列表 self.coin_list.append(coin) def level_2(self): for i in range(30): # 创建下落的金币 coin = FallingCoin("images/gold_1.png", SPRITE_SCALING / 2) # 随机放置位置 coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(SCREEN_HEIGHT, SCREEN_HEIGHT * 2) # 增加到金币列表 self.coin_list.append(coin) def level_3(self): for i in range(30): # 创建上升的金币 coin = RisingCoin("images/gold_1.png", SPRITE_SCALING / 2) # 随机放置位置 coin.center_x = random.randrange(SCREEN_WIDTH) coin.center_y = random.randrange(-SCREEN_HEIGHT, 0) # 增加到金币列表 self.coin_list.append(coin) def setup(self): """ Set up the game and initialize the variables. """ self.score = 0 self.level = 1 # 角色列表实例化 self.player_list = arcade.SpriteList() self.coin_list = arcade.SpriteList() # 设置玩家 self.player_sprite = arcade.Sprite("images/character.png", SPRITE_SCALING) self.player_sprite.center_x = 50 self.player_sprite.center_y = 50 self.player_list.append(self.player_sprite) self.level_1() def on_draw(self): """ 渲染屏幕 """ # 此命令要在所有重画命令之前 arcade.start_render() # 画所有角色 self.player_sprite.draw() self.coin_list.draw() # 放显示得分的文本和关卡号 output = f"Score: {self.score}" arcade.draw_text(output, 10, 20, arcade.color.WHITE, 15) output = f"Level: {self.level}" arcade.draw_text(output, 10, 35, arcade.color.WHITE, 15) def on_mouse_motion(self, x, y, dx, dy): """ 鼠标移动事件 """ self.player_sprite.center_x = x self.player_sprite.center_y = y def update(self, delta_time): """ 移动和游戏逻辑""" self.coin_list.update() # 创建玩家和所有金币的碰撞列表 hit_list = arcade.check_for_collision_with_list(self.player_sprite, self.coin_list) # 碰到的金币被删除并且加分. for coin in hit_list: coin.kill() self.score += 1 # 金币收集完了则下一关 if len(self.coin_list) == 0 and self.level == 1: self.level += 1 self.level_2() # See if we should go to level 3 elif len(self.coin_list) == 0 and self.level == 2: self.level += 1 self.level_3() def main(): """ Main method """ window = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) window.setup() arcade.run() if __name__ == "__main__": main()