python飞机大战简单实现

小游戏飞机大战的简单代码实现:

# 定义敌机类
class Enemy:
    def restart(self):  # 重置敌机的位置和速度
        self.x = random.randint(50, 400)
        self.y = random.randint(-200, -50)
        self.speed = random.random()*Level_Simpie_enemy
    def __init__(self):  # 初始化
        self.restart()
        self.image = pygame.image.load('enemy.png').convert_alpha()
    def move(self):
        if self.y < 800:
            self.y += self.speed
        else:  # 重置
            self.restart()
# 定义飞机类
class Plane:
    def restart(self):
        self.x = 200
        self.y = 300
    def __init__(self):
        self.restart()
        self.image = pygame.image.load('plant.png').convert_alpha()
    def move(self):
        x, y = pygame.mouse.get_pos()
        x -= self.image.get_width() / 2
        y -= self.image.get_height() / 2
        self.x = x
        self.y = y
# 定义Bullet类
class Bullet:
    def __init__(self):
        self.x = 0
        self.y = -1
        self.image = pygame.image.load('dian.jpg').convert_alpha()
        self.active = False

    def move(self):
        if self.active:
            self.y -= Level_Simpie_bullet
        if self.y < 0:
            self.active = False

    def restart(self):
        mouseX, mouseY = pygame.mouse.get_pos()
        self.x = mouseX - self.image.get_width() / 2
        self.y = mouseY - self.image.get_height() / 2
        self.active = True
#定义碰撞
def checkHit(enemy, bullet):
    if (bullet.x > enemy.x and bullet.x < enemy.x + enemy.image.get_width()) and \
            (bullet.y > enemy.y and bullet.y < enemy.y + enemy.image.get_height()):
        enemy.restart()
        bullet.active = False
        return True
    return False
def checkCrash(enemy, plane):
    if (plane.x + 0.7 * plane.image.get_width() > enemy.x) and (
            plane.x + 0.3 * plane.image.get_width() < enemy.x + enemy.image.get_width()) and \
            (plane.y + 0.7 * plane.image.get_height() > enemy.y) and (
            plane.y + 0.3 * plane.image.get_height() < enemy.y + enemy.image.get_height()):
        return True
    return False

 

#总体实现
pygame.init()
screen = pygame.display.set_mode(window_SIZE, 0, 32)  # 制作窗口
pygame.display.set_caption('飞机大战')  # 窗口名称
background = pygame.image.load('bg.jpg').convert()  # 加载背景图
plane = Plane()  # 创建飞机对象
enemies = []  # 创建敌机list
for i in range(5):
    enemies.append(Enemy())
bullets = []  # 创建子弹list
for i in range(20):  # 5发子弹
    bullets.append(Bullet())
count_b = len(bullets)  # 子弹总数
index_b = 0  # 即将激活的子弹序号
interval_b = 0  # 发射子弹间隔
gameover = False
score = 0
font = pygame.font.Font(None, 32)
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if gameover and event.type == pygame.MOUSEBUTTONUP: #鼠标监听
            plane.restart()
            for e in enemies:
                e.restart()
            for b in bullets:
                b.active = False
            score = 0
            gameover = False
            index_b = 0
            interval_b = 0
        if event.type == pygame.KEYDOWN:        #键盘监听
            if event.key == pygame.K_LEFT:
                move_x =move_x -10
            elif event.key == pygame.K_RIGHT:
                move_x =move_x+10
            elif event.key == pygame.K_UP:
                move_y =move_y+10
            elif event.key == pygame.K_DOWN:
                move_y = move_y-10
            elif event.type == pygame.KEYUP:
                move_y=0
                move_x=0
    screen.blit(background, (0, 0))  # 画背景图像,从最左上角开始即(0,0)
    if not gameover:
        interval_b -= 2  # !!!发射间隔递减,实际发射间隔受cpu影响
        if interval_b < 0:  # 间隔小于0时,激发一个子弹
            bullets[index_b].restart()
            interval_b = 100  # 重置时间间隔
            index_b = (index_b + 1) % count_b  # 子弹序号周期性递减
        for b in bullets:  # 绘制激活的子弹
            if b.active:
                b.move()
                screen.blit(b.image, (b.x+move_x, b.y+move_y))
                for e in enemies:
                    if checkHit(e, b):
                        score += 10
        for e in enemies:  # 敌机的移动和描述
            if checkCrash(e, plane):
                gameover = True
            e.move()
            screen.blit(e.image, (e.x, e.y))
        plane.move()
        screen.blit(plane.image, (plane.x+move_x, plane.y+move_y))  # 画飞机
        text = font.render("Score:%d" % score, 1, (0, 0, 0))
        screen.blit(text, (0, 0))  # 在屏幕左上角显示分数
    else:
        text1 = font.render("Score:%d" % score, 1, (0, 0, 0))
        text2 = font.render("click restart", 1, (0, 0, 0))
        screen.blit(text1, (190, 400))  # 在屏幕中间显示分数
        screen.blit(text2, (170, 420))
    pygame.display.update()  # 刷新
posted @ 2020-03-16 13:01  菠菜面筋  阅读(559)  评论(0编辑  收藏  举报