程序设计实践坦克大战.docx
《程序设计实践坦克大战.docx》由会员分享,可在线阅读,更多相关《程序设计实践坦克大战.docx(15页珍藏版)》请在冰豆网上搜索。
程序设计实践坦克大战
《程序设计实践》
课程设计
学生姓名:
张俊强
学号:
221400433
专业班级:
软件工程四班
指导教师:
姚仰光
二○一五年六月二十七日
目录
游戏要求2
环境要求....................................................................................................2
界面要求....................................................................................................2
功能要求....................................................................................................3
其他要求....................................................................................................3
功能(部分代码)3
界面设计..................................................................................................3
键盘控制坦克..........................................................................................4
我方坦克的移动......................................................................................5
敌军坦克的信息......................................................................................5
子弹的发射..............................................................................................7
输赢的判断............................................................................................13
遇到的其他问题....................................................................................14
收获以及心得...................14
参考书籍.14
1.游戏要求
环境要求:
Windows操作系统,Qt5.3
界面要求:
该坦克大战有两个界面:
(1)主界面:
用于实现开始游戏和结束游戏,界面如下:
(2)游戏界面:
左侧是对战区,右侧是一个可以供操作的模板,里面显示你的得分,以及当前游戏等级(目前只有等级一)。
下面是可控操作我方坦克的控件(当然也可以空过键盘的W,S,A,D进行控制我方的坦克)。
在下面提供开始游戏,以及返回主界面的两个pushButton。
功能要求:
(1)用键盘上的w,s,a,d控制坦克上下左右移动,j控制发炮。
(2)敌方坦克必须会随机运动,随机开炮。
(3)坦克死亡时能出现爆炸的画面。
(4)能够实现得分的统计。
其他要求:
注意不要出现数组越界,空指针,以及申请的空间未被释放等问题。
2.功能(部分代码)
(1)界面设计
通过定义一个二维数组,在程序运行时,通过对数组的操作,来实现图片的重画,替换或者消失。
intMap[16][17]={
//0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
{2,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,4},//1
{0,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0,0},//2
{0,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0,0},//3
{0,0,1,1,0,0,1,1,1,1,1,0,0,1,1,0,0},//4
{0,0,1,1,0,0,1,1,1,1,1,0,0,1,1,0,0},//5
{0,0,1,1,0,0,1,1,1,1,1,0,0,1,1,0,0},//6
{0,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0,0},//7
{5,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0,6},//8
{0,0,1,1,0,0,0,1,0,1,0,0,0,1,1,0,0},//9
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//10
{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0},//11
{0,1,1,1,1,1,0,1,1,1,0,1,1,1,1,1,0},//12
{0,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0},//13
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//14
{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0},//15
{0,0,0,0,0,0,7,1,8,1,0,0,0,0,0,0,0},//16
};
其中1表示墙壁,2,3,4,5,6,分别表示五个敌军坦克,7表示我方坦克,8表示Boss
/*******绘画界面********/
for(i=0;i<=ROW;i++)
{
for(j=0;j
{
if(i==8&&j==15)
{
if(beenDied())painter.drawImage(QRectF(8*30,15*30,30,30),QImage("img/piece.bmp"));
elsepainter.drawImage(QRectF(i*30,j*30,30,30),QImage("img/boss.jpg"));
}
if(Map[j][i]==1)painter.drawImage(QRectF(i*30,j*30,30,30),QImage("img/wall.bmp"));
}
}
(2)键盘控制控制坦克
voidGameWidget:
:
keyPressEvent(QKeyEvent*k)
{
if(k->key()==Qt:
:
Key_W){if(!
s_u)
{if(isUnSuit(0,-1))Map[Count_y][Count_x]=0;Count_y--;if(isUnSuit())Map[Count_y][Count_x]=7;}s_d=s_l=s_r=1;s_u=0;
if(!
isUnSuit())Count_y++;signJ=Count_y;DirectionSign=1;}
elseif(k->key()==Qt:
:
Key_S){if(!
s_d)
{if(isUnSuit(0,1))Map[Count_y][Count_x]=0;Count_y++;if(isUnSuit())Map[Count_y][Count_x]=7;}s_u=s_l=s_r=1;s_d=0;
if(!
isUnSuit())Count_y--;signJ=Count_y;DirectionSign=2;}
elseif(k->key()==Qt:
:
Key_A){if(!
s_l)
{if(isUnSuit(-1,0))Map[Count_y][Count_x]=0;Count_x--;if(isUnSuit())Map[Count_y][Count_x]=7;}s_u=s_d=s_r=1;s_l=0;
if(!
isUnSuit())Count_x++;signI=Count_x;DirectionSign=3;}
elseif(k->key()==Qt:
:
Key_D){if(!
s_r)
{if(isUnSuit(1,0))Map[Count_y][Count_x]=0;Count_x++;if(isUnSuit())Map[Count_y][Count_x]=7;}s_u=s_d=s_l=1;s_r=0;
if(!
isUnSuit())Count_x--;signI=Count_x;DirectionSign=4;}
elseif(k->key()==Qt:
:
Key_J){shotSign=1;}
}
(3)我方坦克的移动
通过键盘(或者鼠标的点击)来改变我方坦克的坐标,将当前坐标置为7,原来坐标置为0
/***********坐标更新************/
switch(DirectionSign)
{
caseUP:
painter.drawImage(QRectF(Count_x*30,Count_y*30,30,30),QImage("img/MyTank_U.png"));break;
caseDOWN:
painter.drawImage(QRectF(Count_x*30,Count_y*30,30,30),QImage("img/MyTank_D.png"));break;
caseLEFT:
painter.drawImage(QRectF(Count_x*30,Count_y*30,30,30),QImage("img/MyTank_L.png"));break;
caseRIGHT:
painter.drawImage(QRectF(Count_x*30,Count_y*30,30,30),QImage("img/MyTank_R.png"));break;
default:
break;
}
(4)敌军坦克的信息
/*******************绘制敌军坦克***********************/
if(signStart){
for(i=0;i<5;i++){
if(tanklife[i]){
switch(Edirection[i]){
caseUP:
painter.drawImage(QRectF(Esignx[i]*30,Esigny[i]*30,30,30),QImage("img/EnemyTank_u.png"));break;
caseDOWN:
painter.drawImage(QRectF(Esignx[i]*30,Esigny[i]*30,30,30),QImage("img/EnemyTank_d.png"));break;
caseLEFT:
painter.drawImage(QRectF(Esignx[i]*30,Esigny[i]*30,30,30),QImage("img/EnemyTank_l.png"));break;
caseRIGHT:
painter.drawImage(QRectF(Esignx[i]*30,Esigny[i]*30,30,30),QImage("img/EnemyTank_r.png"));break;
default:
break;
}
}
}
}
/********************控制敌军坦克移动*******************/
for(inti=0;i<5;i++){
Edirection[i]=rand()%4+1;
switch(Edirection[i]){
caseUP:
if(Esigny[i]>0)
if(Map[Esigny[i]-1][Esignx[i]]!
=1&&Map[Esigny[i]-1][Esignx[i]]!
=7&&Map[Esigny[i]-1][Esignx[i]]!
=6&&Map[Esigny[i]-1][Esignx[i]]!
=5&&Map[Esigny[i]-1][Esignx[i]]!
=4&&Map[Esigny[i]-1][Esignx[i]]!
=3&&Map[Esigny[i]-1][Esignx[i]]!
=2)
{Esigny[i]--;JudgeTank(i);Map[Esigny[i]+1][Esignx[i]]=0;}
break;
caseDOWN:
if(Esigny[i]if(Map[Esigny[i]+1][Esignx[i]]!
=1&&Map[Esigny[i]+1][Esignx[i]]!
=7&&Map[Esigny[i]+1][Esignx[i]]!
=6&&Map[Esigny[i]+1][Esignx[i]]!
=5&&Map[Esigny[i]+1][Esignx[i]]!
=4&&Map[Esigny[i]+1][Esignx[i]]!
=3&&Map[Esigny[i]+1][Esignx[i]]!
=2)
{Esigny[i]++;JudgeTank(i);Map[Esigny[i]-1][Esignx[i]]=0;}
break;
caseLEFT:
if(Esignx[i]>0)
if(Map[Esigny[i]][Esignx[i]-1]!
=1&&Map[Esigny[i]][Esignx[i]-1]!
=7&&Map[Esigny[i]][Esignx[i]-1]!
=6&&Map[Esigny[i]][Esignx[i]-1]!
=5&&Map[Esigny[i]][Esignx[i]-1]!
=4&&Map[Esigny[i]][Esignx[i]-1]!
=3&&Map[Esigny[i]][Esignx[i]-1]!
=2)
{Esignx[i]--;JudgeTank(i);Map[Esigny[i]][Esignx[i]+1]=0;}
break;
caseRIGHT:
if(Esignx[i]if(Map[Esigny[i]][Esignx[i]+1]!
=1&&Map[Esigny[i]][Esignx[i]+1]!
=7&&Map[Esigny[i]][Esignx[i]+1]!
=6&&Map[Esigny[i]][Esignx[i]+1]!
=5&&Map[Esigny[i]][Esignx[i]+1]!
=4&&Map[Esigny[i]][Esignx[i]+1]!
=3&&Map[Esigny[i]][Esignx[i]+1]!
=2)
{Esignx[i]++;JudgeTank(i);Map[Esigny[i]][Esignx[i]-1]=0;}
break;
default:
break;
}
(5)子弹的发射
/********************控制我军坦克发子弹*******************/
/********************时间槽函数中的代码*******************/
if(shotSign)
{
switch(DirectionSign){
caseUP:
if(signJ>-1)signJ--;break;
caseDOWN:
if(signJcaseLEFT:
if(signI>-1)signI--;break;
caseRIGHT:
if(signI
default:
break;
}
}
/***********绘制发射子弹效果的代码********/
if(shotSign)
{
switch(DirectionSign){
caseUP:
painter.drawImage(QRectF(signI*30+10,signJ*30,10,10),QImage("img/bullet_u.jpg"));
if(Map[signJ][signI]==1){Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;}
for(i=2;i<7;i++)
{
if(Map[signJ][signI]==i){
tanklife[i-2]=0;
painter.drawImage(QRectF(signI*30+10,(signJ)*30,30,30),QImage("img/breaken.png"));
mark+=10;
label->setText(QString:
:
number(mark));
Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;break;}}
break;
caseDOWN:
painter.drawImage(QRectF(signI*30+10,signJ*30,10,10),QImage("img/bullet_u.jpg"));
if(Map[signJ][signI]==1){Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;}
for(i=2;i<7;i++)
{
if(Map[signJ][signI]==i){
tanklife[i-2]=0;
painter.drawImage(QRectF(signI*30+10,(signJ)*30,30,30),QImage("img/breaken.png"));
mark+=10;
label->setText(QString:
:
number(mark));
Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;break;}}
break;
caseLEFT:
painter.drawImage(QRectF(signI*30,signJ*30+10,10,10),QImage("img/bullet_l.jpg"));
if(Map[signJ][signI]==1){Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;}
for(i=2;i<7;i++)
{
if(Map[signJ][signI]==i){
tanklife[i-2]=0;
painter.drawImage(QRectF(signI*30+10,(signJ)*30,30,30),QImage("img/breaken.png"));
mark+=10;
label->setText(QString:
:
number(mark));
Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;break;}}
break;
caseRIGHT:
painter.drawImage(QRectF(signI*30+30,signJ*30+10,10,10),QImage("img/bullet_r.jpg"));
if(Map[signJ][signI]==1){Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;}
for(i=2;i<7;i++)
{
if(Map[signJ][signI]==i){
tanklife[i-2]=0;
painter.drawImage(QRectF((signI)*30+10,signJ*30,30,30),QImage("img/breaken.png"));
mark+=10;
label->setText(QString:
:
number(mark));
Map[signJ][signI]=0;shotSign=0;signI=Count_x;signJ=Count_y;break;}}
break;
default:
break;
}
//this->update();
if(signI==-1||signI==ROW-1||signJ==-1||signJ==COL-1){shotSign=0;signI=Count_x;signJ=Count_y;}
}
/********************敌军坦克发子弹*******************/
Eshotsign=rand()%10;
Etank=rand()%5;
if(Eshotsign==Etank)
{
switch(Edirection[Etank])
{
caseUP:
while(EsignI[Etank]!
=-1&&EsignI[Etank]!
=ROW-1&&EsignJ[Etank]!
=-1&&EsignJ[Etank]!
=COL-1&&Map[EsignJ[Etank]][EsignI[Etank]]!
=1)
{
painter.drawImage(QRectF(EsignI[Etank]*30+10,EsignJ[Etank]*30,10,10),QImage("img/bullet.png"));
EsignJ[Etank]--;
if(Map[EsignJ[Etank]][EsignI[Etank]]==7||Map[EsignJ[Etank]][EsignI[Etank]]==8)
{
painter.drawImage(QRectF(Count_x*30,Count_y*30,30,30),QImage("img/Bomb.png"));
Sleep(1000);
this->close();
QMessageBox:
:
information(this,"游戏结束","你输了");
this->close();
deletethis;
}
}
if(Map[EsignJ[Etank]][EsignI[Etank]]==1)Map[Esi
|