简单的飞机大战

Posted 予非池物

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的飞机大战相关的知识,希望对你有一定的参考价值。

 

import random
import pygame
import math

# 1.初始化界面
pygame.init()
screen = pygame.display.set_mode((800, 600))  # 设置显示窗口大小--参数是元组(宽,高)
pygame.display.set_caption("JerkOff ")  # 设置标题

# 加图标
icon = pygame.image.load("ufo.png")
pygame.display.set_icon(icon)

# 加背景图
bgImg = pygame.image.load("bg.png")
# 添加背景音效
pygame.mixer.music.load("bg.wav")
pygame.mixer.music.play(-1)  # -1 单曲循环一直不停

# 添加射中音效
bao_sound = pygame.mixer.Sound("exp.wav")

# 加飞机
playerImg = pygame.image.load("player.png")
# 飞机是移动的,位置定义成变量
playerX = 350
playerY = 500
playerStep = 0  # 移动步长(速度) 右移大于0,左移小于0(-5) 开始初始值为0 循环不动,否则自己就会移动

# 添加多个敌人
number_of_enemies = 6

# 分数
score = 0
font = pygame.font.Font("freesansbold.ttf", 32)  # 自带字体不支持中文


# font = pygame.font.SysFont("simsunnsimsun",40) # 系统自带字体

def show_score():
    text = f"score:{score}"  # f让{}里面直接显示变量
    score_render = font.render(text, True, (255, 255, 255))  # render渲染也就是显示 text显示的文字 True24位颜色 三原色三元组()--用三种基本的颜色红绿蓝
    screen.blit(score_render, (10, 10))


class Enemy(object):
    """
    敌人类:创建读个对象,产生多个敌人
    """

    def __init__(self, enemy_type):
        self.enemy_type = enemy_type
        if self.enemy_type == 0:
            self.img = pygame.image.load("enemy.png")
        else:
            self.img = pygame.image.load("enemy2.png")
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 250)
        self.step = random.randint(2, 6)  # 敌人移动得速度
        self.life = 60    # 血量

    def show_enemy(self):
        screen.blit(self.img, (self.x, self.y))
        self.x += self.step
        if self.life > 0:
            self.blood()
        # 控制敌人不出界
        if self.x > 800 - 64 or self.x < 0:  # 右边界
            self.step *= -1
            self.y += 40

    def reset(self):
        """敌人被击中,重新开始"""
        self.life -= 10
        if self.life == 0:
            self.x = random.randint(200, 600)
            self.y = random.randint(50, 250)
            self.life = 60

    def blood(self):
        """血量"""
        pygame.draw.rect(screen, (0, 255, 0), (self.x + 2, self.y, self.life, 2))


enemies = []
for i in range(number_of_enemies):
    enemies.append(Enemy(random.randint(0, 2)))


class Bullet(object):
    """
    子弹类:创建读个对象,产生多个子弹(连发)
    """

    def __init__(self):
        self.img = pygame.image.load("bullet.png")
        self.x = playerX + 16  # (64-32)/2
        self.y = playerY + 10
        self.step = 10  # 子弹移动的速度

    def show_bullet(self):
        screen.blit(self.img, (self.x, self.y))
        self.y -= self.step

    def hit(self):
        """击中敌人"""
        global score
        for e in enemies:
            if distance(self.x, self.y, e.x, e.y) < 30:
                # 射中了
                bullets.remove(self)
                bao_sound.play()
                if e.enemy_type == 0:
                    score += 50
                else:
                    score += 100
                e.reset()  # 恢复位置


bullets = []  # 保存现有子弹,子弹可能飞出边界


def process_events():
    """监视键盘动作"""
    global playerStep
    global running
    for event in pygame.event.get():  # 把所有用户的操作返回来,比如敲键盘、打字等
        if event.type == pygame.QUIT:  # 事件类型 如关闭它或敲了键盘的某个健
            running = False
        # 通过键盘事件控制飞机移动
        if event.type == pygame.KEYDOWN:  # 按下键盘 移动
            if event.key == pygame.K_RIGHT:  # 向右的方向键
                playerStep = 5
            elif event.key == pygame.K_LEFT:  # 向左的方向健
                playerStep = -5
            elif event.key == pygame.K_SPACE:  # 空格健,发送子弹
                # 创建一枚子弹
                bullets.append(Bullet())

        if event.type == pygame.KEYUP:  # 键盘抬起 不移动
            playerStep = 0


# 游戏结束
is_over = False
over_font = pygame.font.Font("freesansbold.ttf", 32)


def check_is_over():
    if is_over:
        text = f"game is over"  # f让{}里面直接显示变量
        score_render = over_font.render(text, True,
                                        (255, 0, 0))  # render渲染也就是显示 text显示的文字 True24位颜色 三原色三元组()--用三种基本的颜色红绿蓝
        screen.blit(score_render, (300, 300))


def show_enemy_bullet():
    global is_over
    """显示多个敌人,显示多枚子弹"""
    for e in enemies:
        e.show_enemy()
        # 游戏结束
        if e.y > 500 - 64:
            # 敌人飞出界面
            is_over = True
            print("游戏结束了")
            enemies.clear()
    for b in bullets:
        b.show_bullet()
        b.hit()
        # 子弹飞出界面
        if b.y < 0:
            bullets.remove(b)


def distance(bx, by, ex, ey):
    x = bx - ex
    y = by - ey
    return math.sqrt(x * x + y * y)


def move_player():
    """移动玩家"""
    global playerX, playerY, playerStep
    screen.blit(playerImg, (playerX, playerY))  # 把飞机画在screen上
    playerX += playerStep
    # 控制飞机不出界
    if playerX > 800 - 64:  # 右边界
        playerX = 800 - 64
    if playerX < 0:  # 左边界
        playerX = 0



# 2.游戏主循环:游戏之所以有界面等在那里,是因为有个循环在那里
running = True
while running:  # 此句下面什么也不加 界面就会卡在那里,什么也做不了,所以用event
    screen.blit(bgImg, (0, 0))  # 把背景图画在screen上 坐标(0,0) 左上角0,0,先画背景,要不然会被盖住
    process_events()
    move_player()
    show_enemy_bullet()
    show_score()
    check_is_over()
    pygame.display.update()  # 界面更新,这样画完的东西才能显示出来
# 3.接下来就是在while里画画,每一帧里铺上不同的画

注意:图片和各种音效的地址,上文代码结构如下:

 

 素材:飞机大战素材外星人、音效、飞机.rar-游戏开发文档类资源-CSDN文库

以上是关于简单的飞机大战的主要内容,如果未能解决你的问题,请参考以下文章

《简单的飞机大战》事实上不简单

简单的飞机大战

python步骤四 第二课实现飞机大战

一个简单的 rust 项目 飞机大战

飞机大战原生代码版

基于Java的飞机大战的课程设计与实现