C++大作业坦克大战.docx
- 文档编号:1318146
- 上传时间:2022-10-20
- 格式:DOCX
- 页数:22
- 大小:27.37KB
C++大作业坦克大战.docx
《C++大作业坦克大战.docx》由会员分享,可在线阅读,更多相关《C++大作业坦克大战.docx(22页珍藏版)》请在冰豆网上搜索。
C++大作业坦克大战
#include
#include
#includevwindows.h>
#include
#include
usingnamespacestd;
HANDLEMutex二CreateMutex(NULL,FALSE,NULL);/互斥对象
intGameOver=0;
intlevel=0;
intmap[23][23];
//坦克种类,Normal为玩家坦克
#defineNormalO
#defineRed1
#defineBlue2
#defineGreen3
//方向的宏定义
#defineUp0
#defineDown1
#defineLeft2
#defineRight3
//地图标记的宏定义
#defineEmpty0#definePlayer1
#definePlayerBullet2#defineEnemyBullet3
#defineEnemy4
intKill;
intKillRed;
intKillGreen;
intEnemyExist;
voidSetPos(inti,intj)//设定光标位置
{
COORDpos={i,j};
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(Out,pos);
}
voidHideCurSor(void)//隐藏光标
{
CONSOLE_CURSOR_INFOinfo={1,0};
HANDLEOut=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorInfo(Out,&info);
}
intsharp[4][12]=
{
{0,1,1,0,1,1,1,2,2,0,2,2},
{0,0,0,2,1,0,1,1,1,2,2,1},
{0,1,0,2,1,0,1,1,2,1,2,2},
{0,0,0,1,1,1,1,2,2,0,2,1},};//此数组用来保存坦克各个方向的形状信息
DWORDWINAPIBulletfly(LPVOIDlpParameter);//子弹函数申明voidUpdata();//更新界面信息函数申明
classTank//坦克类
{
private:
intDirection;//方向
inthotpoint[2];//活动点
intSpeed;//速度
intFirePower;//火力
构造函数
public:
Tank(intdir,inthot1,inthot2,inttyp,intspe,intfirepow)//
{
Direction=dir;
hotpoint[0]=hot1;
hotpoint[1]=hot2;
Type=typ;
Speed=spe;
FirePower=firepow;
}
intType;//坦克的种类(详见宏定义)
intlD;〃坦克在MAP中的标记(详见宏定义)
intFireEnable;//是否可以开火
intLife;//生命值
voidRunning();//运行函数
intJudge(intx,inty,intID);//判断是否可以绘制坦克voidDrawTank();//重绘坦克
voidRedraw();//擦除坦克
intGetSpeed()//获取速度
{
returnSpeed;
}
intGetFire()//获取火力
{
returnFirePower;
}
intGetDirection()//获取方向
{
returnDirection;
}
intGetHotX()//获取活动点坐标
{
returnhotpoint[0];
}
intGetHotY()
returnhotpoint[1];
}
voidIncreaseFire()//火力+
{
FirePower++;
}
voidIncreaseSpeed()//速度+
{
Speed++;
}
voidChangeDirection(intnewD)//改变方向
{
Direction=newD;
}
voidChangePos(intx,inty)//改变活动点
{
hotpoint[0]=x;
hotpoint[1]=y;
}
};
Tankplayer(Right,0,0,Normal,1,1);//玩家
Tankenemy(Left,20,0,Red,1,1);//敌人
voidTank:
:
DrawTank()//绘制坦克
inti;
intnx,ny;
if(Type==Red)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
elseif(Type==Blue)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
elseif(Type==Green)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
elseif(Type==Normal)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
for(i=0;i<6;i++)
{
nx=hotpoint[0]+sharp[Direction][i*2];ny=hotpoint[1]+sharp[Direction][i*2+1];
SetPos((ny+1)*2,nx+1);//利用sharp数组相对于点x,y绘制形状map[nx][ny]=ID;
cout<<"■";
}
voidTank:
:
Redraw()//擦除坦克,原理同上
{
inti;
intnx,ny;
for(i=0;i<6;i++)
{nx=hotpoint[0]+sharp[Direction][i*2];
ny=hotpoint[1]+sharp[Direction][i*2+1];
map[nx][ny]=Empty;
SetPos((ny+1)*2,nx+1);
cout<<"";
}
}
intTank:
:
Judge(intx,inty,intdir)//判断当前是否可以绘制坦克
{
inti;
intnx,ny;
for(i=0;i<6;i++)
{
nx=x+sharp[dir][i*2];ny=y+sharp[dir][i*2+1];
if(nx<0||nx>=23||ny<0||ny>=23||map[nx][ny]!
=Empty)//不能绘制,返回1
return1;
return0;
}
voidTank:
:
Running()//坦克运行函数
{
intnewD;
//坦克的运行
while
(1)
{
if(Life==0)
{
EnemyExist=0;//敌人不存在return;
}
if(GameOver==1)
return;
if(FireEnable==1&&GameOver==0)//如果可以开火
{
创建子
WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象FireEnable=0;//设为不可开火
HANDLEbullet=CreateThread(NULL,0,Bulletfly,&ID,0,NULL);//
弹线程
CloseHandle(bullet);
ReleaseMutex(Mutex);//释放互斥对象
Sleep(100);
}
WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象
srand((int)time(0));
newD=rand()%4;
if(newD==Up)//随机出新的方向并重新绘制坦克
{
Redraw();
if(Judge(hotpoint[0]-1,hotpoint[1],newD)==0)
{
hotpoint[0]--;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
elseif(newD==Down)
{
Redraw();
if(Judge(hotpoint[0]+1,hotpoint[1],newD)==0)
{
hotpoint[0]++;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
elseif(newD==Left)
{
Redraw();
if(Judge(hotpoint[0],hotpoint[1]-1,newD)==0)
{
hotpoint[1]--;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
elseif(newD==Right)
{
Redraw();
if(Judge(hotpoint[0],hotpoint[1]+1,newD)==0)
{
hotpoint[1]++;
Direction=newD;
}
else
{
if(Judge(hotpoint[0],hotpoint[1],newD)==0)
Direction=newD;
}
}
if(GameOver==0&&Life!
=0)
DrawTank();
ReleaseMutex(Mutex);//释放互斥对象
Sleep(500-80*Speed);
}
}
/*
********************
子弹线程函数
*******************
DWORDWINAPIBulletfly(LPVOIDlpParameter)
intPos[2];//子弹活动点intdirection;
intSpeed;
inttype;
inthit=0;//击中标记
intoldx,oldy;//旧活动点
intflag=0;//子弹是否有移动的标记
if(*ID==Player)//如果是玩家坦克
{
type=PlayerBullet;direction=player.GetDirection();
Speed=player.GetFire();
Pos[0]=player.GetHotX();
Pos[1]=player.GetHotY();
}elseif(*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 作业 坦克 大战