文档介绍:该【C大作业坦克大战 】是由【泰山小桥流水】上传分享,文档一共【34】页,该文档可以免费在线阅读,需要了解更多关于【C大作业坦克大战 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。#include<iostream>
#include<>
#include<>
#include<>
#include<>
usingnamespacestd;
HANDLEMutex=CreateMutex(NULL,FALSE,NULL);//互斥对象
intGameOver=0;
intlevel=0;
intmap[23][23];
坦克种类,Normal为玩家坦克
#defineNormal0
#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;//坦克的种类(详见宏定义)
intID;//坦克在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|FOREGOUND_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;
}
}