}
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)//随机出新的方向并重新绘制坦克
6
{ 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; } } else if(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; } } else if(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; } } else if(newD==Right) { Redraw();
7
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); } }
/*********************子弹线程函数*******************/ DWORD WINAPI Bulletfly(LPVOID lpParameter) { int *ID=(int *)lpParameter;//ID用来获取发射子弹坦克的ID int Pos[2];//子弹活动点 int direction; int Speed; int type; int hit=0;//击中标记 int oldx,oldy;//旧活动点 int flag=0;//子弹是否有移动的标记 if(*ID==Player)//如果是玩家坦克 { type=PlayerBullet; direction=player.GetDirection(); Speed=player.GetFire(); Pos[0]=player.GetHotX(); Pos[1]=player.GetHotY(); }
else if(*ID==Enemy)//如果是敌人坦克 { type=EnemyBullet; direction=enemy.GetDirection(); Speed=enemy.GetFire(); Pos[0]=enemy.GetHotX(); Pos[1]=enemy.GetHotY();
8
} if(direction==Up)//根据坦克的位置和方向确定子弹的初始坐标 { Pos[0]--; Pos[1]++; } else if(direction==Down) { Pos[0]+=3; Pos[1]++; } else if(direction==Left) { Pos[0]++; Pos[1]--; } else if(direction==Right) { Pos[0]++; Pos[1]+=3; } //子弹的运行 while(1) { WaitForSingleObject(Mutex,INFINITE);//这个不再注释了。。。。。 if(flag==1&&hit!=1)//擦除原位置 { map[oldx][oldy]=Empty; SetPos((oldy+1)*2,oldx+1); cout<<\ } if(GameOver==1) return 0; if(hit==1||Pos[0]<0||Pos[0]>22||Pos[1]<0||Pos[1]>22)//如果击中 { ReleaseMutex(Mutex); Sleep(500); if(type==PlayerBullet) player.FireEnable=1; else if(type=EnemyBullet) enemy.FireEnable=1; break; } switch(map[Pos[0]][Pos[1]])//子弹经过的MAP的标记
9
{ case Empty://如果是空位置就绘制子弹 map[Pos[0]][Pos[1]]=type; SetPos((Pos[1]+1)*2,Pos[0]+1); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); cout<<\■\ break; case Player://如果是玩家位置 if(type!=PlayerBullet) { player.Life--;//生命减少 if(player.Life<=0) GameOver=1; } Updata(); hit=1; break; case Enemy://如果是敌人位置 if(type!=PlayerBullet) hit=1; else { hit=1; Kill++; if(Kill ==0&&player.Life<5)//击杀数++ player.Life++; if(enemy.Type==Red)//如果击杀红坦克 { KillRed++; if(KillRed==0&&player.GetFire()<5) player.IncreaseFire(); } if(enemy.Type==Green)///如果击杀绿坦克 { KillGreen++; if(KillGreen==0&&player.GetSpeed()<5) player.IncreaseSpeed(); } enemy.Redraw();//擦除敌人 enemy.Life=0;//敌人死亡 }
10