飞机大作战python,python实现飞机大战完整代码,可运行

  飞机大作战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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: