pygame 2D飞机大战


import pygame
import random
import math

# 初始化
pygame.init()
screen = pygame.display.set_mode((600, 800))
pygame.display.set_caption("淋志打飞机")
icon = pygame.image.load("img.png")
pygame.display.set_icon(icon)
bgImg = pygame.image.load("imgbg.png")

# 得分
score = 0

# 是否结束游戏
is_over = True

# 字体
font = pygame.font.Font("freesansbold.ttf", 32)
over_font = pygame.font.Font("freesansbold.ttf", 64)

# 敌人数量
number_of_enemies = 6

# 玩家飞机
playerImg = pygame.image.load("player.png")

# 玩家初始位置
playerX = 250
playerY = 600

# 玩家键盘控制移动速度
key_move = 2

# 玩家移动速度
playerXStep = 0
playerYstep = 0

# 子弹发射
bullets = []

# 敌机
enemies = []


def show_score():
    text = "score: {}".format(score)
    score_render = font.render(text, True, (0, 255, 0))
    screen.blit(score_render, (10, 10))


def check_is_over():
    if not is_over:
        text = "GAME OVER"
        render = over_font.render(text, True, (255, 0, 0))
        screen.blit(render, (100, 300))


# 碰撞距离
def distance(bx, by, ex, ey):
    a = bx - ex
    b = by - ey
    return math.sqrt(a*a + b*b)


# 敌人类
class Enemy:
    def __init__(self):
        self.img = pygame.image.load("enemy2.png")
        self.x = random.randint(0, 530)
        self.y = 0
        self.step = random.randint(1, 10)/10*random.choice([-1, 1])

    def reset(self):
        self.x = random.randint(0, 530)
        self.y = 0


# 子弹类
class Bullet:
    def __init__(self):
        self.img = pygame.image.load("bomb.png")
        self.x = playerX + 20
        self.y = playerY + 10
        self.step = 5

    def hit(self):
        global score
        for e in enemies:
            if distance(self.x, self.y, e.x, e.y) < 50:
                bullets.remove(self)
                e.reset()
                score += 1


def show_bullet():
    for b in bullets:
        screen.blit(b.img, (b.x, b.y))
        b.hit()
        b.y -= b.step
        if b.y < 0:
            bullets.remove(b)


def show_emeny():
    global playerX, playerY, is_over
    for e in enemies:
        screen.blit(e.img, (e.x, e.y))
        if is_over:
            e.x += e.step
        if e.x > 530 or e.x < 0:
            e.step *= -1
        if is_over:
            e.y += random.randint(1, 10)/10
        if e.y > 800:
            e.y = 0
        if distance(playerX, playerY, e.x, e.y) < 50:
            is_over = False


# 玩家控制
def move_player():
    global playerX, playerY
    playerX += playerXStep
    playerY += playerYstep
    if playerX > 500:
        playerX = 500
    if playerX < 0:
        playerX = 0
    if playerY > 700:
        playerY = 700
    if playerY < 0:
        playerY = 0


def main():
    global playerXStep, playerYstep
    # 制造敌人
    for i in range(number_of_enemies):
        enemies.append(Enemy())
    # 游戏主循环
    running = True
    while running:
        screen.blit(bgImg, (0, 0))
        show_score()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            # 键盘控制移动方向
            if is_over and event.type == pygame.KEYDOWN:
                # 玩家移动
                if event.key == pygame.K_RIGHT:
                    playerXStep = key_move
                elif event.key == pygame.K_LEFT:
                    playerXStep = -key_move
                elif event.key == pygame.K_UP:
                    playerYstep = -key_move
                elif event.key == pygame.K_DOWN:
                    playerYstep = key_move
                # 玩家发射子弹
                elif event.key == pygame.K_SPACE:
                    bullets.append(Bullet())
            if is_over and event.type == pygame.KEYUP:
                playerXStep = 0
                playerYstep = 0
        screen.blit(playerImg, (playerX, playerY))
        move_player()
        show_emeny()
        show_bullet()
        check_is_over()
        pygame.display.update()


if __name__ == '__main__':
    main()