【python】使用pygame制作简单的飞机大战游戏

游戏截图

代码部分 

import pygame
import random

# 设置标题、背景和图标
pygame.init ()
screen = pygame.display.set_mode ( (800 , 600) )
pygame.display.set_caption ( '飞机大战BETA' )
icon = pygame.image.load ( 'fly.png' )
pygame.display.set_icon ( icon )

# 设置背景、玩家、敌人和子弹的图片
bgImg = pygame.image.load ( 'bg.jpeg' )
playerImg = pygame.image.load ( 'fly.png' )
monsterImg = pygame.image.load ( 'monster.png' )
bulletImg = pygame.image.load ( 'bullet.png' )


# 定义飞机类(玩家)
class fly:
    def __init__(self):
        self.x = 380
        self.y = 500
        self.step = 0

    # 方法:实现玩家飞机左右移动
    def move(self):
        # 如果飞机在界内,则可以通过键盘的左右方向键操控
        if self.x <= 750 and self.x >= 0:
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.step = 1
                elif event.key == pygame.K_LEFT:
                    self.step = -1
            if event.type == pygame.KEYUP:
                self.step = 0
        # 防止出界
        elif self.x > 750:
            self.step = 0
            self.x = 750
        else:
            self.step = 0
            self.x = 1

    # 方法:飞机发射子弹
    def shoot(self):
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:  # 按空格键可以发射(准确的说是创建)子弹
                bullets.append ( bullet ( self.x + 10 , self.y - 30 ) )

    # 方法:判断飞机是否与敌人相撞,如果发生则游戏结束
    def destroy(self):
        for m in monsters:
            distance = ((self.x - m.x) ** 2 + (self.y - m.y) ** 2) ** 0.5  # distance代表玩家飞机与敌人的距离
            if distance <= 20:  # 距离过劲则会坠机,游戏结束
                return True


# 创建玩家对象
player1 = fly ()

game_is_over = False


# 方法:判断敌人是否与玩家相撞,如果相撞则游戏结束,显示游戏结束画面
def gameOver(destroy):
    global game_is_over
    if destroy:
        game_is_over = True
    if game_is_over:
        fail_text = f'Game over!'
        fail_render = font2.render ( fail_text , True , (255 , 0 , 0) )
        screen.blit ( fail_render , (300 ,250 ) )
        monsters.clear ()
        return True


# 方法:判断是否击杀了足够数量(波数)的敌人,游戏胜利,显示游戏胜利画面
def gameWin(wave):
    if wave >= 5:
        win_text = f'You Win!'
        win_render = font2.render ( win_text , True , (0 , 255 , 0) )
        screen.blit ( win_render , (300 , 250) )
        monsters.clear ()
        return True


# 创建子弹类
bullets = []  # 创建列表bullets来装载子弹对象


class bullet:
    def __init__(self , x , y):
        self.x = x
        self.y = y
        self.speed = 1  # 子弹飞行速度(y轴)


# 方法:显示子弹并使其向前飞行
def show_bullet():
    for b in bullets:
        screen.blit ( bulletImg , (b.x , b.y) )
        b.y -= b.speed
        if b.y < 0:
            bullets.remove ( b )


# 方法:判断子弹是否接触敌人,如果接触则消灭敌人,同时子弹消失
def eliminate():
    for b in bullets:
        for m in monsters:
            distant = ((b.x - m.x) ** 2 + (b.y - m.y) ** 2) ** 0.5  # distance代表子弹与敌人的距离,如果距离过近则成功消灭敌人
            if distant <= 20:
                bullets.remove ( b )  # 移除本发子弹
                monsters.remove ( m )  # 消灭被击中的敌人
                return True


# 创建怪物类(敌人)
monster_numbers = 6  # 初始敌人数量


class monster:
    def __init__(self , step):
        self.x = random.randint ( 50 , 750 )
        self.y = random.randint ( 50 , 150 )
        self.step = step  # 怪物移动速度(x轴)
        self.Left_or_Right = random.randint ( 0 , 1 )  # 怪物移动方向

    # 方法:实现怪物左右移动,在移动到左右边界时,向下移动一段距离
    def move(self):
        if self.Left_or_Right:
            self.x += self.step
            if self.x > 780:  # 判断是否到达左右边界
                self.x = 780
                self.y += 30  # 向下移动,更加接近玩家
                self.Left_or_Right = 0  # 改变左右移动方向
        else:
            self.x -= self.step
            if self.x < 0:
                self.x = 0
                self.y += 30
                self.Left_or_Right = 1


# 方法:显示怪物
def show_monster():
    for m in monsters:
        screen.blit ( monsterImg , (m.x , m.y) )
        m.move ()


# 方法:当场上怪物不足时,补充新的一波敌人
def monster_add():
    for i in range ( 6 ):
        monsters.append ( monster ( 0.3 ) )
    show_monster ()


# 初始化敌人数量,首波敌人
monsters = []
for i in range ( monster_numbers ):
    monsters.append ( monster ( 0.3 ) )


# 定义计分类
class record:
    def __init__(self):
        self.kill = 0  # 击杀敌人数
        self.score = 0  # 得分数
        self.wave = 0

    def show(self):
        kill_text = f'kill:{self.kill}'
        score_text = f'score:{self.score}'
        wave_text = f'wave:{self.wave}'
        kill_render = font1.render ( kill_text , True , (255 , 0 , 0) )
        score_render = font1.render ( score_text , True , (0 , 255 , 0) )
        wave_render = font1.render ( wave_text , True , (0 , 0 , 255) )
        screen.blit ( kill_render , (10 , 10) )
        screen.blit ( score_render , (10 , 35) )
        screen.blit ( wave_render , (10 , 60) )


# 创建计分对象
r = record ()
# 杂项显示
font1 = pygame.font.Font ( None, 24 )
font2 = pygame.font.Font ( None , 60 )

# def pause():
#     pygame.time.Clock().tick(30)

if __name__ == '__main__':

    # 游戏控制器
    running = True
    # 开始游戏
    while running:
        screen.blit ( bgImg , (0 , 0) )  # 加载背景图片
        for event in pygame.event.get ():
            if event.type == pygame.QUIT:
                running = False
            player1.move ()  # 玩家移动
            player1.shoot ()  # 玩家开火
        show_bullet ()  # 显示子弹
        if eliminate ():  # 判断消灭敌人
            monster_numbers -= 1
            r.kill += 1
            r.score += 10

        show_monster ()  # 显示首波敌人
        if len ( monsters ) == 0 and not game_is_over and not gameWin ( r.wave ):  # 敌人补充判断
            monster_add ()
            r.wave += 1
        r.show ()  # 显示计分

        gameOver ( player1.destroy () )  # 判断游戏结束或胜利
        gameWin ( r.wave )

        screen.blit ( playerImg , (player1.x , player1.y) )
        player1.x += player1.step

        pygame.display.update ()

 游戏说明

游戏名称:飞机大战 V0.1

介绍:经典的横轴清关游戏(简化版),由玩家操控飞机,消灭不断靠近的敌人,直到存活到游戏结束即为胜利!

控制方法:玩家:“←”、“→”左右移动,”空格键“射击

胜利条件:消灭5波敌人并存活

失败条件:敌人接触到玩家飞机

设计

基本玩法:玩家操控敌军,通过发射子弹来消灭不断左右移动(会前进)的敌人,而敌人通过固定的移动,不断进行左右横移以及前进,来试图接近玩家。如果敌人接触了玩家,则gameover,反之,如果玩家消灭了一定数目的敌人,则游戏胜利!

玩家:战斗机造型,一台只能左右横移的飞机,方向朝上,可以向上发射子弹

敌人:外星飞船造型,出场时会随机左右移动,到达左右边界,调转方向,同时向前移动一段距离

子弹:也可以看做炮弹、导弹,由玩家飞机发射,向上飞行,与敌人接触时会消灭该敌人,一发子弹只能消灭一个敌人,暂无溅射贯穿效果

怪物出场:从屏幕上面出现,位置与左右移动方向随机,一波生成6个

玩家生成:从屏幕下面出现,位置固定

游戏胜利:暂时设定为消灭5波(即30个敌人)

计分:左上角有计分牌,分别为kill(击杀数),score(得分,消灭一个敌人得10分),wave(波数)

技术

主要编程语言:python

实现技术包括:

python基础(if...else判断、for循环、列表、运算表达式等等)

random(创建随机数,来实现随机效果)

*pygame(重点,绝大部分事件、行为和元件都是使用pygame模组)

关于图片

背景图片:bg.jpg

(以下均为ps简单制作,有点丑2333) 

玩家飞机:fly.png

敌人飞机:monster.png

 

 子弹:bullet.png

 

ps:博主是python新司机,还请大佬们多多指教(-_-)

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当然可以!下面是一个简单的示例代码,展示了如何使用 Pygame 制作一个基本的飞机大战游戏: ```python import pygame import random # 初始化 Pygame pygame.init() # 设置游戏窗口大小 screen_width = 800 screen_height = 600 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("飞机大战") # 加载背景图片 background = pygame.image.load("background.jpg") # 加载玩家飞机图片 player_img = pygame.image.load("player.png") player_width = 50 player_height = 50 player_x = screen_width // 2 - player_width // 2 player_y = screen_height - player_height - 10 player_speed = 5 # 加载敌方飞机图片 enemy_img = pygame.image.load("enemy.png") enemy_width = 50 enemy_height = 50 enemy_x = random.randint(0, screen_width - enemy_width) enemy_y = random.randint(50, 150) enemy_speed = 3 # 游戏主循环 running = True while running: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 移动玩家飞机 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and player_x > 0: player_x -= player_speed if keys[pygame.K_RIGHT] and player_x < screen_width - player_width: player_x += player_speed # 移动敌方飞机 enemy_y += enemy_speed if enemy_y > screen_height: enemy_x = random.randint(0, screen_width - enemy_width) enemy_y = random.randint(50, 150) # 绘制背景 screen.blit(background, (0, 0)) # 绘制玩家飞机 screen.blit(player_img, (player_x, player_y)) # 绘制敌方飞机 screen.blit(enemy_img, (enemy_x, enemy_y)) # 刷新画面 pygame.display.update() # 退出游戏 pygame.quit() ``` 在这个示例中,我们使用 Pygame 创建了一个窗口,加载了背景图片、玩家飞机图片和敌方飞机图片,然后在游戏循环中处理事件、移动玩家飞机、移动敌方飞机,并绘制背景、玩家飞机和敌方飞机。你可以根据自己的需求进行修改和扩展。 请注意,你需要提前准备好背景图片、玩家飞机图片和敌方飞机图片,并在代码中指定正确的文件路径。此外,你可能还需要根据自己的需求调整飞机的尺寸、速度等参数。 希望这个示例能对你有所帮助!如果你有任何其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值