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=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实现打飞机小游戏相关推荐
- 可以帮我做一个python的3D飞机小游戏吗
当然可以!我很乐意帮助你做一个 Python 的 3D 飞机小游戏. 如果你是 Python 初学者,我建议你先了解一些 Python 的基础知识,包括变量.数据类型.流程控制语句.函数等.这些知识都 ...
- python|利用打飞机小游戏学习分支和循环|今天是记录自己学习的第四天呀!加油!
** python|利用打飞机小游戏学习分支和循环|今天是记录自己学习的第四天呀!加油! ** /*** Author:Jiang Zhiying Data:2017.11.11 Emial:1443 ...
- Python编写打飞机小游戏
这是一个简单的打飞机的游戏,运行main.py即可! 最近在学python,总要写一定小项目练练手的.所以就写了个仿微信打飞机的小游戏,有参照网上开源的项目的~后续功能正在完善中- 效果图 代码实现 ...
- Python编写微信打飞机小游戏(三)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(八)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(十一)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf
500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...
- Python编写微信打飞机小游戏(七)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(十)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
- Python编写微信打飞机小游戏(五)
如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢. Python编写微信打飞机小游戏(一) Python编写微信打飞机小游戏(二) Python编写微信打飞机小游戏(三 ...
最新文章
- 剑灵总显示服务器断开连接,求解一分钟“与服务器断开连接”问题
- java中向JTextArea中添加滚动条(垂直的和水平的)
- 程序员该知道的7个必经阶段
- String... 参数定义中有三个点的意思
- 2015总结及2016计划
- 电话号码 手机号码 等准确详细 正则表达式
- MFC中从一个类向其他类发送消息的方法
- 根据wsdl文件生成WebService客户端代码
- 视频编解码(七):profilelevel简介、ffmpeg如何控制profilelevel、编码效率
- Active Directory Get User's groups using LDAP
- SQL语言的3种分类
- linux下安装zmap和zgrab
- 记一次网易云解锁灰色音乐代理异常
- 文献检索是利用计算机对文献,文献检索计算机课.ppt
- Niagara Networks网络安全出口解决方案
- 阿里云上云迁移工具案例实践:腾讯云迁移到阿里云
- 集成学习方法之Bagging,Boosting,Stacking
- 督查督办管理系统在企业管理中起到的作用
- python turtle图片保存_turtle绘图保存png,jpg等图片
- 2018 Android面经分享(京东,百度,陌陌,58到家等知名公司)
热门文章
- python逻辑运算符例子_python运算符-实战中常用的三个逻辑运算符使用实例
- 环境php5.2+mysql_php环境搭建问题(简单记录二------php5.2不加载mysql扩展)
- antd vue 位置变动 固钉消失_使用vue封装固钉Affix组件,滚动条到底部时自动吸附,离开底部时自动相对窗口固定...
- 数据结构之二叉树实现排序功能
- 动态规划实战9 leetcode-91. Decode Ways
- SpringBoot系列(1):Spring和SpringBoot常用注解总结
- vscode开发ExtJs安装插件以及破解方法
- Linux程序包rpm、yum、apt-get
- php 导出csv格式的文件
- QT运行时加载UI文件