#include "tank.h"
#include "ui_tank.h"
#include "QDebug"
Tank::Tank(QWidget *parent) :
QWidget(parent),
ui(new Ui::Tank)
{
ui->setupUi(this);
setAttribute(Qt::WA_DeleteOnClose);
setFixedSize(WIDTH,HEIGHT);
setWindowTitle("坦克大战");
setWindowIcon(QIcon((rootdir+"pic//icon.png").c_str()));
setStyleSheet("background-color:black;");
campRect.setRect(12*BASESIZE,24*BASESIZE,SIZE,SIZE); //司令部的位置
//加载图像
bg_gray.load((rootdir+"pic\\bg_gray.gif").c_str());
bg_gray=resizePic(bg_gray,SIZE,SIZE);
grass.load((rootdir+"pic\\forest.gif").c_str());
grass = resizePic(grass,BASESIZE,BASESIZE);
brick.load((rootdir+"pic\\wall.gif").c_str());
brick = resizePic(brick,BASESIZE,BASESIZE);
iron.load((rootdir+"pic\\stone.gif").c_str());
iron = resizePic(iron,BASESIZE,BASESIZE);
water.load((rootdir+"pic\\river-0.gif").c_str());
water = resizePic(water,BASESIZE,BASESIZE);
ice.load((rootdir+"pic\\ice.gif").c_str());
ice = resizePic(ice,BASESIZE,BASESIZE);
timer1 = new QTimer(this);
timer2 = new QTimer(this);
timer3 = new QTimer(this);
timer4 = new QTimer(this);
timer5 = new QTimer(this);
connect(timer1,&QTimer::timeout,this,&Tank::play);
connect(timer2,&QTimer::timeout,this,&Tank::refresh);
connect(timer3,&QTimer::timeout,this,&Tank::enemyMove);
connect(timer4,&QTimer::timeout,this,&Tank::bulletMove);
connect(timer5,&QTimer::timeout,this,&Tank::enemyShot);
gate =2;
initMap();
}
void Tank::keyPressEvent(QKeyEvent *event)
{
if(start>0)
{
return;
}
if(event->key()==Qt::Key::Key_W)
{
role1.setDir(Direct::up);
}
else if(event->key()==Qt::Key::Key_S)
{
role1.setDir(Direct::down);
}
else if(event->key()==Qt::Key::Key_A)
{
role1.setDir(Direct::left1);
}
else if(event->key()==Qt::Key::Key_D)
{
role1.setDir(Direct::right1);
}
else if(event->key()==Qt::Key::Key_J)
{
if(!role1.bullet.getActive())
{
qDebug() << "玩家发射子弹";
role1.shot();
QSound::play((rootdir+"\\sound\\shoot.wav").c_str());
}
}
}
void Tank::keyReleaseEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key::Key_J)
{
return;
}
else
{
role1.ismove=false;
}
}
void Tank::play()
{
//玩家移动
if(role1.ismove)
{
role1.move();
QSound::play((rootdir+"\\sound\\move.wav").c_str());
}
}
void Tank::enemyMove()
{
//敌方坦克移动
static int d;
srand((unsigned)time(NULL));
for (auto& enemy:enemies)//使用引用类型 ,不然不是同一个对象
{
//随机方向移动
d = rand()%8;
if(d==0)
{
enemy.setDir(Direct::left1);
}
else if(d == 1)
{
enemy.setDir(Direct::up);
}
else if(d == 2)
{
enemy.setDir(Direct::right1);
}
else if(d == 3 || d== 4 || d == 5 || d == 6 || d == 7)
{
enemy.setDir(Direct::down);
}
enemy.move();
}
}
void Tank::enemyShot()
{
for(auto& enemy: enemies)
{
if(!enemy.bullet.getActive())
{
enemy.shot();
}
}
}
void Tank::bulletMove()
{
//玩家子弹移动
if(role1.bullet.getActive())
{
role1.bullet.move();
}
//敌人子弹移动
for(auto& enemy:enemies)
{
if(enemy.bullet.getActive())
{
enemy.bullet.move();
}
}
}
void Tank::refresh()
{
collisionCheck();
if(enemyNum<=0)
{
nextGate();
}
update();
}
void Tank::nextGate()
{
if(gate==35)
{
QMessageBox msg(QMessageBox::Icon(QMessageBox::Icon::Information),"Victory","恭喜你通过全部关卡");
msg.exec();
exit(1);
}
gate++;
initMap();
}
void Tank::collisionCheck()
{
//玩家子弹和敌方子弹碰撞检测
for(auto& enemy:enemies)
{
if(true==role1.bullet.rect.intersects(enemy.bullet.rect))
{
role1.bullet.setActive(false);
enemy.bullet.setActive(false);
break;
}
else if(true==campRect.intersects(enemy.bullet.rect)||true==campRect.intersects(role1.bullet.rect))
{
QSound::play((rootdir+"\\sound\\player_bomb.wav").c_str());
camp.load((rootdir+"pic\\camp1.gif").c_str());
camp = resizePic(camp,SIZE,SIZE);
update();
gameOver();
}
}
//玩家子弹和敌方坦克碰撞检测
for(auto enemy=enemies.begin();enemy!=enemies.end();enemy++)
{
if(true==role1.bullet.rect.intersects(enemy->rect))
{
QSound::play((rootdir+"\\sound\\enemy-bomb.wav").c_str());
enemies.erase(enemy);//需要重载 == 操作符
enemyNum--;
if(enemyNum<=0)
{
return;
}
createEnemy();
role1.bullet.setActive(false);
break;
}
}
//玩家和敌方子弹碰撞检测
for(auto& enemy:enemies)
{
if(true==role1.rect.intersects(enemy.bullet.rect))
{
enemy.bullet.setActive(false);
createPlayer();
QSound::play((rootdir+"\\sound\\player_bomb.wav").c_str());
life--;
if(life<=0)
{
gameOver();
}
break;
}
}
}
void Tank::initMap()
{
//加载地图
loadMap();
camp.load((rootdir+"pic\\camp0.gif").c_str());
camp = resizePic(camp,SIZE,SIZE);
QSound::play((rootdir+"sound\\start.wav").c_str());
//创建敌人
cursor=0;
enemyNum = 10;
for(int i=0;i<4;i++)
{
createEnemy();
}
//创建玩家
createPlayer();
life = 3;
// 开始游戏
start = 10;
timer1->start(100);//玩家移动速度
timer2->start(30);//检查碰撞 游戏是否结束
timer3->start(120); // 敌坦克移动
timer4->start(60); // 子弹移动
timer5->start(1500);// 敌坦克自动发射子弹
}
void Tank:: createEnemy()
{
if(enemyNum<4)
return;
Enemy enemy;
enemy.rect.setRect(cursor*SIZE,0,SIZE,SIZE);
enemies.push_back(enemy);
cursor+=6;
cursor%=18;
}
void Tank::createPlayer()
{
role1.bullet.setActive(false);
role1.setDir(Direct::up);
role1.ismove=false;
role1.rect.setRect(9*BASESIZE,24*BASESIZE,SIZE,SIZE);
}
void Tank::loadMap()
{
std::ifstream file;
try
{
file.open((QCoreApplication::applicationDirPath()+"\\res\\map.dat").toStdString().c_str(),std::ios::in|std::ios::binary);
if(!file)
{
throw "无法加载地图,请确保可执行文件所在目录的res目录下有map.dat文件,并且该游戏不放在中文目录下";
}
}
catch(const char *err)
{
QMessageBox msg(QMessageBox::Icon(QMessageBox::Icon::Critical),"ERROR",err);
msg.exec();
exit(-1);
}
file.seekg(sizeof(map)*(gate-1));
file.read(*map,sizeof(map));
file.close();
}
void Tank::drawStart(){
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
paint.drawPixmap(i*SIZE,j*SIZE,bg_gray);
}
}
paint.setFont(QFont("宋体",24));
paint.drawText(12*BASESIZE+10,13*BASESIZE+10,"第"+QString::number(gate)+"关");
}
void Tank::paintEvent(QPaintEvent *)
{
paint.begin(this);
//画关卡过渡界面
if(0<start--)
{
drawStart();
paint.end();
没有合适的资源?快使用搜索试试~ 我知道了~
c++/Qt实现的坦克大战
共245个文件
gif:201个
wav:21个
cpp:7个
需积分: 0 0 下载量 120 浏览量
2023-12-09
00:01:53
上传
评论
收藏 2.1MB ZIP 举报
温馨提示
c++/Qt实现的坦克大战
资源推荐
资源详情
资源评论
收起资源包目录
c++/Qt实现的坦克大战 (245个子文件)
tank.cpp 11KB
bullet.cpp 4KB
tankbase.cpp 4KB
enemy.cpp 1KB
player.cpp 1KB
main.cpp 171B
config.cpp 81B
map.dat 24KB
map.dat 24KB
map.dat 24KB
camp0.gif 157KB
camp1.gif 68KB
wall.gif 30KB
forest.gif 15KB
river-0.gif 14KB
river-1.gif 14KB
bg_gray.gif 10KB
stone.gif 5KB
select_player.gif 2KB
bg_black.gif 1KB
big-gameover.gif 976B
background.gif 921B
pts-0.gif 312B
4.gif 300B
pts-1.gif 286B
3.gif 268B
bunds.gif 196B
2.gif 173B
1.gif 163B
p1.gif 137B
p3.gif 136B
0.gif 135B
p0.gif 134B
p2.gif 134B
4-4-1.gif 134B
4-4-1.gif 134B
y4-4-1.gif 134B
g4-4-2.gif 134B
4-2-1.gif 133B
4-2-1.gif 133B
g4-2-1.gif 133B
y4-2-1.gif 133B
4-4-2.gif 132B
3-4-1.gif 132B
2-4-1.gif 132B
4-2-2.gif 132B
m3-3-2.gif 132B
3-4-2.gif 132B
m3-3-1.gif 132B
3-4-1.gif 132B
4-4-2.gif 132B
2-4-2.gif 132B
3-4-2.gif 132B
4-2-2.gif 132B
2-2-2.gif 132B
2-4-1.gif 132B
g4-4-1.gif 132B
m3-3-1.gif 132B
g4-2-2.gif 132B
y4-4-2.gif 132B
y4-2-2.gif 132B
m3-3-2.gif 132B
2-2-1.gif 131B
2-2-2.gif 131B
3-2-2.gif 131B
3-2-1.gif 131B
1-4-2.gif 131B
2-2-1.gif 131B
3-2-2.gif 131B
3-2-1.gif 131B
2-4-2.gif 130B
m3-1-2.gif 130B
m2-3-2.gif 130B
m2-3-1.gif 130B
1-4-2.gif 130B
m3-1-2.gif 130B
m2-3-2.gif 130B
m2-3-1.gif 130B
m3-1-1.gif 129B
m1-1-1.gif 129B
m3-1-1.gif 129B
m1-1-1.gif 129B
4-1-1.gif 128B
1-4-1.gif 128B
2-3-2.gif 128B
m1-1-2.gif 128B
m2-1-1.gif 128B
m1-3-2.gif 128B
1-4-1.gif 128B
4-1-1.gif 128B
y4-1-1.gif 128B
g4-1-1.gif 128B
m2-1-1.gif 128B
m1-1-2.gif 128B
m1-3-2.gif 128B
4-1-2.gif 127B
1-2-1.gif 127B
2-1-2.gif 127B
4-3-2.gif 127B
p4.gif 127B
共 245 条
- 1
- 2
- 3
资源评论
四维碎片
- 粉丝: 100
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于matlab实现本份代码能对图像进行gabor滤波处理,结合指纹方向图以及指纹沟壑频率特性,对指纹图像进行增强.rar
- 基于matlab实现RBM神经网络实现了手写数字体识别的GUI程序.rar
- 基于matlab实现蝙蝠算法优化相关向量机建模对数据进行建模和预测.rar
- 基于matlab实现编写的禁忌搜索算法,解决了TSP问题,对初学者有重要的参考价值.rar
- 基于matlab实现SOH关于IMU进行姿态求解的C代码,里面包含了两套代码,分别是重力约束法求解和梯度下降法求解.rar
- 1_简单电子邮件客户端.zip
- 基于matlab实现powell优化搜索算法,适合于多参数优化且目标函数中不包含参数的情况.rar
- 基于matlab实现PID神经网络前向和反向学习算法的matlab的原程序代码.rar
- 基于matlab实现nsga-2的多目标优化算法,有注解.rar
- AIR-AP1815-K9-ME-8-5-182-0.zipFor 1815 1830 1840 1850 2700 3700
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功