python实现打飞机小游戏

实验效果:

fight airplane

游戏需要资源和源码我都发布在GitHub上了,需要自取:

https://github.com/Anzhiruosure/python-game-resource

GitHub下载慢的也可以找我要

游戏思路:

目录

1引入我们需要的库:

2创建游戏背景,游戏初始化

3添加背景音乐:

4添加射中音效

5游戏主循环

6飞机的初始化

8创建敌人

9显示敌人

10创建子弹,并当子弹接触敌人是,用之前的reset返回

11显示移动子弹

12游戏结束

13分数

14检查

15完整代码:


1引入我们需要的库:

pygame是第三方库需要下载,官网下载后才能进行操作

import pygame 
import random
from math import*

2创建游戏背景,游戏初始化

#初始界面的创建
pygame.init()
screen=pygame.display.set_mode((800,600))
pygame.display.set_caption("airplane fight")
bgImg=pygame.image.load("bg.png")

这里,我们提前准备好背景图片放到代码所在文件夹中,

我们构建了一个600*800的幕布,然后将背景图片bg.png通过pygame引入,然后再游戏主循环中显示背景即可。

3添加背景音乐:

#音乐添加
pygame.mixer.music.load('bgm.mp3')
pygame.mixer.music.play(-1) #单曲循环

这里,我们调用pygame的mixer函数,引入bgm,这里可以自己寻找音频加入即可,pygame.mixer.music.play(-1)参数 调成-1,一直单曲循环,这里背景音乐就设置好了,注意要在初始化后再添加音乐

4添加射中音效

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

用同样的方法添加击中音效即可 

5游戏主循环

#游戏主循环,当quit时退出循环
game_running=True
while game_running:
    screen.blit(bgImg,(0,0))   #背景的绘制
    show_score()#显示分数
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            game_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
    #飞机移动
    move_player()

    screen.blit(playerImg,(playerX,playerY))
    show_enemy()
    show_bullets()
    check_is_over()
    pygame.display.update()
    

游戏本质就是循环,当执行quit时结束循环,游戏结束,所以我们创建一个循环,当识别我们输入QUIT指令时,退出循环,这里我们循环接受每一个指令,判断是否为QUIT,如果为QUIT就将game_running指令变为False,这样就会退出循环。

再在循环的底部加上 pygame.display.update(),每次执行循环都将更新背景,这样我们背景图标就会一直显示了

在主函数中,我们还定义了不同的按键对应的指令用pygame进行引入。

6飞机的初始化

#飞机的位置定义
playerImg=pygame.image.load("player.png")
playerX=400
playerY=500
playerStep=0   #飞机移动速度

 首先我们引入飞机的突变,然后将它的横纵坐标初始化为400,500,将他的速度初始化为0

因为我们在主函数中已经定义了不同按键对飞机的操控

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:

 这样,我们按下左键,飞机的速度就会变成5,,右键相同,但是这样飞机会一直行动,所以我们要让他在按键结束时速度变为0

 #键盘按键弹起停止运动
        if event.type==pygame.KEYUP:
            playerStep=0

7防止飞机出界

def move_player():
    global playerX
    playerX+=playerStep
    #防止飞机出界
    if playerX>736:
        playerX=736
    if playerX<0:
        playerX=0

我们定义一个函数,幕布大小是600*800图片是64*64,根据计算即可获得坐标(坐上角坐标为(0,0)右下角为(800,600)),我们在他们到边界的时候让他们的坐标一直等于边界值即可

8创建敌人

#创建敌人类
number_of_enemies=6
class Enemy():
    def __init__(self):
        self.img=pygame.image.load("enemy.png")
        self.x=random.randint(200,600)
        self.y=random.randint(50,250)
        self.step=random.randint(1,3)
    def reset(self):
        self.x=random.randint(200,600)
        self.y=random.randint(50,250)

enemies=[]
for i in range(number_of_enemies):
    enemies.append(Enemy())

敌人的创建我们用class方法进行,面向对象编程较为方便,首先我们认定敌人的数量为6,然后定义一个敌人类,初始化参数,引入敌人的图片,然后让其出现的位置随机,速度随机,定义一个列表,每一个敌人都输入进去,reset函数我们将于子弹击中处使用

9显示敌人

#显示敌人
def show_enemy():
    global is_over
    for e in enemies:
        screen.blit(e.img,(e.x,e.y))
        e.x+=e.step
        if(e.x>736 or e.x<0):
            e.step*=-1
            e.y+=40
            if e.y>450:
                is_over=True
                print("游戏结束")
                enemies.clear()

这里我们将列表遍历,然后用pygame的blit函数将每一个敌人画到幕布上,

然后判断如果到达边界,那么速度便为负值,反向移动,每反向移动一次下降40,如果到达和飞机在一条直线上时候,游戏结束

10创建子弹,并当子弹接触敌人是,用之前的reset返回

#创建子弹类
class Bullet():
    def __init__(self):
        self.img=pygame.image.load("bullet.png")
        self.x=playerX+16
        self.y=playerY+10
        self.step=6  #子弹移动速度

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

bullets=[] #保存现有的子弹

子弹的定义与敌人类似,

定义hit函数,当距离小于30时候,清除这个敌人,回到reset重新定义敌人

这里距离,我们用欧式距离计算

#两点之间的距离,欧式距离
def distance(bx,by,ex,ey):
    a=bx-ex
    b=by-ey
    return sqrt(a*a+b*b)

在主函数中接受每次SPACE就射出一发子弹。

11显示移动子弹

#显示移动子弹
def show_bullets():
    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)

用blit函数绘画即可,将函数添加到主函数中实现

12游戏结束

#游戏结束
is_over=False
over_font=pygame.font.Font("freesansbold.ttf",64)
def check_is_over():
    if is_over:
        text="Game Over"
        render=over_font.render(text,True,(255,0,0))
        screen.blit(render,(200,250))

当is_over为False时候,我们在幕布上画出game over代表游戏结束

13分数

#分数
score=0
font=pygame.font.Font("freesansbold.ttf",32)

#分数显示
def show_score():
    text=f"Score:{score}"
    score_render=font.render(text,True,(0,255,0))
    screen.blit(score_render,(10,10))

每次击中敌人后分数加1,然后用同样函数将其绘画到幕布上

14检查

将定义的函数加入到 主函数中,检查是否差错,检查图片音频文件是否在同一文件夹下

15完整代码:

import pygame 
import random
from math import*
#初始界面的创建
pygame.init()
screen=pygame.display.set_mode((800,600))
pygame.display.set_caption("airplane fight")
bgImg=pygame.image.load("bg.png")


#音乐添加
pygame.mixer.music.load('bgm.mp3')
pygame.mixer.music.play(-1) #单曲循环

#添加射中音效
bao_sound=pygame.mixer.Sound("bullet.aiff")
#分数
score=0
font=pygame.font.Font("freesansbold.ttf",32)

#分数显示
def show_score():
    text=f"Score:{score}"
    score_render=font.render(text,True,(0,255,0))
    screen.blit(score_render,(10,10))



#飞机的位置定义
playerImg=pygame.image.load("player.png")
playerX=400
playerY=500
playerStep=0   #飞机移动速度

#添加敌人

#创建敌人类
number_of_enemies=6
class Enemy():
    def __init__(self):
        self.img=pygame.image.load("enemy.png")
        self.x=random.randint(200,600)
        self.y=random.randint(50,250)
        self.step=random.randint(1,3)
    def reset(self):
        self.x=random.randint(200,600)
        self.y=random.randint(50,250)

enemies=[]
for i in range(number_of_enemies):
    enemies.append(Enemy())


#两点之间的距离,欧式距离
def distance(bx,by,ex,ey):
    a=bx-ex
    b=by-ey
    return sqrt(a*a+b*b)

#创建子弹类
class Bullet():
    def __init__(self):
        self.img=pygame.image.load("bullet.png")
        self.x=playerX+16
        self.y=playerY+10
        self.step=6  #子弹移动速度

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

bullets=[] #保存现有的子弹




#显示移动子弹
def show_bullets():
    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_enemy():
    global is_over
    for e in enemies:
        screen.blit(e.img,(e.x,e.y))
        e.x+=e.step
        if(e.x>736 or e.x<0):
            e.step*=-1
            e.y+=40
            if e.y>450:
                is_over=True
                print("游戏结束")
                enemies.clear()

def move_player():
    global playerX
    playerX+=playerStep
    #防止飞机出界
    if playerX>736:
        playerX=736
    if playerX<0:
        playerX=0


#游戏结束
is_over=False
over_font=pygame.font.Font("freesansbold.ttf",64)
def check_is_over():
    if is_over:
        text="Game Over"
        render=over_font.render(text,True,(255,0,0))
        screen.blit(render,(200,250))


#游戏主循环,当quit时退出循环
game_running=True
while game_running:
    screen.blit(bgImg,(0,0))   #背景的绘制
    show_score()#显示分数
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            game_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
    #飞机移动
    move_player()

    screen.blit(playerImg,(playerX,playerY))
    show_enemy()
    show_bullets()
    check_is_over()
    pygame.display.update()
    

16.效果展示

  • 16
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的!打飞机游戏可以使用Python中的Pygame库来实现。以下是一个简单的游戏代码示例: ``` import pygame import random # 初始化Pygame pygame.init() # 设置游戏窗口大小 screen_width = 480 screen_height = 700 screen = pygame.display.set_mode((screen_width, screen_height)) # 设置游戏标题 pygame.display.set_caption("打飞机") # 加载背景图片 background = pygame.image.load("background.png") # 加载飞机图片 player = pygame.image.load("player.png") player_rect = player.get_rect() player_rect.centerx = screen_width // 2 player_rect.bottom = screen_height - 10 # 创建子弹列表 bullet_list = [] bullet_speed = 10 # 创建敌机列表 enemy_list = [] enemy_speed = 5 # 创建计时器 clock = pygame.time.Clock() # 创建分数 score = 0 font = pygame.font.Font(None, 36) # 游戏主循环 while True: # 处理游戏事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() # 处理键盘事件 if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: bullet = pygame.Rect(player_rect.centerx, player_rect.top, 4, 10) bullet_list.append(bullet) # 移动飞机 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and player_rect.left > 0: player_rect.move_ip(-10, 0) if keys[pygame.K_RIGHT] and player_rect.right < screen_width: player_rect.move_ip(10, 0) # 移动子弹 for bullet in bullet_list: bullet.move_ip(0, -bullet_speed) if bullet.top < 0: bullet_list.remove(bullet) # 生成敌机 if random.randint(1, 60) == 1: enemy = pygame.Rect(random.randint(0, screen_width - 50), 0, 50, 50) enemy_list.append(enemy) # 移动敌机 for enemy in enemy_list: enemy.move_ip(0, enemy_speed) if enemy.bottom > screen_height: enemy_list.remove(enemy) # 检测子弹和敌机碰撞 for bullet in bullet_list: for enemy in enemy_list: if bullet.colliderect(enemy): bullet_list.remove(bullet) enemy_list.remove(enemy) score += 10 # 绘制游戏界面 screen.blit(background, (0, 0)) screen.blit(player, player_rect) for bullet in bullet_list: pygame.draw.rect(screen, (255, 255, 255), bullet) for enemy in enemy_list: pygame.draw.rect(screen, (255, 0, 0), enemy) text = font.render("Score: " + str(score), True, (255, 255, 255)) screen.blit(text, (10, 10)) # 更新屏幕 pygame.display.update() # 控制游戏帧率 clock.tick(60) ``` 在代码中,我们使用Pygame库创建了游戏窗口、加载游戏资源、处理用户输入、更新游戏状态、绘制游戏界面等。您需要将代码中的图片和声音资源替换为您自己的资源。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安之若素.re

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值