QT图形界面初学者项目 - 无人机群作战仿真模拟

代码已经上传到github:点这里 欢迎star

说明

某985大学课设,使用QT Designer完成图形化交互界面设计 ,实现的效果类似下面视频:

仿真无人机对战游艇.mp4

代码质量不高,但实现了功能,可以作为非专业的课程设计参考。

流程图

在这里插入图片描述

程序控制流程

在这里插入图片描述

主要代码展示

mainscene.cpp

#include "mainscene.h"
#include "config.h"
#include "move.h"
#include<iostream>
#include<QIcon>
#include<QPixmap>
#include<QPalette>
#include<QBrush>
#include<QPainter>
#include<QPushButton>
#include<QDebug>
using namespace std;
MainScene::MainScene(QWidget *parent)
    : QWidget(parent)
{
    Map m_map;
    Move m_jianting;
    Move m_feiji;
    Move m_feiji1;
    Move m_feiji2;
    Move m_feiji3;
    Move m_feiji4;
    Missile m_missile;
    Missile m_missile1;
    Missile m_missile2;
    Missile m_missile3;
    Missile m_missile4;
    Missile m_lanjiedan;
    Missile m_lanjiedan1;
    Missile m_lanjiedan2;
    lasttime = 50;
    lanjiedan_bomb[0] = 0;
    lanjiedan_bomb[1] = 0;
    lasttime_lanjie_1 = 50;
    lasttime_lanjie_2 = 50;
    initScene();
}
void MainScene::initScene()
{
    setFixedSize(GAME_WIDTH,GAME_HEIGHT);
    setWindowTitle("无人机群作战");
    JianTingBomb.load(BOMB_PATH);
    m_Timer.setInterval(GAME_RATE);
    MainButton_1=new QPushButton(this);
    MainButton_1->setIcon(QIcon(QUIT_PATH));
    MainButton_1->setIconSize(QSize(150, 70));
    MainButton_1->setGeometry(50,560,120,34);
    connect(MainButton_1,&QPushButton::clicked,this,&MainScene::playGame);
    MainButton_1=new QPushButton(this);
    MainButton_1->setIcon(QIcon(QUIT_PATH1));
//    MainButton_1->setGeometry(50, 50, 100, 50);
    MainButton_1->setIconSize(QSize(150, 70));
    MainButton_1->setGeometry(50,600,120,34);
    connect(MainButton_1,&QPushButton::clicked,this,&MainScene::close);


}
MainScene::~MainScene()
{

}


//碰撞检测逻辑
void MainScene::collisionDetection(){
    if(m_jianting.jianting_life>0){
        if(!bump[0]&&m_jianting.m_XJianting-2<m_feiji.missile.m_X&&m_feiji.missile.m_X<m_jianting.m_XJianting+2){
            qDebug()<<"子弹1命中!坐标为:"+QString::number(m_feiji.missile.m_X);
            m_jianting.jianting_life-=500;
            bump[0]=true;
            m_bombs[0].m_Free = false;
            m_bombs[0].m_X = m_feiji.missile.m_X;
            m_bombs[0].m_Y = m_feiji.missile.m_Y;
        }

        if(!bump[1]&&m_jianting.m_XJianting-2<m_feiji1.missile1.m_X1&&m_feiji1.missile1.m_X1<m_jianting.m_XJianting+2){
            qDebug()<<"子弹2命中!坐标为:"+QString::number(m_jianting.m_XJianting);
            m_jianting.jianting_life-=500;
            bump[1]=true;
            m_bombs[1].m_Free = false;
            m_bombs[1].m_X = m_feiji1.missile1.m_X1;
            m_bombs[1].m_Y = m_feiji1.missile1.m_Y1;
        }
        if(!bump[2]&&m_jianting.m_XJianting-2<m_feiji2.missile2.m_X2&&m_feiji2.missile2.m_X2<m_jianting.m_XJianting+2){
                        qDebug()<<"子弹3命中!坐标为:"+QString::number(m_feiji2.missile2.m_X2);
                        m_jianting.jianting_life-=500;
                        bump[2]=true;
                        m_bombs[2].m_Free = false;
                        m_bombs[2].m_X = m_feiji2.missile2.m_X2;
                        m_bombs[2].m_Y = m_feiji2.missile2.m_Y2;
                    }
        if(!bump[3]&&m_jianting.m_XJianting-2<m_feiji3.missile3.m_X3&&m_feiji3.missile3.m_X3<m_jianting.m_XJianting+2){
            qDebug()<<"子弹4命中!坐标为:"+QString::number(m_feiji3.missile3.m_X);
            m_jianting.jianting_life-=500;
            bump[3]=true;
            m_bombs[3].m_Free = false;
            m_bombs[3].m_X = m_feiji3.missile3.m_X3;
            m_bombs[3].m_Y = m_feiji3.missile3.m_Y3;
        }
        if(!bump[4]&&m_jianting.m_YJianting-2<m_feiji4.missile4.m_Y4&&m_feiji4.missile4.m_Y4<m_jianting.m_YJianting+2){
            qDebug()<<"子弹5命中!坐标为:"+QString::number(m_feiji4.missile4.m_X);
            m_jianting.jianting_life-=500;
            bump[4]=true;
            m_bombs[4].m_Free = false;
            m_bombs[4].m_X = m_feiji4.missile4.m_X3;
            m_bombs[4].m_Y = m_feiji4.missile4.m_Y3;
        }

        if(m_jianting.m_lanjiedan1.m_x1<=m_feiji1.missile1.m_X1){
            qDebug()<<"change the boolen of 2"<<m_jianting.m_lanjiedan1.m_x1<<m_feiji1.missile1.m_X1;
            bump[1] = true;
            lanjiedan_bomb[0]=true;
        }
        if(m_jianting.m_lanjiedan2.m_x2<=m_feiji3.missile3.m_X3){
            qDebug()<<"change the boolen of 1"<<m_jianting.m_lanjiedan2.m_x2<<m_feiji3.missile3.m_X3;

            bump[3] = true;
            lanjiedan_bomb[1] = true;
        }


    }

}

void MainScene::playGame(){
    m_Timer.start();
    connect(&m_Timer,&QTimer::timeout,[=](){
        updatePosition();
        update();
        time+=0.01;
        collisionDetection();
    });
}


void MainScene::updatePosition(){
    //更新地图坐标
    m_jianting.m_Free = false;
    m_jianting.updatePosition();
    m_feiji.m_Free = false;
    m_feiji.updatePosition();
    m_feiji1.m_Free = false;
    m_feiji1.updatePosition();
    m_feiji2.m_Free = false;
    m_feiji2.updatePosition();
    m_feiji3.m_Free = false;
    m_feiji3.updatePosition();
    m_feiji4.m_Free = false;
    m_feiji4.updatePosition();
    m_lanjiedan1.m_Free = false;
    m_lanjiedan1.updatePosition();
    m_lanjiedan2.m_Free = false;
    m_lanjiedan2.updatePosition();
    //发射导弹
    m_feiji.shoot();
    //如果子弹为非空闲状态,计算发射位置
    if(!m_feiji.missile.m_Free) m_feiji.missile.updatePosition();
    m_feiji1.shoot1();
    if(!m_feiji1.missile1.m_Free) m_feiji1.missile1.updatePosition();
    m_feiji2.shoot2();
    if(!m_feiji2.missile2.m_Free) m_feiji2.missile2.updatePosition();
    m_feiji3.shoot3();
    if(!m_feiji3.missile3.m_Free) m_feiji3.missile3.updatePosition();
    m_feiji4.shoot4();
    if(!m_feiji4.missile4.m_Free) m_feiji4.missile4.updatePosition();


    m_jianting.shoot5();
    if(!m_jianting.m_lanjiedan1.m_Free) m_jianting.m_lanjiedan1.updatePosition();
    m_jianting.shoot6();

    if(!m_jianting.m_lanjiedan2.m_Free)m_jianting.m_lanjiedan2.updatePosition();
    //计算爆炸播放的图片
    for(int i = 0 ; i <=BOMB_NUM;i++) {
        if(m_bombs[i].m_Free == false){
            m_bombs[i].updateInfo();
        }
    }

}
void MainScene::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QFont f1("楷体",14,QFont::Bold,true);
    painter.setFont(f1);
    painter.setPen(Qt::yellow);
    painter.drawText(600,500,"舰艇血量:");
    painter.drawText(360,500,tr(gcvt(m_jianting.jianting_life,5,ptr)));
    //绘制地图
    painter.drawPixmap(0,0,1186,721,m_map.m_map1);
    if(m_jianting.jianting_life>0){
    painter.drawPixmap(m_jianting.m_XJianting,m_jianting.m_YJianting,120,50,m_jianting.m_Jianting);}
    else{
        if(lasttime){
            lasttime--;
            painter.drawPixmap(m_jianting.m_XJianting,m_jianting.m_YJianting,120,50,JianTingBomb);
        }
    }
    painter.drawPixmap(m_feiji.XPlane,m_feiji.YPlane,m_feiji.Plane);

    painter.drawPixmap(m_feiji1.XPlane1,m_feiji1.YPlane1,m_feiji1.Plane1);
    painter.drawPixmap(m_feiji2.XPlane2,m_feiji2.YPlane2,m_feiji2.Plane2);
    painter.drawPixmap(m_feiji3.XPlane3,m_feiji3.YPlane3,m_feiji3.Plane3);
    painter.drawPixmap(m_feiji4.XPlane4,m_feiji4.YPlane4,m_feiji4.Plane4);

     //绘制导弹
        if(!m_feiji.missile.m_Free&&!bump[0])
    {
        painter.drawPixmap(m_feiji.missile.m_X,m_feiji.missile.m_Y,m_feiji.missile.m_Missile );
    }

    if(!m_feiji1.missile1.m_Free&&!bump[1])
    {
        painter.drawPixmap(m_feiji1.missile1.m_X1,m_feiji1.missile1.m_Y1,m_feiji1.missile1.m_Missile );
    }

    if(!m_feiji2.missile2.m_Free&&!bump[2])
    {
        painter.drawPixmap(m_feiji2.missile2.m_X2,m_feiji2.missile2.m_Y2,m_feiji2.missile2.m_Missile );
    }
    if(!m_feiji3.missile3.m_Free&&!bump[3])
    {
        painter.drawPixmap(m_feiji3.missile3.m_X3,m_feiji3.missile3.m_Y3,m_feiji3.missile3.m_Missile );
    }
    if(!m_feiji4.missile4.m_Free&&!bump[4])
    {
        painter.drawPixmap(m_feiji4.missile4.m_X4,m_feiji4.missile4.m_Y4,m_feiji4.missile4.m_Missile );
    }
    if(!m_jianting.m_lanjiedan1.m_Free&&!lanjiedan_bomb[0])
    {
        if(m_jianting.m_lanjiedan1.m_x1>=m_feiji1.missile1.m_X1)
            painter.drawPixmap(m_jianting.m_lanjiedan1.m_x1,m_jianting.m_lanjiedan1.m_y1,m_jianting.m_lanjiedan1.m_Missile );

    }
    if(!m_jianting.m_lanjiedan2.m_Free&&!lanjiedan_bomb[1])
    {
    if(m_jianting.m_lanjiedan2.m_x2>=m_feiji3.missile4.m_X3)
        painter.drawPixmap(m_jianting.m_lanjiedan2.m_x2,m_jianting.m_lanjiedan2.m_y2,m_jianting.m_lanjiedan2.m_Missile );

    }

    for(int i=0;i<=4;i++)
        if(m_bombs[i].m_Free == false){
            painter.drawPixmap(m_bombs[i].m_X,m_bombs[i].m_Y,m_bombs[i].m_pixArr[m_bombs[i].m_index]);
            qDebug()<<"爆炸1";
        }


    if(lanjiedan_bomb[0]&&lasttime_lanjie_1){
        lasttime_lanjie_1--;
        qDebug()<<"爆炸2";
        painter.drawPixmap(m_jianting.m_lanjiedan1.m_x1,m_jianting.m_lanjiedan1.m_y1,JianTingBomb);
    }
    if(lanjiedan_bomb[1]&&lasttime_lanjie_2){
        qDebug()<<"爆炸3";
            lasttime_lanjie_2--;
            painter.drawPixmap(m_jianting.m_lanjiedan2.m_x2,m_jianting.m_lanjiedan2.m_y2,JianTingBomb);
    }
}


子弹运行逻辑:


void Missile::updatePosition()
{
    t++;

    m_X+=3;
    m_Y +=Acceleration*(2*t+1)/2;

    m_X1+=3;
//    m_Y1 += 1.4;
    m_Y1 +=Acceleration*(2*t+1)/2;

//    if(m_X2<=700){
//        m_Y2 += 2;
        m_Y2 +=Acceleration*(2*t+1)/2;
        m_X2+=3;
//    }

    m_X3+=3;
//    m_Y3 += 1.45;
    m_Y3 +=Acceleration*(2*t+1)/2;

//    if(m_X4<=680){
//        m_Y4 += 2.5;
    if(m_X4<=860){
        m_Y4 +=Acceleration*(2*t+1)/2;
        m_X4 += 3;
    }else{
        m_Y4 +=Acceleration*(2*t+1)/2;
        m_X4 -= 3;
    }



    if(m_x1>600 ){
        m_x1-=3;
        m_y1-=1.54;
    }
    if(m_x2>650){
        m_x2-=2;
        m_y2-=1.45;
    }
}

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值