#include
HANDLE Mutex=CreateMutex(NULL,FALSE,NULL);//互斥对象
int GameOver=0; int level=0;
int map[23][23];
//坦克种类,Normal为玩家坦克 #define Normal 0 #define Red 1 #define Blue 2 #define Green 3 //方向的宏定义 #define Up 0 #define Down 1 #define Left 2 #define Right 3
//地图标记的宏定义 #define Empty 0 #define Player 1
#define PlayerBullet 2 #define EnemyBullet 3 #define Enemy 4
int Kill; int KillRed; int KillGreen; int EnemyExist;
void SetPos(int i,int j)//设定光标位置 { COORD pos={i,j}; HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(Out, pos); }
void HideCurSor(void)//隐藏光标 { CONSOLE_CURSOR_INFO info={1,0};
HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(Out,&info); }
int sharp[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}, };//此数组用来保存坦克各个方向的形状信息
DWORD WINAPI Bulletfly(LPVOID lpParameter);//子弹函数申明 void Updata();//更新界面信息函数申明
class Tank//坦克类 {
private: int Direction;//方向 int hotpoint[2];//活动点 int Speed;//速度 int FirePower;//火力 public: Tank(int dir,int hot1,int hot2,int typ,int spe,int firepow)//构造函数 { Direction=dir; hotpoint[0]=hot1; hotpoint[1]=hot2; Type=typ; Speed=spe; FirePower=firepow; }
int Type;//坦克的种类(详见宏定义)
int ID;//坦克在MAP中的标记(详见宏定义) int FireEnable;//是否可以开火 int Life;//生命值
void Running();//运行函数
int Judge(int x,int y,int ID);//判断是否可以绘制坦克 void DrawTank();//重绘坦克 void Redraw();//擦除坦克 int GetSpeed()//获取速度 { return Speed; }
};
int GetFire()//获取火力 { return FirePower; }
int GetDirection()//获取方向 { return Direction; }
int GetHotX()//获取活动点坐标 { return hotpoint[0]; }
int GetHotY() { return hotpoint[1]; }
void IncreaseFire()//火力+ { FirePower++; }
void IncreaseSpeed()//速度+ { Speed++; }
void ChangeDirection(int newD)//改变方向 { Direction=newD; }
void ChangePos(int x,int y)//改变活动点 { hotpoint[0]=x; hotpoint[1]=y; }
Tank player(Right,0,0,Normal,1,1);//玩家 Tank enemy(Left,20,0,Red,1,1);//敌人
void Tank::DrawTank()//绘制坦克 { int i; int nx,ny; if(Type==Red)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED); else if(Type==Blue) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE); else if(Type==Green) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_GREEN); else if(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<<\■\
void Tank::Redraw()//擦除坦克,原理同上 { int i; int nx,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<<\ } }
int Tank::Judge(int x,int y,int dir)//判断当前是否可以绘制坦克 { int i; int nx,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 return 1; }
return 0;
void Tank::Running()//坦克运行函数 { int newD;
//坦克的运行 while(1) { if(Life==0) {
EnemyExist=0;//敌人不存在 return; }
if(GameOver==1) return;
if(FireEnable==1&&GameOver==0)//如果可以开火 {
WaitForSingleObject(Mutex,INFINITE);//线程拥有互斥对象 FireEnable=0;//设为不可开火 HANDLE bullet=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
C++大作业坦克大战



