返回顶部
首页 > 资讯 > 后端开发 > Python >python实现简单的飞机大战
  • 372
分享到

python实现简单的飞机大战

2024-04-02 19:04:59 372人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了python实现简单的飞机大战的具体代码,供大家参考,具体内容如下 制作初衷 这几天闲来没事干,就想起来好长时间没做过游戏了,于是就想做一个游戏练练手,为了起到一

本文实例为大家分享了python实现简单的飞机大战的具体代码,供大家参考,具体内容如下

制作初衷

这几天闲来没事干,就想起来好长时间没做过游戏了,于是就想做一个游戏练练手,为了起到一个练习的目的就使用了自己不是太熟练的Python这门语言来编写,代码都有备注,大家可以直接看代码,这个代码我是在python3.1的环境下写的,大家需要可以直接下载我这里的资源,图片和代码打包到了一起的,因为是第一次使用python做游戏,有什么不足的地方望大佬斧正。

游戏思路

首先我们分析飞机大战这个游戏属于一个平面的2d游戏,那这个游戏的所有都是建立在x,y的基础上进行的运算,为了加快我们的开发工作,秉承时间就是金钱的原则,我们采用的是python 的 pygame第三方库来实现的。
言归正传!!!

背景

仔细分析飞机大战我们不难发现,这个游戏的背景实际上就是一张图片一直循环滚动所造成的一种视觉上的效果,那布满我们一个场景并且让他无缝连接实际上我们只需要两张图片滚动,然后当第二张图片滚动完,再让他从第一张图片开始滚动如此循环便可以给用户视觉上一种无缝滚动的效果。

飞机

我们分析飞机的行为可以发现,不管是我方的飞机还是敌人的飞机都是有几种他们共有的动作。

1,运动,敌我双方都是在一直的运动。
2,发射子弹,双方都是在发射子弹,但具体的数量和速度我们可以通过类的属性来进行修改。
3,死亡,敌人和我们自身都会死亡,死亡会触发一个爆炸的动画,敌人死亡加分,我方死亡游戏结束。

子弹

为了节省时间此处的子弹都只会走直线,封装到自己的类方法里面,后期可以修改轨迹。

话不多说,直接上代码,每个重要的代码都是有注释。大家可以自己观看。

main.py

# -*- coding: UTF-8 -*-
# animation.py

# 导入需要的模块
import pygame, sys
from pygame.locals import *
import airplane
import random
class Game:
  def __init__(self):
    # 初始化pygame
    pygame.init()
    #初始化字体文件
    pygame.font.init()
    #初始化游戏分数
    self.mark=0
    # 设置帧率(屏幕每秒刷新的次数)
    self.FPS = 60

    # 获得pygame的时钟
    self.fpsClock = pygame.time.Clock()

    # 设置窗口大小
    self.screen = pygame.display.set_mode((500, 800), 0, 32)

    # 设置标题
    pygame.display.set_caption('飞机大战')

    # 定义颜色
    self.WHITE = (255, 255, 255)
    #用于存放爆炸图片
    self.boom=[pygame.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")
      , pygame.image.load("boom_9.gif")]
    # 加载一张背景图片
    self.img = pygame.image.load('bg.jpg')
    #加载开始游戏按钮
    self.startGameImage=pygame.image.load('start.png')

    # 初始化背景图片的位置
    self.imgx = 0
    self.imgy = 0
    # 全局的时间变量
    self.time = 0;
    #敌人子弹的图片数据
    self.allEnemyButtlueImg=[pygame.image.load('buttle3.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

给大家看看游戏运行的效果

一个简单的开始按钮,死亡后又返回这个界面

上方有一个简洁明了的计分板,游戏结束归零

敌人有四种运动,随机产生!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: python实现简单的飞机大战

本文链接: https://lsjlt.com/news/117740.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python实现简单飞机大战
    本文实例为大家分享了Python实现简单飞机大战的具体代码,供大家参考,具体内容如下 功能 玩家飞机可以移动,可以发射子弹,敌机随机产生,自由坠落。未添加击落敌机的功能。主要用来练习类的封装与继承。 源码 # ...
    99+
    2022-06-02
    python 飞机大战
  • python实现简单的飞机大战
    本文实例为大家分享了python实现简单的飞机大战的具体代码,供大家参考,具体内容如下 制作初衷 这几天闲来没事干,就想起来好长时间没做过游戏了,于是就想做一个游戏练练手,为了起到一...
    99+
    2024-04-02
  • python实现简单的飞机大战游戏
    本文实例为大家分享了python实现飞机大战游戏的具体代码,供大家参考,具体内容如下 1、准备环境 下载python(这里建议不需要安装最新的,好像pygame还没有对3.8支持的包...
    99+
    2024-04-02
  • python实现简单飞机大战小游戏
    为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下: 实现步骤: ①下载64位对应python版本的pygame:pygame-1.9.6-cp38-c...
    99+
    2024-04-02
  • javascript实现简单飞机大战小游戏
    本文实例为大家分享了javascript实现飞机大战小游戏的具体代码,供大家参考,具体内容如下 效果图 html文件 <!DOCTYPE html> <html ...
    99+
    2024-04-02
  • Java实现简单的飞机大战游戏(控制主飞机篇)
    本文实例为大家分享了Java实现简单的飞机大战游戏,控制主飞机的具体代码,供大家参考,具体内容如下 接着上一篇:Java实现简单的飞机大战游戏(敌机下落篇),首先我们需要明白,在控制...
    99+
    2024-04-02
  • JavaScript实现简易飞机大战
    本文实例为大家分享了JavaScript实现简易飞机大战的具体代码,供大家参考,具体内容如下 话不多说,直接上代码 <!DOCTYPE html> <html la...
    99+
    2024-04-02
  • java实现简易飞机大战
    目录整体思路代码实现英雄战机类敌机类子弹类图片工具类游戏窗体类启动游戏类运行效果图本文实例为大家分享了java实现简易飞机大战的具体代码,供大家参考,具体内容如下 整体思路 1.创建...
    99+
    2024-04-02
  • C语言实现简单的飞机大战游戏
    目录一、项目描述和最终的成果展示二、输出一个飞机模型三、实现控制飞机移动的功能四、添加发射激光功能五、添加靶子和分数统计功能本文实例为大家分享了C语言实现简单飞机大战游戏的具体代码,...
    99+
    2024-04-02
  • Java实现简单的飞机大战游戏(敌机下落篇)
    本文实例为大家分享了Java实现简单飞机大战游戏,敌机下落的具体代码,供大家参考,具体内容如下 在实现这个游戏之前,我们首先需要知道项目可能要用到哪些知识点: 重绘,线程,双缓冲,数...
    99+
    2024-04-02
  • Python实现飞机大战项目
    本文实例为大家分享了Python实现飞机大战的具体代码,供大家参考,具体内容如下 plane_main.py import pygame from 飞机大战.plane_spri...
    99+
    2024-04-02
  • python -- 飞机大战(实验)
    小Q:今天无意间发现了大神写的python飞机项目,和一本好资料,记录一下。前一阵子看了一篇文章:青少年如何使用Python开始游戏开发 。看完照葫芦画瓢写了一个,觉得挺好玩儿,相当于简单学了下Pygame库。这篇文章是个12岁小孩儿写的,...
    99+
    2023-01-31
    大战 飞机 python
  • PythonPygame实战之飞机大战的实现
    目录导语一、环境安装1)各种素材(图片、字体等)2)运行环境二、代码展示1)文章思路2)附代码讲解3)主程序三、效果展示总结导语 三月疫情原因,很多地方都封闭式管理了! 在回家无聊的...
    99+
    2024-04-02
  • js+canvas实现飞机大战
    本文实例为大家分享了js canvas实现飞机大战的具体代码,供大家参考,具体内容如下 首先我们绘制一个canvas区域,确实其宽高为480px*852px;水平居中 <!DO...
    99+
    2024-04-02
  • python实现飞机大战(面向过程)
    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 游戏的实现本质是多个图片的快速切换,类似动画一样,达到动态的效果。比如子弹的发射,实际上是一个子弹的...
    99+
    2024-04-02
  • Python如何实现飞机大战项目
    这篇文章主要介绍Python如何实现飞机大战项目,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下plane_main.pyimport pygamefrom 飞机大战.plane_spr...
    99+
    2023-06-20
  • Pygame库200行代码实现简易飞机大战
    目录安装使用库pygame简介pgame中主要模块介绍pygame的安装验证安装程序原理程序升级设置飞机大战的精灵类和常量背景类和敌机类主机类和子弹类主游戏类事件监听方法碰撞检测精灵...
    99+
    2024-04-02
  • Python三百行代码实现飞机大战
    目录一. 动态效果图如下二. 思路框架三. Python代码实现四. 小结一. 动态效果图如下 先来看下飞机大战游戏最终实现的动态效果图。 二. 思路框架 plane_sprite...
    99+
    2024-04-02
  • JavaScript实现飞机大战游戏
    本文实例为大家分享了canvas ,js 实现一个简单的飞机大战,供大家参考,具体内容如下 预览图: 代码: <!DOCTYPE html> <html>...
    99+
    2024-04-02
  • java实现飞机大战游戏
    java实现飞机大战,供大家参考,具体内容如下 用Java写个飞机大战游戏练习一下,实现可播放游戏背景音乐和游戏的基本功能 设计 1、准备好相应的图片和背景音乐(.wav文件); 2...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作