实验效果:

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=5elif event.key==pygame.K_LEFT:playerStep=-5elif 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=5elif event.key==pygame.K_LEFT:playerStep=-5elif event.key==pygame.K_SPACE:

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

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

7防止飞机出界

def move_player():global playerXplayerX+=playerStep#防止飞机出界if playerX>736:playerX=736if 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_overfor e in enemies:screen.blit(e.img,(e.x,e.y))e.x+=e.stepif(e.x>736 or e.x<0):e.step*=-1e.y+=40if e.y>450:is_over=Trueprint("游戏结束")enemies.clear()

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

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

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

#创建子弹类
class Bullet():def __init__(self):self.img=pygame.image.load("bullet.png")self.x=playerX+16self.y=playerY+10self.step=6  #子弹移动速度def hit(self):global scorefor e in enemies:      if(distance(self.x,self.y,e.x,e.y)<30):bao_sound.play()bullets.remove(self)e.reset()score+=1print(score)bullets=[] #保存现有的子弹

子弹的定义与敌人类似,

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

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

#两点之间的距离,欧式距离
def distance(bx,by,ex,ey):a=bx-exb=by-eyreturn 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-exb=by-eyreturn sqrt(a*a+b*b)#创建子弹类
class Bullet():def __init__(self):self.img=pygame.image.load("bullet.png")self.x=playerX+16self.y=playerY+10self.step=6  #子弹移动速度def hit(self):global scorefor e in enemies:      if(distance(self.x,self.y,e.x,e.y)<30):bao_sound.play()bullets.remove(self)e.reset()score+=1print(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_overfor e in enemies:screen.blit(e.img,(e.x,e.y))e.x+=e.stepif(e.x>736 or e.x<0):e.step*=-1e.y+=40if e.y>450:is_over=Trueprint("游戏结束")enemies.clear()def move_player():global playerXplayerX+=playerStep#防止飞机出界if playerX>736:playerX=736if 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=5elif event.key==pygame.K_LEFT:playerStep=-5elif 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.效果展示

python实现打飞机小游戏相关推荐

  1. 可以帮我做一个python的3D飞机小游戏吗

    当然可以!我很乐意帮助你做一个 Python 的 3D 飞机小游戏. 如果你是 Python 初学者,我建议你先了解一些 Python 的基础知识,包括变量.数据类型.流程控制语句.函数等.这些知识都 ...

  2. python|利用打飞机小游戏学习分支和循环|今天是记录自己学习的第四天呀!加油!

    ** python|利用打飞机小游戏学习分支和循环|今天是记录自己学习的第四天呀!加油! ** /*** Author:Jiang Zhiying Data:2017.11.11 Emial:1443 ...

  3. Python编写打飞机小游戏

    这是一个简单的打飞机的游戏,运行main.py即可! 最近在学python,总要写一定小项目练练手的.所以就写了个仿微信打飞机的小游戏,有参照网上开源的项目的~后续功能正在完善中- 效果图 代码实现 ...

  4. Python编写微信打飞机小游戏(三)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  5. Python编写微信打飞机小游戏(八)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  6. Python编写微信打飞机小游戏(十一)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  7. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  8. Python编写微信打飞机小游戏(七)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  9. Python编写微信打飞机小游戏(十)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

  10. Python编写微信打飞机小游戏(五)

    如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...

最新文章

  1. 剑灵总显示服务器断开连接,求解一分钟“与服务器断开连接”问题
  2. java中向JTextArea中添加滚动条(垂直的和水平的)
  3. 程序员该知道的7个必经阶段
  4. String... 参数定义中有三个点的意思
  5. 2015总结及2016计划
  6. 电话号码 手机号码 等准确详细 正则表达式
  7. MFC中从一个类向其他类发送消息的方法
  8. 根据wsdl文件生成WebService客户端代码
  9. 视频编解码(七):profilelevel简介、ffmpeg如何控制profilelevel、编码效率
  10. Active Directory Get User's groups using LDAP
  11. SQL语言的3种分类
  12. linux下安装zmap和zgrab
  13. 记一次网易云解锁灰色音乐代理异常
  14. 文献检索是利用计算机对文献,文献检索计算机课.ppt
  15. Niagara Networks网络安全出口解决方案
  16. 阿里云上云迁移工具案例实践:腾讯云迁移到阿里云
  17. 集成学习方法之Bagging,Boosting,Stacking
  18. 督查督办管理系统在企业管理中起到的作用
  19. python turtle图片保存_turtle绘图保存png,jpg等图片
  20. 2018 Android面经分享(京东,百度,陌陌,58到家等知名公司)

热门文章

  1. python逻辑运算符例子_python运算符-实战中常用的三个逻辑运算符使用实例
  2. 环境php5.2+mysql_php环境搭建问题(简单记录二------php5.2不加载mysql扩展)
  3. antd vue 位置变动 固钉消失_使用vue封装固钉Affix组件,滚动条到底部时自动吸附,离开底部时自动相对窗口固定...
  4. 数据结构之二叉树实现排序功能
  5. 动态规划实战9 leetcode-91. Decode Ways
  6. SpringBoot系列(1):Spring和SpringBoot常用注解总结
  7. vscode开发ExtJs安装插件以及破解方法
  8. Linux程序包rpm、yum、apt-get
  9. php 导出csv格式的文件
  10. QT运行时加载UI文件