版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++实现飞机大战游戏COORDrandom(COORDa,COORDb);//产生随机敌机位置
voiddrawFrame(COORDa,COORD
b,charrow,charcol);//画出敌机
//把第y行,[x1,x2)之间的坐标填充为ch
voiddrawRow(inty,intx1,intx2,charch);
//把第x列,[y1,y2]之间的坐标填充为ch
voiddrawCol(intx,inty1,inty2,charch);
//绘制游戏界面
voiddrawPlaying();
voiddrawFrame(Frameframe,charrow,charcol);//画坠毁后的战机
//该函数用来判断战机的某一部分是否与敌机有接触
bool
judgeCoordInFrame(Frameframe,COORDspot);
voiddrawRow(COORDa,COORDb,charch);
game.cpp:
#include"game.h"
#includeWindows.h
#includeconio.h
Game::Game()
//调用类成员函数来进行初始化
initPlane();
initBullet();
initEnemy();
//初始化四个int型数据成员,采用赋值的方式进行初始化
//string类型的数据成员title没有进行初始化,因为:
//string本身就是一个标准库类类型,它的类定义中设置了默认构造函数,
//这些默认构造函数会将对象初始化为合理的默认状态,
//
string的默认构造函数会产生空字符串,相当于""。
this-score=0;
rank=25;
rankf=25;
flag_rank=0;
voidGame::initPlane()
COORDcentren;
centren.X=39;
centren.Y=22;
position[0].X=position[5].X=position[7].X=position[9].X=centren.X;
position[1].X=centren.X-2;
position[2].X=position[6].X=centren.X-1;
position[3].X=position[8].X=centren.X+1;
position[4].X=centren.X+2;
for(inti=0;ii++)
{
position[i].Y=centren.Y;
}
for(inti=6;ii++)
{
position[i].Y=centren.Y+1;
}
position[5].Y=centren.Y-1;
position[9].Y=centren.Y-2;
//这个函数体类的代码其实就是为了初始化战机的十个部分的位置,战机的组成如下所示:
//
|
5
//
|
9
//
*****
12034
//
***
678
//
第一排5个0的坐标依次对应了position[1]position[2]position[0]position[3]position[4]
//
第二排三个0的坐标依次对应了position[6]position[7]position[8]
//
两排0上面的两|的坐标从上往下依次对应了position[5]position[9]
voidGame::drawPlane()
for(inti=0;ii++)
{
SetPos(position[i].X,position[i].Y);
if(i!=5)
{
cout"*";
}
elseif(i==5)
{
cout"|";
}
}
//这个成员函数通过将战机的每个坐标处输出""来代替"0"和"|",
//来达到将战机消除的目的。
voidGame::drawPlaneToNull()
for(inti=0;ii++)
{
SetPos(position[i].X,position[i].Y);
cout"";
}
//该成员函数用来初始化子弹,
//即将每个子弹的Y坐标初始化为30(bullet[i].Y=30)来表示子弹处于失效状态
voidGame::initBullet()
for(inti=0;ii++)
{
bullet[i].Y=30;
}
//该成员函数用来画出子弹
//首先检查每颗子弹的有效性,如果子弹有效,则定位到该子弹的坐标处,输出"^",表示该子弹,
//如果子弹是无效的,则不绘制
voidGame::drawBullet()
for(inti=0;ii++)
{
if(bullet[i].Y!=30)
{
SetPos(bullet[i].X,bullet[i].Y);
cout"^";
}
}
//子弹失效
voidGame::drawBulletToNull()
for(inti=0;ii++)
if(bullet[i].Y!=30)
{
SetPos(bullet[i].X,bullet[i].Y+1);
cout"";
}
//这个函数用来初始敌机的位置,
//屏幕当中只能同时存在八架敌机,
//且每架敌机用如下结构体Frame来表示,如下所示:
//
typedefstructFrame
//
{
//
COORDposition[2];
//
intflag;
//
}Frame;
COORDrandom(COORDa,COORDb)
intx=rand()%(a.X-b.X)+a.X;
inty=rand()%(a.Y-b.Y)+a.Y;
COORDc={x,y};
returnc;
voidGame::initEnemy()
COORDa={1,1};
COORDb={45,15};
for(inti=0;ii++)
{
enemy[i].position[0]=random(a,b);
//
random(a,b)是调用了一个重载的函数,它表示在坐标a、b之间的矩形框
//
内随机生成一个坐标值,并将该坐标值作为敌机的左上角的坐标。
//enemy[i].position[0]中是一个Frame结构体类型的变量,存放了敌机i的左上角的坐标。
enemy[i].position[1].X=enemy[i].position[0].X+3;
enemy[i].position[1].Y=enemy[i].position[0].Y+2;
//enemy[i].position[1]也中是一个Frame结构体类型的变量,存放了敌机i的右下角的坐标。
}
//接下来要根据敌机的左上角坐标和右下角坐标画出敌机,
//显然,敌机的外形如下所示:
//
--
//
|
|
//
--
voidGame::drawEnemy()
for(inti=0;ii++)
{
drawFrame(enemy[i].position[0],enemy[i].position[1],'-','|');
}
//将敌机消除,通过输出空白的方式
voidGame::drawEnemyToNull()
for(inti=0;ii++)
{
drawFrame(enemy[i].position[0],enemy[i].position[1],'','');
}
//隐藏光标
voidHideCursor()
CONSOLE_CURSOR_INFOcursor_info={1,0};//第二个值0表示隐藏光标
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),cursor_info);
voidSetPos(inti,intj)//设置坐标点位(光标)
HANDLEhout;
COORDcoord;
coord.X=i;
coord.Y=j;
hout=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hout,coord);
//左上角坐标、右下角坐标、用row填充行、用col填充列
voiddrawFrame(COORDa,COORD
b,charrow,charcol)
drawRow(a.Y,a.X+1,b.X-1,row);
drawRow(b.Y,a.X+1,b.X-1,row);
drawCol(a.X,a.Y+1,b.Y-1,col);
drawCol(b.X,a.Y+1,b.Y-1,col);
//把第y行,[x1,x2)之间的坐标填充为ch
voiddrawRow(inty,intx1,intx2,charch)
SetPos(x1,y);
for(inti=0;i=(x2-x1);i++)
{
coutch;
}
//把第x列,[y1,y2]之间的坐标填充为ch
voiddrawCol(intx,inty1,inty2,charch)
inty=y1;
while(y!=y2+1)
{
SetPos(x,y);
coutch;
y++;
}
//主菜单绘制
intdrawMenu()
SetPos(30,1);
cout"飞机大战";
drawRow(3,0,79,'-');
drawRow(5,0,79,'-');
SetPos(28,4);
cout"w和s选择,k确定";
intj=11;
SetPos(12,j);
cout"";
SetPos(15,11);
cout"1.简单的敌人";
SetPos(15,13);
cout"2.冷酷的敌人";
drawRow(20,0,79,'-');
SetPos(47,11);
cout"简单的敌人:";
SetPos(47,13);
cout"简单敌人有着较慢的移动速度。";
SetPos(30,21);
cout"copyright@风兮木萧";
drawRow(22,0,79,'-');
while(true)
{
if(_kbhit())
{
charx=_getch();
switch(x)
{
case'w':
{
if(j==13)
{
SetPos(12,j);
cout"
";
j=11;
SetPos(12,j);
cout"";
SetPos(51,13);
cout"";
SetPos(47,11);
cout"简单的敌人:";
SetPos(51,13);
cout"简单敌人有着较慢的移动速度,比较容易对付";
}
break;
}
case's':
{
if(j==11)
{
SetPos(12,j);
cout"";
j=13;
SetPos(12,j);
cout"";
SetPos(51,13);
cout"
";
SetPos(47,11);
cout"冷酷的敌人:";
SetPos(51,13);
cout"冷酷的敌人移动速度较快,难对付哟。";
}
break;
}
case'k':
{
if(j==11)//源代码为8?
return1;
else
return2;
}
}
}
}
return0;
voiddrawFrame(intx1,inty1,intx2,inty2,charrow,charcol)
COORDa={x1,y1};
COORDb={x2,y2};
drawFrame(a,b,row,col);
//绘制游戏界面
voiddrawPlaying()
drawFrame(0,0,48,24,'=','|');//
drawmapframe主界面
drawFrame(49,0,79,4,'-','|');//
drawoutputframe状态界面
drawFrame(49,4,79,9,'-','|');//
drawscoreframe分数界面
drawFrame(49,9,79,20,'-','|');//
drawoperateframe操作界面
drawFrame(49,20,79,24,'-','|');//
drawothermessageframe提示界面
SetPos(52,6);
cout"得分:";
SetPos(52,7);
cout"称号:";
SetPos(52,11);
cout"操作方式:";
SetPos(52,13);
cout"
a,s,d,w:控制战机移动。";
SetPos(52,15);
cout"
p:暂停游戏。";
SetPos(52,17);
cout"
e:退出游戏。";
SetPos(52,22);
cout"游戏虽好玩,不要贪多哦";
//该成员函数用过响应战机的一个动作
//a,s,w,d,来控制战机的移动
voidGame::planeMove(charx)
if(x=='a')
{
if(position[1].X!=1)
{
for(inti=0;ii++)
{
position[i].X-=2;
}
}
}
//如果玩家按下'a'键,说明玩家想让战机往左移动一个距离(2个单位),
//首先检测,战机的最左侧的位置坐标(即position[1].X)有没有达到左边界,
//如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的X值减小2。
if(x=='s')
{
if(position[7].Y!=23)
{
for(inti=0;ii++)
{
position[i].Y+=1;
}
}
}
//如果玩家按下's'键,说明玩家想让战机往下移动一个距离(1个单位),
//首先检测,战机的最底部的位置坐标(即position[6].Y或者position[7].Y或者position[8].Y)有没有达到下边界,
//
如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的Y值增加1。
if(x=='d'(position[4].X!=47))
{
for(inti=0;ii++)
{
position[i].X+=2;
}
}
//如果玩家按下'd'键,说明玩家想让战机往右移动一个距离(2个单位),
//首先检测,战机的最右侧的位置坐标(即position[4].X)有没有达到右边界,
//
如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的X值增加2。
if(x=='w'(position[5].Y!=3))
{
for(inti=0;ii++)
{
position[i].Y-=1;
}
}
//如果玩家按下'w'键,说明玩家想让战机往上移动一个距离(1个单位),
//首先检测,战机的最顶部的位置坐标(即position[5].Y)有没有达到上边界,
//
如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的Y值减少1。
//该函数用来判断战机的某一部分是否与敌机有接触
//如果与敌机有接触在判断为坠毁
bool
judgeCoordInFrame(Frameframe,COORDspot)
if((spot.X=frame.position[0].X)(spot.X=frame.position[1].X)(spot.Y=frame.position[0].Y)(spot.Y=frame.position[1].Y))
{
returntrue;
}
returnfalse;
voiddrawFrame(Frameframe,charrow,charcol)
COORDa=frame.position[0];
COORDb=frame.position[1];
drawFrame(a,b,row,col);
//游戏结束
voidGame::GameOver()
system("cls");
COORDp1={28,9};
COORDp2={53,15};
drawFrame(p1,p2,'=','|');
SetPos(36,12);
stringstr="GameOver!";
for(inti=0;istr.size();i++)
{
Sleep(80);
coutstr[i];
}
Sleep(1000);
system("cls");
drawFrame(p1,p2,'=','|');
SetPos(31,11);
cout"击落敌机:"score/5"架";
SetPos(31,12);
cout"得分:"score;
SetPos(31,13);
cout"获得称号:"title;
SetPos(30,18);
Sleep(1000);
cout"继续?是(y)|否(n)";
as://goto语句标签直接跳转至此
charx=_getch();
if(x=='n')
{
exit(0);
}
elseif(x=='y')
{
system("cls");
Gamegame;
inta=drawMenu();
//绘制游戏开始界面主菜单
if(a==2)
game.rank=20;
system("cls");
drawPlaying();
//绘制游戏界面框架
game.Playing();
}
else
gotoas;
//该成员函数用来判断战机是否坠毁,
//依次判断每架敌机与战机的每个部分是否有接触,
//如果有接触,则表示战机坠毁
voidGame::judgePlane()
for(inti=0;ii++)
{
for(intj=0;jj++)
//此处的实参position[j]是指战机的10个部分的COORD坐标,
//类中的成员函数可以访问数据成员变量。
//此处也可以写成this-position[j],因为
//成员函数具有一个附加的隐含形参,即指向该类对象的一个指针,
//这个隐含形参命名为this,与调用成员函数的对象绑定在一起。
//成员函数不能定义this形参,而是由编译器隐含地定义。
//成员函数的函数体可以显式使用this指针,但不是必须这么做。
if(judgeCoordInFrame(enemy[i],position[j]))
{
SetPos(62,1);
cout"坠毁";
drawFrame(enemy[i],'+','+');
//将与战机相撞的敌机的形状绘制为:
//
++
//
+
+
//
++
Sleep(1000);
GameOver();
break;
}
}
//该成员函数用来使得游戏暂停
voidGame::Pause()
SetPos(61,2);
cout"
";
SetPos(61,2);
cout"暂停中...";
//当出现"暂停中..."的提示以后,程序不停的接收按下的按键,
//当按下'p'键以后,说明要退出暂停状态,此时需要清除"暂停中..."的提示
//通过输出空白"
"来将其覆盖,达到效果
charc=_getch();
while(c!='p')
{
c=_getch();
}
SetPos(61,2);
cout"
";
//这个成员函数用来响应一次射击操作,
//也就是,当游戏中的时候,玩家按下"k"键,就执行该函数。
//由于子弹是由COORDbullet[10]定义的,因此同一时刻,界面内只能有10颗子弹同时出现。
//如果界面内不够10颗子弹,按下"k"键后战机应该发射出一颗子弹,
//于是,依次遍历10颗子弹,当遇到第一颗失效的子弹后,
//立即将该子弹赋予新的坐标(战机的炮口,也就是(position[5].X,position[5].Y-1)),
//让其激活。然后退出for循环,函数执行完毕。
voidGame::Shoot()
for(inti=0;ii++)
{
if(bullet[i].Y==30)
{
bullet[i].X=position[5].X;
bullet[i].Y=position[5].Y-1;
break;
}
}
voidGame::drawThisBulletToNull(COORDc)
SetPos(c.X,c.Y);
cout"";
//此成员函数用来响应一次子弹的运动
//每次子弹运动,屏幕子弹的坐标都会出现变化,即
//先判断子弹是否有效(即判断语句if(bullet[i].Y!=30)),
//若子弹有效,将该子弹的Y坐标减少1,X坐标不变,
//检测子弹坐标更改之后是否达到上边界,如果达到上边界,则将该子弹从屏幕上擦除,
//同时,将该子弹置为失效状态,即bullet[i].Y=30。
voidGame::bulletMove()
for(inti=0;ii++)
{
if(bullet[i].Y!=30)
{
bullet[i].Y-=1;
if(bullet[i].Y==1)
{
COORDpos={bullet[i].X,bullet[i].Y+1};
drawThisBulletToNull(pos);
bullet[i].Y=30;
}
}
}
//击败的敌机清空
voidGame::drawThisEnemyToNull(Framef)
drawFrame(f,'','');
//该成员函数依次遍历每一架敌机,
//将每一架敌机依次与每一颗子弹进行检测,
//判断敌机是否与子弹有接触,如果有接触,则表示击中敌机,
//此时将敌机和子弹擦除,然后在界面顶部的位置处随机生成一架敌机
voidGame::judgeEnemy()
for(inti=0;ii++)
{
for(intj=0;jj++)
{
if(judgeCoordInFrame(enemy[i],bullet[j]))
{
score+=5;
drawThisEnemyToNull(enemy[i]);
COORDa={1,1};
COORDb={45,3};
enemy[i].position[0]=random(a,b);
enemy[i].position[1].X=enemy[i].position[0].X+3;
enemy[i].position[1].Y=enemy[i].position[0].Y+2;
drawThisBulletToNull(bullet[j]);
bullet[j].Y=30;
}
}
}
//该成员函数用来响应一次敌机的移动
//界面上必须同时出现八架敌机,因此,
//如果有某架敌机运动到下边界处,则重置该敌机的坐标
voidGame::enemyMove()
for(inti=0;ii++)
{
for(intj=0;jj++)
enemy[i].position[j].Y++;
//我们将每架敌机的左上角和右下角坐标的Y值增加1,
//表示该敌机向下走了一个距离
//检测向下走一个距离后的敌机的右下角坐标的Y值是否达到24,
//如果达到,代表敌机已经运动到下边界了,
//此时需要随机重置该敌机的坐标
if(enemy[i].position[1].Y==24)
{
COORDa={1,1};
COORDb={45,3};
enemy[i].position[0]=random(a,b);
enemy[i].position[1].X=enemy[i].position[0].X+3;
enemy[i].position[1].Y=enemy[i].position[0].Y+2;
}
}
voidGame::printScore()
if(score=120)
{
flag_rank=1;
}
elseif(score120score=360)
{
flag_rank=2;
}
elseif(score360score=480)
{
flag_rank=3;
}
elseif(score480)
{
flag_rank=4;
}
SetPos(60,6);
coutscore;
SetPos(60,7);
if(flag_rank==1)
{
title="初级飞行员";
}
elseif(flag_rank==2)
{
title="中级飞行员";
}
elseif(flag_rank==3)
{
title="高级飞行员";
}
elseif(flag_rank==4)
{
title="王牌飞行员";
}
couttitle;
//这个成员函数是游戏的主循环函数,
//定义了整个游戏过程。
voidGame::Playing()
drawEnemy();
drawPlane();
intflag_bullet=0;
intflag_enemy=0;
while(true)
{
Sleep(20);
//函数名:kbhit()(VC++6.0下为_kbhit())
//功能及返回值:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
//用法:intkbhit(void);
//包含头文件:includeconio.h
//kbhit()在执行时,检测是否有按键按下,有按下返回非0值,没有按下则返回0,是非阻塞函数;
//不同于getch()的在执行时,检测按下什么键,如果不按键该函数不返回,也就不进行下一步操作,是阻塞函数。
if(_kbhit())
{
charx=_getch();
//getch()是编程中所用的函数,这个函数是一个不回显函数,
//当用户按下某个字符时,函数自动读取,无需按回车
//getch()并非标准C中的函数,不存在C语言中。
//所在头文件是conio.h,而不是stdio.h。
//用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
if('a'==x||'s'==x||'d'==x||'w'==x)
{
drawPlaneToNull();
//将战机先擦除
planeMove(x);
//根据所输入的操作符,对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上海外国语大学贤达经济人文学院《护理伦理学》2025-2026学年期末试卷
- 上海行健职业学院《推拿治疗学》2025-2026学年期末试卷
- 儿科疱疹性口炎患儿护理指南
- 胰头癌术后护理培训指导
- 2026年成人高考土木工程专业力学单套试卷
- 2026年成人高考高起专市场营销学单套试卷
- h1受体拮抗剂的最佳适应证是
- 浙江高考真题及答案
- 2025-2026学年人教版七年级音乐上册音乐欣赏与鉴赏测试卷(含答案)
- 云南高考理综试卷及答案
- 中药提取安全培训课件
- 生产安全标准化操作指南与风险控制点
- 班会教学设计-公共生活靠大家 2023-2024学年高一上学期
- 泸州机房工程方案(3篇)
- 公安局局长在未成年人保护和预防未成年人犯罪工作会上的讲话
- 【《小米手机市场营销策略建议研究》10000字(论文)】
- 猪的肠道健康及其维护讲课文档
- 广告文案教案
- 2025年广元市中考数学试题卷(含答案解析)
- 智能立库系统应用案例解析
- 挖掘机作业安全交底及注意事项
评论
0/150
提交评论