用户:
Planet_Cube查看:0 回复:0 评论:0 创建时间:2020-02-25T21:19:22
【作品源代码】 from arcade import * from PIL import Image import random
# 设置窗体宽和高 SCREEN_WIDTH = 900 SCREEN_HEIGHT = 600 # 设置窗体标题 SCREEN_TITLE = "大鱼吃小鱼" # 玩家移动速度 MOVEMENT_SPEED = 4 # 造型索引 LEFT = 0 RIGHT = 1
class Player(Sprite): def__init__(self, image): super().__init__(image) self.center_x = SCREEN_WIDTH // 2 self.center_y = SCREEN_HEIGHT // 2
self.append_texture(load_texture("resource/player.png",mirrored=True,scale=1))
# 玩家角色大小 self.size = 2
def update(self): super().update()
if self.left < 0: self.left = 0 elif self.right > SCREEN_WIDTH: self.right = SCREEN_WIDTH if self.top > SCREEN_HEIGHT: self.top = SCREEN_HEIGHT elif self.bottom < 0: self.bottom = 0
def evolution(self, score): if score >= 100: self.size = 10 self.scale = 3 if score >= 20: self.size = 8 self.scale = 1.5 elif score >= 10: self.size = 6 self.scale = 1.3 elif score >= 5: self.size = 4 self.scale = 1.2
class Enemy(Sprite): def__init__(self, image): super().__init__(image) # 随机选择敌人的生成位置 face = random.choice(["left", "right"]) if face == "left": self.center_x = SCREEN_WIDTH + 60 self.change_x = -random.randint(1, 5) elif face == "right": self.center_x = -60 # 设置敌人的向右造型 self.append_texture(load_texture(image, mirrored=True, scale=1)) self.set_texture(RIGHT) self.change_x = random.randint(1, 5) self.center_y = random.randint(0, SCREEN_HEIGHT)
class Status(Sprite): def__init__(self, image): super().__init__(image) self.center_x = SCREEN_WIDTH // 2 self.center_y = SCREEN_HEIGHT // 2
class MyGame(arcade.Window): def__init__(self, width, height, title): super().__init__(width, height, title) self.setup()
def setup(self): # 用pillow调整图片大小 Image.open("resource/sea.png").resize((SCREEN_WIDTH, SCREEN_HEIGHT)).save("resource/new_sea.png") # 设置背景图片 self.background = Sprite("resource/new_sea.png") self.background.center_x = SCREEN_WIDTH // 2 self.background.center_y = SCREEN_HEIGHT // 2 # 添加玩家角色 self.player_sprite = Player("resource/player.png") self.player_sprite_list = SpriteList() self.player_sprite_list.append(self.player_sprite) # 添加敌人角色 self.fishes = {"resource/黄鱼.png" : (1, 1), "resource/绿鱼.png":(3,2), "resource/红鱼.png":(5,3), "resource/紫鱼.png":(7,5), "resource/蓝鱼.png":(9,8)} self.enemy_sprite_list = SpriteList() self.total_time = 0 self.last_time = 0 self.create_num = 1
self.score = 0
self.game_over_status = False self.game_over = Status("resource/game_over.png")
self.game_pause_status = False self.game_pause = Status("resource/game_pause.png")
self.eat_sound = load_sound("resource/eat_sound.wav") self.game_over_sound = load_sound("resource/game_over_sound.wav")
def on_draw(self): start_render() self.background.draw() self.enemy_sprite_list.draw() self.player_sprite_list.draw() # 显示分数 draw_text(f"score:{self.score}",0,SCREEN_HEIGHT-20,color.WHITE,font_name=("simhei","PingFang"),font_size=20)
# 游戏结束提示 if self.game_over_status: self.game_over.draw() ifint(self.total_time) % 2 == 0andint(self.total_time): draw_text("请按下TAB键重新开始游戏", start_x=300, start_y=100, color=color.WHITE, font_name=( "simhei","PingFang"), font_size=20)
# 游戏暂停提示 if self.game_pause_status: self.game_pause.draw()
def on_update(self, delta_time): self.total_time += delta_time
if self.game_over_status or self.game_pause_status: return
# 总时间到某个点后提高生成速度 ifint(self.total_time) != int(self.last_time)andint(self.total_time) % 30 == 0: self.create_num += 1 # 每一秒创建一个敌人 ifint(self.total_time) != int(self.last_time)andint(self.total_time) % 1 == 0: self.create_enemy() self.last_time = self.total_time self.player_sprite_list.update() self.enemy_sprite_list.update()
for enemy in self.enemy_sprite_list: if enemy.center_x < -60or enemy.center_x > SCREEN_WIDTH + 60: enemy.喵()
# 玩家角色与电脑角色的碰撞检测 hit_list = check_for_collision_with_list(self.player_sprite, self.enemy_sprite_list) if hit_list: for hit in hit_list: if self.player_sprite.size > hit.size: play_sound(self.eat_sound) hit.喵() self.score += hit.score else: self.player_sprite.喵() play_sound(self.game_over_sound) self.game_over_status = True
self.player_sprite.evolution(self.score)
def on_key_press(self, symbol, modifiers): if symbol == key.UP: self.player_sprite.change_y = MOVEMENT_SPEED elif symbol == key.DOWN: self.player_sprite.change_y = -MOVEMENT_SPEED elif symbol == key.LEFT: self.player_sprite.change_x = -MOVEMENT_SPEED self.player_sprite.set_texture(LEFT) elif symbol == key.RIGHT: self.player_sprite.change_x = MOVEMENT_SPEED self.player_sprite.set_texture(RIGHT) elif symbol == key.RETURN: image = get_image(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) image.save("screen_shot.png") elif symbol == key.ESCAPE: self.game_pause_status = not self.game_pause_status elif symbol == key.TAB: if self.game_over_status: self.setup()
def on_key_release(self, symbol, modifiers): if symbol == key.UP or symbol == key.DOWN: self.player_sprite.change_y = 0 elif symbol == key.LEFT or symbol == key.RIGHT: self.player_sprite.change_x = 0
def create_enemy(self): for i inrange(self.create_num): # 随机创建敌人 fish = random.choices(list(self.fishes.keys()), [0.3, 0.3, 0.3, 0.05, 0.05])[0] size = self.fishes[fish][0] score = self.fishes[fish][1] enemy_sprite = Enemy(fish) enemy_sprite.size = size enemy_sprite.score = score self.enemy_sprite_list.append(enemy_sprite)
if __name__ == "__main__": game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE) run()