程序设计实践坦克大战.docx

上传人:b****5 文档编号:8637124 上传时间:2023-02-01 格式:DOCX 页数:15 大小:473.97KB
下载 相关 举报
程序设计实践坦克大战.docx_第1页
第1页 / 共15页
程序设计实践坦克大战.docx_第2页
第2页 / 共15页
程序设计实践坦克大战.docx_第3页
第3页 / 共15页
程序设计实践坦克大战.docx_第4页
第4页 / 共15页
程序设计实践坦克大战.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

程序设计实践坦克大战.docx

《程序设计实践坦克大战.docx》由会员分享,可在线阅读,更多相关《程序设计实践坦克大战.docx(15页珍藏版)》请在冰豆网上搜索。

程序设计实践坦克大战.docx

程序设计实践坦克大战

 

《程序设计实践》

课程设计

学生姓名:

张俊强

学号:

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(signJ

caseLEFT:

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1