飞机大作战python,python实现飞机大战完整代码,可运行
本文主要详细介绍python对一个简单飞机战斗的实现。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享python实现一个简单飞机大战的具体代码,供大家参考。具体内容如下
制作初衷
这几天没事干,想起自己已经很久没玩游戏了,就想去做个游戏培训师。我用python这种我并不十分精通的语言,以练习为目的进行写作。代码有备注,可以直接看代码。这段代码是我用python3.1写的,需要的话可以直接下载我的资源。图片和代码打包在一起,因为是第一次用python玩游戏。
游戏思路
首先我们分析《飞机大战》这款游戏属于一款平面2d游戏,而这款游戏的一切都是基于X和y的,为了加快我们的开发工作,秉承时间就是金钱的原则,我们使用python的pygame第三方库来实现。
言归正传!
背景
仔细分析飞机大战,我们不难发现,这个游戏的背景其实是一个画面一直滚动造成的一种视觉效果,填满了我们的场景,使之无缝衔接。其实我们只需要滚动两张图,然后第二张画完了,就让他从第一张画开始滚动。这种循环可以给用户带来视觉上的无缝滚动效果。
飞机
通过分析飞机的行为,可以发现我方飞机和敌方飞机都有几个共同的动作。
1.运动,敌我双方都在不断运动。
2.发射子弹。双方都在发射子弹,但是具体的数量和速度可以通过类的属性来修改。
3.死亡,敌人和自己都会死,死亡会引发爆炸动画。敌人的死亡会加分,我们的死亡游戏结束。
子弹
为了节省时间,这里的子弹只会走直线,封装在自己的类方法里,轨迹可以后期修改。
话不多说,直接去码。每个重要的代码都有注释。你可以自己看。
main.py
# -*-编码: UTF-8 -*-
# animation.py
#导入所需的模块
导入pygame系统
从pygame.locals导入*
进口飞机
随机导入
职业游戏:
def __init__(self):
#初始化pygame
pygame.init()
#初始化字体文件
pygame.font.init()
#初始化游戏分数
self.mark=0
#设置帧速率(每秒刷新屏幕的次数)
自我。FPS=60
#拿起pygame的钟
self . fps clock=py game . time . clock()
#设置窗口大小
self . screen=py game . display . set _ mode((500,800),0,32)
#设置标题
Pygame.display.set_caption(飞机大战)
#定义颜色
自我。白色=(255,255,255)
#用于存储爆炸图片
self . boom=[py game . image . load( boom _ 1 . gif )
,pygame.image.load(boom_2.gif )
,pygame.image.load(boom_3.gif )
,pygame.image.load(boom_4.gif )
,pygame.image.load(boom_5.gif )
,pygame.image.load(boom_6.gif )
,pygame.image.load(boom_7.gif )
,pygame.image.load(boom_8.gif )
,py game . image . load( boom _ 9 . gif )]
#加载背景图像
self . img=py game . image . load( BG . jpg )
#加载开始游戏按钮
self . start game image=py game . image . load( start . png )
#初始化背景图片的位置
self.imgx=0
self.imgy=0
#全局时间变量
self . time=0;
#敌人子弹的图像数据
self . allenemybuttlueimg=[py game . image . load( buttle 3 . png )]
#所有敌人图片数据的列表
self.allEnemyImg=
[pygame.image.load(em1.png), pygame.image.load(em2.png)]
# 存放所有敌人变量的一个列表
self.allEnemy = [];
#是否开始了游戏 开始游戏状态为0 死亡状态为1 为开始为2
self.isStart=2
#最后一个爆炸动画
self.lastTime=0
#开始执行动画
self.run()
def initGame(self):
# 创建一个自己角色
self.myself = airplane.airplane(self.screen, 30, pygame.image.load(airplane.png), 250, 800,
pygame.image.load(buttle.png),
0, 120, 79, self.boom)
self.isStart=0
def run(self):
# 程序主循环
while True:
# 每次都要重新绘制背景白色
self.screen.fill(self.WHITE)
# 背景的循环滚动
self.imgy += 2
if self.imgy == 854:
self.imgy = 0
# 背景的绘制,绘制两张图片实现循环滚动的效果
self.screen.blit(self.img, (self.imgx, self.imgy))
self.screen.blit(self.img, (self.imgx, self.imgy - 854))
#如果游戏isstart为flase则游戏不会继续刷新
if self.isStart==0:
self.startGame();
elif self.isStart == 1:
self.clearAll();
else:
self.showstartGame()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type==MOUSEBUTTONDOWN:
x, y = pygame.mouse.get_pos()
if(x>170 and x<170+161and y>300 and y<300+43):
self.isStart=0
self.initGame();
# 刷新屏幕
pygame.display.update()
# 设置pygame时钟的间隔时间
self.fpsClock.tick(self.FPS)
def showMark(self):
a = pygame.font.SysFont(幼圆, 50)
text = a.render(str(self.mark),True,(255,0,0))
b=len(str(self.mark))
self.screen.blit(text, [500-b*30,10])
def showstartGame(self):
self.screen.blit(self.startGameImage,(170,300))
def addMark(self,m):
self.mark+=m;
def clearMark(self):
self.mark=0;
def startGame(self):
# 获取鼠标位置点
x, y = pygame.mouse.get_pos()
# 飞机的运行函数
self.myself.run(x, y);
# 所有子弹每一帧的位置
for item in self.myself.allbullet:
if item.y <= 0:
# 当子弹行驶出地图边界之后移除列表中的当前元素并且销毁对象
self.myself.allbullet.remove(item)
del item
else:
# 如果没有行驶出边界范围则继续行驶
item.advance()
for enemy in self.allEnemy:
try:
# 判断我方子弹是否与敌人相撞,并且相撞的时候敌人还活着
if (
item.x > enemy.x and item.x < enemy.x + enemy.width and item.y >= enemy.y and item.y < enemy.y + enemy.height and enemy.isDeath == 0):
self.myself.allbullet.remove(item)
del item
enemy.death()
self.addMark(enemy.myselfMark)
except:
continue;
self.showMark()
# 发射子弹的函数具体的射速由对象内部决定
self.myself.attack();
# 外部计算时间的一个变量没time % FPS == 0 时为1秒钟
self.time += 1
if self.time==self.lastTime:
self.isStart=1
# 飞机随机生成时间
if self.time % (self.FPS * 2) == 0:
# 每过一秒钟新生成一架飞机,添加到allEnemy这个列表之中,y从0开始 x在窗口大小随机生成
self.allEnemy.append(
airplane.airplane(self.screen, 15, self.allEnemyImg[random.randint(0, 1)], random.randint(0, 500 - 179), -134,
self.allEnemyButtlueImg[0], 1, 179, 134, self.boom))
# 循环执行该列表,敌人飞机的运动轨迹
for item in self.allEnemy:
# 飞机超出下边界后去除
if item.y > 800 + item.height:
self.allEnemy.remove(item)
del item
# 飞机死亡并且存在子弹数为0后去除
elif item.isDeath == 1 and len(item.allbullet) == 0:
self.allEnemy.remove(item)
del item
# 否则飞机继续运行
else:
item.ai()
item.attack()
for i in item.allbullet:
if i.y <= -96 or i.y >= 896:
# 当子弹行驶出地图边界之后移除列表中的当前元素并且销毁对象
item.allbullet.remove(i)
del i
else:
# 如果没有行驶出边界范围则继续行驶
if (
i.x > self.myself.x and i.x < self.myself.x + self.myself.width and i.y >= self.myself.y and i.y < self.myself.y + self.myself.height and self.myself.isDeath == 0):
self.myself.death()
self.lastTime=self.time+50;
i.advance()
def clearAll(self):
self.mark=0
for i in self.allEnemy:
for j in i.allbullet:
del j;
del i;
for j in self.myself.allbullet:
del j
del self.myself
# 存放所有敌人变量的一个列表
self.allEnemy = [];
# 是否开始了游戏
self.isStart = 2
self.lastTime=0
game=Game()
airplane.py
#飞机子弹的图片路径self.bullet=bullet;
#飞机的类型,0代表自己,1代表敌人
self.type=type;
#飞机的宽度
self.width=w;
#飞机的高度
self.height=h;
#存放子弹的数组
self.allbullet=[];
#用于判断子弹多长时间发射一次和fps相关
self.time=0;
#当前这个飞机的速度
self.speedx=1;
self.speedy=1;
# 攻击速度,值越小攻击越快最小为1
self.advancespeed = advancespeed;
#每个飞机自己携带的分数,目前随机
self.myselfMark=random.randint(1,3)
#运动轨迹
self.runType=random.randint(0, 3)
#是否死亡 1表示死亡 0表示活着
self.isDeath=0
#爆炸图片播放那一张
self.showboomTime=0
#爆炸数据
self.boom=boom
#开始攻击
self.attack();
def death(self):
#死亡状态
self.isDeath=1;
def showboom(self):
#显示boom的动画
if self.showboomTime==len(self.boom)-1:
return ;
if self.time%5==0:
self.showboomTime+=1;
self.screen.blit(self.boom[self.showboomTime], (self.x, self.y))
def run(self,x,y):
if self.isDeath==1:
self.showboom();
return 1;
self.x = x - self.width / 2;
self.y = y - self.height / 2;
self.screen.blit(self.img, (self.x, self.y))
def attack(self):
#飞机发射子弹的函数
if self.time%self.advancespeed==0 and self.isDeath==0:
self.allbullet.append(bullet(self.screen,self.bullet,self.x-self.width/2,self.y,self.width,self.height,128,128,self.type))
self.time+=1
def ai(self):
if self.isDeath==1:
self.showboom();
return
#这里分为四种的运动轨迹随机决定
if self.type==1:
if self.runType==0:
self.y+=self.speedy*2;
elif self.runType==1:
self.y+=self.speedy;
if self.x<=0-self.width/2 or self.x>=500-self.width/2:
self.speedx=0-self.speedx
self.x+=self.speedx
elif self.runType==2:
self.y += self.speedy;
if self.x<=0-self.width/2 or self.x>=500-self.width/2:
self.speedx = 0 - self.speedx
self.x -= self.speedx
elif self.runType==3:
self.y += self.speedy;
if self.x<=0-self.width/2 or self.x>=500-self.width/2:
self.speedx = 0 - self.speedx
self.speedy=0-self.speedy
self.x -= self.speedx
self.screen.blit(self.img, (self.x, self.y))
self.attack()
def __del__(self):
return
class bullet:
def __init__(self,screen,img,x,y,airplanex,airplaney,w,h,type):
#游戏场景传参
self.screen=screen;
#子弹的图片的路径
self.img=img;
if type==0:
# 子弹的y坐标
self.y=y-airplaney;
# 子弹的x坐标
self.x = x + airplanex / 2;
else:
self.y=y+airplaney-20;
self.x = x+airplanex/2+w/2-12;
#子弹图片的宽度
self.width=w
#子弹图片的高度
self.height=h
#子弹需要一直往前飞
self.run()
#子子弹是谁的
self.type = type
if self.type==0:
self.speed=5
else:
self.speed=3
def advance(self):
if self.type==0:
self.y-=self.speed;
else:
self.y+=self.speed;
self.run();
def run(self):
self.screen.blit(self.img, (self.x, self.y))
def __del__(self):
return
给大家看看游戏运行的效果
一个简单的开始按钮,死亡后又返回这个界面
上方有一个简洁明了的计分板,游戏结束归零
敌人有四种运动,随机产生!!!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。