pygame简易飞机大战

代码如下

import sys

from pygame import *
from os import *
from random import *

chdir(r"C:\Users\Administrator\PycharmProjects\pythonProject\SurfaceWar\resources")  # 改变工作目录
init()
screen = display.set_mode((600, 700))  # 窗口大小
display.set_caption("PlaneWar")  # 标题


class Player(sprite.Sprite):
    def __init__(self, location, blood):
        sprite.Sprite.__init__(self)
        self.img = image.load("player.png").convert_alpha()
        self.rect = self.img.get_rect()
        self.rect.center = location
        self.moving_right = False  # 是否在试图向某个方向移动
        self.moving_left = False
        self.moving_up = False
        self.moving_down = False
        self.blood = blood  # 血量和分数
        self.score = 0

    def update(self, *args, **kwargs):
        if self.moving_right:  # 移动方式
            if self.rect.x < 570:
                self.rect.x += 1
        if self.moving_left:
            if self.rect.x > 0:
                self.rect.x = self.rect.x - 1
        if self.moving_down:
            if self.rect.y < 650:
                self.rect.y += 1
        if self.moving_up:
            if self.rect.y > 50:
                self.rect.y -= 1


class Enemy(sprite.Sprite):
    enemies = []  # 敌人列表,无需精灵组

    def __init__(self, location: tuple):
        sprite.Sprite.__init__(self)
        self.live = True  # 是否活着
        self.image = image.load("enemy1.png")
        self.rect = self.image.get_rect()
        self.rect.topleft = location
        self.blood = int(game.player.score) / 10 + 1  # 每过10分,血量加1
        Enemy.enemies.append(self)

    def update(self, *args, **kwargs):
        if self.live:
            self.rect.y += 1
            if len(EnemyBullet.enemy_bullets) < 10 and randint(1, 40) == 3:
                EnemyBullet(self)
            if self.rect.y > 800:
                self.live = False
            if self.blood < 0:
                self.live = False
            screen.blit(self.image, self.rect)
        else:
            Enemy.enemies.remove(self)  # 移除该敌机


class PlayerBullet(sprite.Sprite):
    player_bullets = []  # 玩家子弹

    def __init__(self, player: Player):
        sprite.Sprite.__init__(self)
        self.live = True
        self.image = image.load("player_bullet.png").convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = player.rect.center
        self.player = player
        self.sound = mixer.Sound("bullet.wav")
        self.sound.set_volume(0.1)
        self.sound.play()
        PlayerBullet.player_bullets.append(self)

    def update(self, *args, **kwargs):
        if self.live:
            if self.rect.y < 0:  # 已出屏幕
                self.live = False
            else:  # 是否撞击到敌人或敌人子弹
                for i in Enemy.enemies:
                    if self.rect.colliderect(i.rect):
                        i.blood -= 1
                        self.live = False
                        self.player.score += 1
                for i in EnemyBullet.enemy_bullets:
                    if self.rect.colliderect(i.rect):
                        EnemyBullet.enemy_bullets.remove(i)
                        self.live = False
                self.rect.y -= 1
                screen.blit(self.image, self.rect)
        else:
            PlayerBullet.player_bullets.remove(self)


class EnemyBullet(sprite.Sprite):
    enemy_bullets = []

    def __init__(self, enemy: Enemy):
        sprite.Sprite.__init__(self)
        self.image = image.load("enemy_bullet.png").convert_alpha()
        self.live = True
        self.rect = self.image.get_rect()
        self.rect.center = enemy.rect.midbottom
        self.sound = mixer.Sound("bullet.wav")
        EnemyBullet.enemy_bullets.append(self)

    def update(self, player: Player):
        if self.live:
            if self.rect.y > 700:  # 参照PlayerBullet
                self.live = False
            else:
                if self.rect.colliderect(player):
                    player.blood -= 1
                    self.live = False
                else:
                    self.rect.y += 2
            screen.blit(self.image, self.rect)
        else:
            EnemyBullet.enemy_bullets.remove(self)


class Game:  # 游戏类
    def __init__(self, player: Player):
        self.player = player
        self.font = font.SysFont(["方正粗黑宋简体"], 30)

    def event(self):  # 事件管理
        for i in event.get():
            if i.type == QUIT:
                sys.exit(0)
            elif i.type == KEYDOWN:
                if i.key == K_LEFT:
                    self.player.moving_left = True
                elif i.key == K_RIGHT:
                    self.player.moving_right = True
                elif i.key == K_UP:
                    self.player.moving_up = True
                elif i.key == K_DOWN:
                    self.player.moving_down = True
            elif i.type == KEYUP:
                if i.key == K_LEFT:
                    self.player.moving_left = False
                elif i.key == K_RIGHT:
                    self.player.moving_right = False
                elif i.key == K_UP:
                    self.player.moving_up = False
                elif i.key == K_DOWN:
                    self.player.moving_down = False
                elif i.key == K_SPACE:
                    if len(PlayerBullet.player_bullets) < 8:
                        PlayerBullet(self.player)

    def render_player_info(self):  # 显示分数和血量
        screen.blit(self.font.render("Blood:" + str(self.player.blood), 0, "dark blue"), (450, 20))
        screen.blit(self.font.render("Score:" + str(self.player.score), 0, "dark blue"), (50, 20))

    def show_end(self):  # 结束
        end_clock = time.Clock()
        end_clock.tick(5)
        end = self.font.render("Final Score:{}".format(self.player.score), 0, "dark green")
        screen.blit(end, (250, 350))
        screen.blit(self.font.render("Press any key to cancel the game...", 0, "black", "green"), (10, 625))
        display.flip()
        while True:
            for i in event.get():
                if i.type == KEYDOWN:
                    sys.exit()
                elif i.type == QUIT:
                    sys.exit()

    def run(self):
        self.event()
        self.player.update()
        screen.blit(self.player.img, self.player.rect)
        for enemy in Enemy.enemies:
            enemy.update()
        for enemy_bullet in EnemyBullet.enemy_bullets:
            enemy_bullet.update(self.player)
        for player_bullet in PlayerBullet.player_bullets:
            player_bullet.update()
        if len(Enemy.enemies) < 7 and randint(1, 40) == 1:
            Enemy((randint(25, 575), 10))
        self.render_player_info()


game = Game(Player((300, 350), 20))
clock = time.Clock()
mixer.init()
mixer.music.load("Game.wav")  # 背景音乐
mixer.music.play(-1)
while game.player.blood > 0:
    clock.tick(200)
    screen.fill("light green")
    game.run()
    display.flip()
mixer.music.stop()
game.show_end()

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值