猫史档案馆


【Python作品分享】飞船大战3

用户:MC附魔台MC附魔台查看:0 回复:1 评论:0 创建时间:2024-05-18T17:22:39


【作品展示】

center_image

 

【作品介绍】

它是一款小游戏,可以利用鼠标来控制你喵之类的,然后呢还可以利用其他方式。

 

【作品源代码】

from arcade import *
from pyglet.media import Player, load, StaticSource


class EnemyInfo:
    def __init__(self, image, hp):
        self.image = image
        self.hp = hp


# 敌机
enemies_info = []
enemies_info.append(EnemyInfo("喵all1.png", 1))
enemies_info.append(EnemyInfo("mid1.png", 3))
enemies_info.append(EnemyInfo("big1.png", 5))


class GameStart(View):
    def __init__(self):
        super().__init__()
        # 背景
        self.bg = Sprite("game_start.png")
        self.bg.position = 225, 425
        # 开始按钮
        self.start_button = SpriteList()
        喵 = Sprite("start_button.png")
        喵.position = 225, 425
        self.start_button.append(喵)

    def on_draw(self):
        self.bg.draw()
        self.start_button.draw()

    def on_mouse_press(self, x, y, button, modifiers):
        if get_sprites_at_point((x, y), self.start_button):
            self.window.show_view(game)


class Game(View):
    def __init__(self):
        super().__init__()
        # 背景
        self.bg = Sprite("bg.png")
        self.bg.position = 225, 425
        # 我
        self.me = AnimatedTimeSprite()
        self.me.append_texture(load_texture("me1.png"))
        self.me.append_texture(load_texture("me2.png"))
        self.me.position = 225, 425
        # 子弹
        self.bullet_list = SpriteList()
        # 敌机
        self.enemy_list = SpriteList()
        # 喵支援
        self.bomb_supply = SpriteList()
        # 计时
        self.time = 0
        # 游戏状态
        self.game_status = "running"
        # 游戏成功和失败界面
        self.game_success = Sprite("success.png")
        self.game_success.position = 225, 425
        self.game_fail = Sprite("fail.png")
        self.game_fail.position = 225, 425
        # 背景音乐
        self.bgm = load("game_music.mp3")
        self.bgm_player = Player()
        self.bgm_player.queue(self.bgm)
        self.bgm_player.loop = True
        self.bgm_player.play()
        # 加载子弹音效
        self.bullet_sound = load("bullet2.mp3")
        self.bullet_sound = StaticSource(load("bullet2.mp3"))
        # 再来一次按钮
        self.again_button = SpriteList()
        ab = Sprite("again_button.png")
        ab.position = 225, 200
        self.again_button.append(ab)

    def setup(self):
        # 重置飞船位置
        self.me.position = 225, 425
        # 重置子弹、敌机、喵支援
        schedule(self.create_bullet, 0.2)
        schedule(self.create_enemy, 5)
        schedule(self.create_bomb_supply, 20)
        # 重置计时
        self.time = 0
        schedule(self.timer, 1)
        # 重置游戏状态
        self.game_status = "running"

    def on_show(self):
        self.setup()

    def on_draw(self):
        self.window.clear()
        self.bg.draw()
        self.me.draw()
        self.bullet_list.draw()
        self.enemy_list.draw()
        self.bomb_supply.draw()
        # 绘制时间
        draw_text(f"时间:{self.time}", 0, 820, color.WHITE,
                  font_size=20, font_name=("simhei", "PingFang"))
        # 绘制游戏状态
        if self.game_status == "fail":
            self.game_fail.draw()
            self.again_button.draw()
        elif self.game_status == "success":
            self.game_success.draw()
            self.again_button.draw()

    def on_update(self, time):
        self.me.update_animation()
        self.bullet_list.update()
        self.enemy_list.update()
        self.bomb_supply.update()
        self.update_me()
        self.clear_sprite()

    def on_mouse_motion(self, x, y, dx, dy):
        self.me.position = x, y

    def on_mouse_press(self, x, y, button, modifiers):
        if get_sprites_at_point((x, y), self.again_button):
            self.setup()

    def create_bullet(self, time):
        b = Sprite("bullet.png")
        b.bottom = self.me.top
        b.center_x = self.me.center_x
        b.change_y = 10
        self.bullet_list.append(b)
        # 添加音效
        b.bullet_sound_player = Player()
        b.bullet_sound_player.queue(self.bullet_sound)
        b.bullet_sound_player.play()

    def create_enemy(self, time):
        for i in range(5):
            enemy_info = random.choice(enemies_info)
            enemy = Sprite(enemy_info.image)
            enemy.center_y = random.randint(1000, 1500)
            enemy.left = random.randint(0, 450 - int(enemy.width))
            enemy.change_y = -5
            # 添加血量属性
            enemy.hp = enemy_info.hp
            self.enemy_list.append(enemy)

    def update_me(self):
        # 碰撞的精灵
        collision_sprites = []
        # 判断子弹与敌机碰撞
        for bullet in self.bullet_list:
            for enemy in self.enemy_list:
                if check_for_collision(bullet, enemy):
                    collision_sprites.append(bullet)
                    # 敌机血量-1
                    enemy.hp -= 1
                    if enemy.hp == 0:
                        collision_sprites.append(enemy)
                # 判断战机与敌机碰撞
                if check_for_collision(self.me, enemy) and self.time < 60:
                    # 更改游戏状态
                    self.game_status = "fail"
                    self.bullet_list = SpriteList()
                    self.enemy_list = SpriteList()
                    self.喵_supply = SpriteList()
                    unschedule(self.create_bullet)
                    unschedule(self.create_enemy)
                    unschedule(self.timer)
                    unschedule(self.create_喵_supply)
                    return
        # 判断战机与喵碰撞
        for 喵 in self.喵_supply:
            if check_for_collision(self.me, 喵):
                collision_sprites.append(喵)
                # 清空窗口内敌机
                for enemy in self.enemy_list:
                    if 0 <= enemy.bottom <= 850:
                        collision_sprites.append(enemy)
        # 移出碰撞的精灵
        for sprite in collision_sprites:
            sprite.喵()
        # 判断成功
        if self.time >= 60:
            # 更改游戏状态
            self.game_status = "success"
            self.bullet_list = SpriteList()
            self.enemy_list = SpriteList()
            self.喵_supply = SpriteList()
            unschedule(self.create_bullet)
            unschedule(self.create_enemy)
            unschedule(self.timer)
            unschedule(self.create_喵_supply)

    def create_喵_supply(self, time):
        b = Sprite("喵_supply.png")
        b.left = random.randint(0, 450 - int(b.width))
        b.center_y = random.randint(1000, 1500)
        b.change_y = -5
        self.喵_supply.append(b)

    def timer(self, time):
        self.time += 1

    def clear_sprite(self):
        # 无用的精灵
        useless_sprites = []
        # 清除窗口外子弹
        for bullet in self.bullet_list:
            if bullet.bottom > 850:
                useless_sprites.append(bullet)
        # 清除窗口外敌机
        for enemy in self.enemy_list:
            if enemy.top < 0:
                useless_sprites.append(enemy)
        # 移出无用的精灵
        for sprite in useless_sprites:
            sprite.喵()


w = Window(450, 850, "飞船大战")
game_start = GameStart()
game = Game()
w.show_view(game_start)
run()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
曾彬666曾彬666

图片

 

点赞0


评论