基本信息
源码名称:c++ 坦克大战 小游戏源码(入门级)
源码大小:8.80M
文件格式:.rar
开发语言:C/C++
更新时间:2019-04-19
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

#include "pch.h"
#include "Game.h"
#include <time.h>
#include <mmsystem.h>
#pragma comment(lib, "WINMM.LIB")

Game::Game()
{
	
}
Game::~Game()
{
}
/********************************************************
第一部分:初始化游戏设置
		1.设置窗口大小
		2.隐藏光标
		3.切换英文输入法
		4.背景音乐
*********************************************************/
void Game::InitGameSet()
{
	TCHAR* GameName = L"坦克大战";
	SetWindowSize(GameName, 120, 40);				//设置窗口标题,大小
	//切换输入法
	keybd_event(VK_SHIFT, 0, 0, 0);
	Sleep(100);
	keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
	//隐藏光标
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);	//标准输出设备句柄
	CONSOLE_CURSOR_INFO cci;							//鼠标结构体
	cci.dwSize = 1;
	cci.bVisible = false;
	SetConsoleCursorInfo(hStdOut, &cci);
	//设置背景音乐
	PlaySound(L"..\\TankDemo\\Sound\\tank.wav", NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
	GetMap(GameLevel);		//地图初始化
}
/********************************************************
第二部分:游戏主菜单
		1.清屏
		2.打印游戏菜单
		3.模式选择控制
*********************************************************/
void Game::GameMenu()
{
	ClearFullScreen();		//清屏
	//初始化游戏菜单
	for (UINT i=0;i< menu.NUM;i  )
	{
		menu.Coord[i].X = 16;
	}
	menu.Coord[0].Y = 20;
	menu.Coord[1].Y = 23;
	menu.Coord[2].Y = 25;
	menu.Coord[3].Y = 27;
	menu.Coord[4].Y = 29;
	menu.Coord[5].Y = 31;
	menu.Coord[6].Y = 34;
	//打印游戏菜单
	/****************************************************/
	char* Tank[8] =
	{
		{"          ★★█〓███████▇▅▅▅▅▅▅▅▄▄▄▄▄▅▇▇▇    ●    ●"},
		{"                         █●█"},
		{"       ◢▄██●★●█████●★●███▄◣"},
		{"     ◢〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓◣"},
		{"  ▄▅██████████████████████▅▄▃"},
		{"◢〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓◣"},
		{"◥███████████████████████████◤"},
		{"  ◥●▲●▲●▲●▲●▲●▲●▲●▲●▲●▲●▲●▲●◤"}
	};
	for (UINT i = 0; i < 8; i  )
	{
		WriteChar(14, 2   2 * i, Tank[i], 0x02);
	}
	for (UINT i = 0; i < menu.NUM; i  )
	{
		WriteChar(menu.Coord[i].X, menu.Coord[i].Y, menu.menu[i], 蓝色);
	}
	//游戏模式选择
	/****************************************************/
	WriteChar(menu.Coord[1].X, menu.Coord[1].Y, menu.menu[1], 红色);	//默认选择第一项
	int No = 1;
	while (1)
	{
		if (GetAsyncKeyState(VK_UP) & 0x8000)		//↑按键处理
		{
			WriteChar(menu.Coord[No].X, menu.Coord[No].Y, menu.menu[No], 蓝色);
			if (No == 1)
				No = 5;
			else
				No--;
			WriteChar(menu.Coord[No].X, menu.Coord[No].Y, menu.menu[No], 红色);
		}
		else if (GetAsyncKeyState(VK_DOWN) & 0x8000)//↓按键处理
		{
			WriteChar(menu.Coord[No].X, menu.Coord[No].Y, menu.menu[No], 蓝色);
			if (No == 5)
				No = 1;
			else
				No  ;
			WriteChar(menu.Coord[No].X, menu.Coord[No].Y, menu.menu[No], 红色);
		}
		else if (GetAsyncKeyState(0xD) & 0x8000)      //回车确定
		{
			switch (No)									//进入游戏
			{
			case 开始游戏: SingleMode = true; return;
			case 双人模式: SingleMode = false; return;
			case 用户地图: UserMap(); return;
			case 载入存档: LoadRecord(); return;
			case 退出游戏: exit(0);
			}
		}
		Sleep(100);
	}
}
/********************************************************
函数功能:接收键盘输入,控制坦克
参数	:无
返回值	:无
*********************************************************/
void Game::KeyboardA()
{
	int nCount = 0;	//计数器
	if (GetAsyncKeyState('W') & 0x8000)
		tankA.Move(UP);
	else if (GetAsyncKeyState('S') & 0x8000)
		tankA.Move(DOWN);
	else if (GetAsyncKeyState('A') & 0x8000)
		tankA.Move(LEFT);
	else if (GetAsyncKeyState('D') & 0x8000)
		tankA.Move(RIGHT);
	else if (GetAsyncKeyState('J') & 0x8000)
	{
		CreatBullet(tankA);
	}
	else if (GetAsyncKeyState(VK_SPACE) & 0x8000)   //空格
	{
		GameStop();
	}	
	else if (GetAsyncKeyState(VK_ESCAPE) & 0x8000)  // Esc键
		exit(0);
	else if (nCount   % 5 == 0)		//防止按键粘连,达到微调速度
	{
		if (GameSpeed > 1 && GetAsyncKeyState(VK_ADD) & 0x8000)
			GameSpeed--;
		if (GameSpeed < 20 && GetAsyncKeyState(VK_SUBTRACT) & 0x8000)
			GameSpeed  ;
	}									//退出程序函数	
	else
	{
		//return;
	}
}

void Game::KeyboardB()
{
	if (GetAsyncKeyState(VK_UP) & 0x8000)
	tankB.Move(UP);
	else if (GetAsyncKeyState(VK_DOWN) & 0x8000)
	tankB.Move(DOWN);
	else if (GetAsyncKeyState(VK_LEFT) & 0x8000)
	tankB.Move(LEFT);
	else if (GetAsyncKeyState(VK_RIGHT) & 0x8000)
	tankB.Move(RIGHT);
	else if (GetAsyncKeyState(VK_NUMPAD5) & 0x8000)
	{
	CreatBullet(tankB);
	}
	else
	{ }
}

/********************************************************
函数功能:存档
参数	:无
返回值	:无
*********************************************************/
void Game::SaveInfo()
{
	FILE *fp;
	errno_t err;
	err = fopen_s(&fp, "..\\TankDemo\\GameInfo\\Info.txt", "wb");
	if (err)
	{
		WriteChar(20, 20, "存档失败…",红色);
		return;
	}
	//保存地图
	fwrite(g_MAP, sizeof(char), 40 * 40, fp);
	//保存坦克
	fwrite(tankArr, sizeof(Tank), 6, fp);
	//保存子弹数量
	UINT bulletNum = m_bullet.size();
	fwrite(&bulletNum, sizeof(UINT), 1, fp);
	fwrite(&m_bullet, sizeof(vector<Bullet>), bulletNum, fp);
	//保存游戏信息-->|关卡|单人/双人模式标志|游戏速度
	fwrite(&GameLevel, sizeof(UINT), 1, fp);
	fwrite(&SingleMode, sizeof(bool), 1, fp);
	fwrite(&GameSpeed, sizeof(UINT), 1, fp);
	fclose(fp);
}
/********************************************************
函数功能:读档
参数	:无
返回值	:无
*********************************************************/
void Game::ReadInfo()
{
	FILE *fp;
	errno_t err;
	err = fopen_s(&fp, "..\\TankDemo\\GameInfo\\Info.txt", "rb");
	if (err)
	{
		WriteChar(20, 20, "读档失败…", 红色);
		return;
	}
	//读取地图
	fread(g_MAP, sizeof(char), 40 * 40, fp);
	//读取坦克
	fread(tankArr, sizeof(Tank), 6, fp);
	//读取子弹/数量
	UINT bulletNum = 0;
	fread(&bulletNum, sizeof(UINT), 1, fp);
	fread(&m_bullet, sizeof(vector<Bullet>), bulletNum, fp);
	//读取游戏信息-->|关卡|单人/双人模式标志|游戏速度
	fread(&GameLevel, sizeof(UINT), 1, fp);
	fread(&SingleMode, sizeof(bool), 1, fp);
	fread(&GameSpeed, sizeof(UINT), 1, fp);
	fclose(fp);
	//初始化游戏
	DrawMainScreen(g_MAP);		//打印主屏幕
	DrawSideScreen();			//打印副屏幕
	for (UINT i = 0; i < 6; i  )			//打印坦克
	{
		tankArr[i].Show();
	}
	for (UINT i = 0; i < bulletNum; i  )	//打印子弹
	{
		m_bullet[i].Show();
	}
}
/********************************************************
函数功能:加载存档,进行游戏
参数	:无
返回值	:无
*********************************************************/
void Game::LoadRecord()
{
	//清屏
	ClearFullScreen();
	//初始化随机数种子
	srand((unsigned int)(time(NULL)));
	ReadInfo();
	GameLoop();
}
/********************************************************
函数功能:游戏胜利进入下一关
参数	:无
返回值	:无
*********************************************************/
void Game::NextLevel()
{
	int timing = 0, ColorNo = 1;
	COLOR Color;
	GameLevel  ;
	if (GameLevel <= MaxLevel)
		while (1)
		{
			if (timing   % 30 == 0)        //30次打印一次
			{
				Color = SetColor(ColorNo);

				WriteChar(18, 20, "恭喜过关!", Color);     //主屏幕中心打印
				WriteChar(50, 15, "等待下关", Color);      //副屏幕打印
				WriteChar(45, 18, "请按回车键进入下一关卡!", Color);
				WriteChar(45, 19, "或按 Esc键退出游戏!", Color);
				if (  ColorNo == 8)
					ColorNo = 1;
			}
			if (GetAsyncKeyState(0xD) & 0x8000)  //回车键
			{
				WriteChar(50, 15, "正在进行", 0x01);			//清除副屏幕提示
				WriteChar(45, 18, "                       ", 0x00);
				WriteChar(45, 19, "                       ", 0x00);
				ClearMainScreen();			//主屏清屏函数
				GetMap(GameLevel);			//获取关卡地图
				InitGame();					//从本关重新开始
				break;
			}
			else if (GetAsyncKeyState(0x1B) & 0x8000)  //Esc键退出	
				exit(0);
			Sleep(20);
		}
	else   // 通关
		while (1)
		{
			if (timing   % 5 == 0)
			{
				Color = SetColor(ColorNo);

				WriteChar(18, 20, "恭喜通过全部关卡!", Color);		//主屏幕中心打印
				WriteChar(50, 15, "全部通关", Color);				//副屏幕打印
				WriteChar(45, 18, "恭喜通过全部关卡!", Color);
				WriteChar(45, 19, "按 Esc键退出游戏!", Color);
				if (  ColorNo == 8)
					ColorNo = 1;
			}
			if (GetAsyncKeyState(0x1B) & 0x8000)  //Esc键退出	
				exit(0);
			Sleep(20);
		}
}

/********************************************************
函数功能:自定义地图副屏幕(地形选择)
参数	:无
返回值	:无
*********************************************************/
void Game::DrawUserSideScreen()
{
	for (int i = 0; i < 40; i  )
		for (int j = 0; j < 20; j  )
		{
			switch (UserSideScreen[i][j])
			{
			case 1:WriteChar(j   40, i, "■", 0x0F); break;
			case 2:WriteChar(j   40, i, "▄ 土墙", 0x04); break;        //红色的土墙
			case 3:WriteChar(j   40, i, "■ 钢墙", 0x0F); break;        //白色的钢墙
			case 4:WriteChar(j   40, i, "~ 河流", 0x1F); break;        //蓝色的河流
			case 5:WriteChar(j   40, i, "▓ 草地", 0x02); break;        //绿色的草地
			case 6:WriteChar(j   40, i, "▓ 沙地", 0x06); break;        //黄色的沙地
			case 7:WriteChar(j   40, i, "  保存地图", 0x09); break;     
			case 8:WriteChar(j   40, i, "**", 0x0D); break;					
			case 9:WriteChar(j   40, i, "返回主菜单", 0x09); break;       
			}
		}
}
/********************************************************
函数功能:设置字体颜色
参数	:颜色编号
返回值	:颜色
*********************************************************/
COLOR Game::SetColor(int No)
{
	switch (No)
	{
	case 0:return 黑色;
	case 1:return 蓝色;
	case 2:return 绿色;
	case 3:return 浅绿色;
	case 4:return 红色;
	case 5:return 紫色;
	case 6:return 黄色;
	case 7:return 白色;
	case 8:return 灰色;
	case 9:return 淡蓝色;
	case 10:return 淡绿色;
	case 11:return 淡浅绿色;
	case 12:return 淡红色;
	case 13:return 淡紫色;
	case 14:return 淡黄色;
	default:return 亮白色;
	};
}

/********************************************************
函数功能:鼠标按键处理函数
参数	:无
返回值	:无
*********************************************************/
void Game::MouseOp()
{
	HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
	INPUT_RECORD stcRecord = { 0 };     //定义输入事件结构体 
	MOUSE_EVENT_RECORD mer;    //鼠标事件
	DWORD dwRead = 0;          //用于存储读取记录  
	COORD pos = { 0 };         //用于存储鼠标当前位置 
	//重设接受模式;避免受cls影响;
	SetConsoleMode(hStdIn, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);
	while (1)
	{
		//等待事件
		ReadConsoleInput(hStdIn, &stcRecord, 1, &dwRead);
		//处理事件
		if (stcRecord.EventType == MOUSE_EVENT)
		{
			mer = stcRecord.Event.MouseEvent;
			if (mer.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
			{	//鼠标左击,绘制障碍物
				if (mer.dwMousePosition.X / 2 >= 18 && mer.dwMousePosition.X / 2 <= 20 && mer.dwMousePosition.Y >= 36)//鼠标在在老巢范围内
					continue;
				if (mer.dwMousePosition.X / 2 >= 1 && mer.dwMousePosition.X / 2 <= 38 &&
					mer.dwMousePosition.Y >= 1 && mer.dwMousePosition.Y <= 38)        //鼠标在地图范围内    
				{
					switch (obType)
					{
					case 土墙:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "▄", 0x04); break;        //红色的土墙
					case 钢墙:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "■", 0x0F); break;        //白色的钢墙
					case 河流:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "~", 0x1F); break;        //蓝色的河流
					case 草地:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "▓", 0x02); break;        //绿色的草地
					case 沙地:WriteChar(mer.dwMousePosition.X / 2, mer.dwMousePosition.Y, "▓", 0x06); break;        //黄色的沙地
					default:break;
					}
					//保存坐标
					obMap[mer.dwMousePosition.Y][mer.dwMousePosition.X / 2] = obType;
				}
			}
			if (mer.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
			{	//鼠标右击,读取信息
				int obymin = 3, obymax = 5;
				if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin && mer.dwMousePosition.Y <= obymax)
				{
					obType = 土墙;
				}
				else if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin   5 && mer.dwMousePosition.Y <= obymax   5)
				{
					obType = 钢墙;
				}
				else if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin   10 && mer.dwMousePosition.Y <= obymax   10)
				{
					obType = 河流;
				}
				else if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin   15 && mer.dwMousePosition.Y <= obymax   15)
				{
					obType = 草地;
				}
				else if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin   20 && mer.dwMousePosition.Y <= obymax   20)
				{
					obType = 沙地;
				}
				else if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin   25 && mer.dwMousePosition.Y <= obymax   25)
				{	//保存地图
					for (int i = 1; i < 39; i  )
						for (int j = 1; j < 39; j  )
						{
							g_MAP[i][j] = obMap[i][j];
						}
				}
				else if (mer.dwMousePosition.X >= 46 * 2 && mer.dwMousePosition.X <= 52 * 2 &&
					mer.dwMousePosition.Y >= obymin   30 && mer.dwMousePosition.Y <= obymax   30)
				{	//返回主菜单
					GameMenu();
					return;
				}
				else
				{
					obType = 空地;
				}
			}
			if (mer.dwEventFlags == MOUSE_MOVED)
			{
				char szBuf[100] = { 0 };
				sprintf_s(szBuf, sizeof(szBuf), "x=%2d,y=%2d  ", mer.dwMousePosition.X / 2, mer.dwMousePosition.Y);
				SetConsoleTitleA(szBuf);
			}
		}
	}
}
/********************************************************
函数功能:游戏暂停处理
参数	:无
返回值	:无
*********************************************************/
void Game::GameStop()
{
	int counter = 0, No = 1;
	COLOR color;
	while (1)
	{
		color = SetColor(No);
		if (counter   % 30 == 0)
		{
 			WriteChar(50, 15, "游戏暂停", color);
			WriteChar(45, 18, "请按回车键继续游戏!", color);
			WriteChar(45, 19, "或按 Esc键退出游戏!", color);
			WriteChar(45, 20, "或按右Shift保存游戏!", color);
			if (  No == 8)
				No = 1;
		}
		if (GetAsyncKeyState(VK_RETURN) & 0x8000)     //回车键
		{			
			WriteChar(50, 15, "正在进行", 0x01);
			WriteChar(45, 18, "                     ", 0x00);
			WriteChar(45, 19, "                     ", 0x00);
			WriteChar(45, 20, "                     ", 0x00);
			break;
		}
		else if (GetAsyncKeyState(VK_RSHIFT) & 0x8000) //右Shift键保存
		{
			SaveInfo();	
			Sleep(1000);
			exit(0);		//保存玩退出游戏
		}
		else if (GetAsyncKeyState(0x1B) & 0x8000) //Esc键退出	
			exit(0);
		Sleep(100);
	}
}

/********************************************************
第三部分:游戏初始化
		1.初始化随机数种子
		2.根据模式初始化坦克
		3.初始化子弹
		4.初始化地图
		5.初始化屏幕
*********************************************************/
void Game::InitGame()
{
	//清屏
	ClearFullScreen();
	//初始化随机数种子
	srand((unsigned int)(time(NULL)));
	//初始化坦克地图
	memset(g_TankMap, 0, sizeof(char) * 40 * 40);
	//初始化我的坦克复活次数
	tankA.InitPlayer(0);
	tankA.CreatePlayer();
	if (!SingleMode)			//双人游戏模式
	{
		tankB.InitPlayer(1);
		tankB.CreatePlayer();
	}
	//AI坦克初始化
	switch (GameLevel)		//根据关卡初始化AItank数量
	{
	case 1:AItank[0].remain_AI = 4; break;
	case 2:AItank[0].remain_AI = 8; break;
	case 3:AItank[0].remain_AI = 16; break;
	default:
		break;
	}			
	for(int i=0;i<3;i  )				
	{
		AItank[i].InitAI(2, i);
	}
	AItank[3].InitAI(3, 3);					//创建特殊坦克
	AItank[0].CreateAI();
	AItank[1].CreateAI();
	//子弹清空
	if(!m_bullet.empty())
		m_bullet.clear();
	DrawMainScreen(g_MAP);		//打印主屏幕
	DrawSideScreen();			//打印副屏幕	
}
/********************************************************
第四部分:游戏主循环
	1.游戏胜负检测
	2.移动子弹
	3.移动AI坦克
	4.AI < 4并且剩余AI数量>0, 创建新的AI, 一次只创建一个
	5.AI发射子弹
	6.接收键盘输入
	7.控制我方坦克
	8.我方坦克死亡, 复活(死亡瞬间复活, 不必放在主函数)
********************************************************/
void Game::GameLoop()
{
	while (1)							//游戏主循环
	{
		if (g_counter[游戏速度]  %GameSpeed == 0)
		{
			GameCheck();				//游戏胜负检测
			UpdateSideScreen();			//更新游戏信息			
			MoveBullet();				//移动子弹
			//移动AI坦克--四种AI坦克-->|锁定老巢|锁定玩家A|锁定玩家B|随机AI|			
			AItank[0].MoveToHome();
			AItank[1].MoveToTank(tankA.tankData.codself);
			if (!SingleMode)
			{
				AItank[2].MoveToTank(tankB.tankData.codself);
			}
			else
			{
				AItank[2].MoveRandom();
			}
			AItank[3].MoveToTank(tankA.tankData.codself);
			//AI<4并且剩余AI数量>0,创建新的AI,一次只创建一个
			for (int i = 0; i < 4; i  )
			{
				if (AItank[i].tankData.Alive == 0 && AItank[i].remain_AI > 0 &&
					g_counter[AI复活时间]   % 90 == 0)
				{	//如果坦克不存活。计时,每次建立有间隔1800ms
					AItank[i].CreateAI();
				}
			}
			//AI发射子弹
			for (int i = 0; i < 4; i  )
			{
				if (AItank[i].tankData.Alive && AItank[i].tankData.BulletCD == 10)
				{
					CreatBullet(AItank[i]);
					AItank[i].tankData.BulletCD = 0;
				}
				else
				{
					AItank[i].tankData.BulletCD  ;
				}
			}
			//接收键盘输入,控制我方坦克
			KeyboardA();
			KeyboardB();
			//我方坦克死亡,复活
			MytankRebirth();
		}
		Sleep(5);
	}
}
/********************************************************
函数功能:获取关卡地图
参数	:无
返回值	:无
*********************************************************/
void Game::GetMap(int level)
{
	int i, j;
	int GameMap[3][40][40] =
	{
		{
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,2,2,2,2,2,0,0,0,0,2,0,0,0,0,0,0,0,2,2,0,0,0,0,2,2,0,0,0,2,2,0,0,0,2,2,1},
			{1,0,0,0,0,2,2,2,0,0,0,0,2,0,2,0,0,0,0,0,0,2,2,2,0,0,0,2,2,0,0,0,2,2,0,0,2,2,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,0,0,0,2,0,0,0,0,0,2,2,2,2,0,0,2,2,0,0,0,2,2,0,2,2,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,2,2,0,0,0,0,0,2,2,2,2,2,0,2,2,0,0,0,2,2,2,2,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,2,2,0,0,0,2,2,0,0,0,0,2,2,2,2,2,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,2,2,0,0,0,2,2,0,0,0,0,2,2,0,2,2,2,2,2,0,0,0,2,2,2,2,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,2,2,0,0,0,0,0,2,2,0,0,0,2,2,0,0,2,2,2,2,0,0,0,2,2,0,2,2,0,0,1},
			{1,0,0,0,0,2,2,2,0,2,2,0,0,0,0,0,2,2,0,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,1},
			{1,0,0,0,0,2,2,2,0,2,2,0,0,0,0,0,2,2,0,0,0,2,2,0,0,0,0,2,2,0,0,0,2,2,0,0,0,2,2,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,2,2,2,0,2,2,2,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,1},
			{1,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,1},
			{1,0,0,0,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
		},
		{
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,5,5,5,2,2,2,0,0,0,3,3,3,3,3,3,0,0,0,2,2,2,5,5,5,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,5,5,5,2,2,2,0,0,0,3,3,3,3,3,3,0,0,0,2,2,2,5,5,5,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,5,5,5,2,2,2,0,0,0,3,3,3,3,3,3,0,0,0,2,2,2,5,5,5,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,3,3,3,3,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,1},
			{1,3,3,3,3,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,2,2,2,2,2,1},
			{1,3,3,3,3,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,2,2,2,2,2,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,0,0,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,2,2,2,2,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
		},
		{
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,0,0,1},
			{1,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,0,0,0,2,2,2,0,0,1},
			{1,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,0,0,0,2,2,2,0,0,1},
			{1,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,5,5,5,2,2,2,2,2,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,4,4,4,5,5,5,3,3,3,3,3,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,3,3,3,3,3,3,3,3,3,3,3,3,0,0,0,4,4,4,5,5,5,3,3,3,3,3,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,3,3,3,2,2,2,2,2,2,2,2,2,0,0,0,4,4,4,5,5,5,3,3,3,3,3,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,3,3,3,2,2,2,2,2,2,2,2,2,0,0,0,4,4,4,5,5,5,2,2,2,2,2,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,3,3,3,2,2,2,2,2,2,2,2,2,0,0,0,4,4,4,5,5,5,2,2,2,2,2,1},
			{1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1},
			{1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1},
			{1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1},
			{1,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,3,3,0,0,0,0,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,5,5,5,5,5,5,5,5,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,5,5,5,5,5,5,5,5,1},
			{1,2,2,2,2,2,2,4,4,4,5,5,5,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,5,5,5,5,5,5,5,5,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
			{1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,9,9,9,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
			{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
		},
	};
	for (i = 0; i < 40; i  )
		for (j = 0; j < 40; j  )
			g_MAP[i][j] = GameMap[level-1][i][j];	//获取关卡地图	
}
/********************************************************
函数功能:创建子弹
参数	:坦克对象
返回值	:无
*********************************************************/
void Game::CreatBullet(Tank &tank)
{
	Bullet bullet = {};
	//判断是AI子弹还是玩家子弹
	if (tank.tankData.Type > 1 && !(rand()%11))
	{
		bullet.CreateAI(tank);
	}		
	else
		bullet.Create(tank);
	//添加子弹,显示子弹
	m_bullet.push_back(bullet);
	int nIndex = m_bullet.size() - 1;	//添加子弹的下标
	if (nIndex < 0)
	{
		cout << "子弹添加失败!" << endl;
		system("pause");
		return;
	}
	if (m_bullet[nIndex].GoCheck())
	{
		m_bullet[nIndex].Show();
	}
	else
	{	//判断子弹碰撞
		if (m_bullet[nIndex].Hit(tankArr))
		{
			GameOver(1);				//1表示老家炸毁
		}
		if (m_bullet[nIndex].Data.Exist == 0 )		//子弹碰撞消失
		{
			m_bullet.pop_back();
		}
	}
}
/********************************************************
函数功能:移动子弹
参数	:
返回值	:无
*********************************************************/
void Game::MoveBullet()
{
	bool Ret = false;
	for (UINT i = 0; i < m_bullet.size(); i  )
	{		
		m_bullet[i].Clear();	//清除子弹
		m_bullet[i].Move();		//移动子弹
		if (m_bullet[i].GoCheck())	//检测障碍物
		{
			m_bullet[i].Show();		//正常通行
		}
		else
		{
			Ret = m_bullet[i].Hit(tankArr);	//碰撞处理
			if (Ret)
			{
				GameOver(1);	 //1表示老家炸毁
			}
			if (m_bullet[i].Data.Exist == 0 && m_bullet.size()>0)		//子弹碰撞消失
			{
				m_bullet.erase(m_bullet.begin()   i);
			}
		}
	}	
}

/********************************************************
函数功能:打印主屏幕地图
参数	:地图
返回值	:无
*********************************************************/
void Game::DrawMainScreen(char(*pMap)[40])
{
	for (int i = 0; i < 40; i  )
	{
		for (int j = 0; j < 40; j  )
		{
			switch (pMap[i][j])
			{
			case 边界:WriteChar(j, i, "■", 0x0F); break;        //白色的边界				
			case 土墙:WriteChar(j, i, "▄", 0x04); break;        //红色的土墙
			case 钢墙:WriteChar(j, i, "■", 0x0F); break;        //白色的钢墙
			case 河流:WriteChar(j, i, "~", 0x1F); break;        //蓝色的河流
			case 草地:WriteChar(j, i, "▓", 0x02); break;        //绿色的草地
			case 沙地:WriteChar(j, i, "▓", 0x06); break;        //黄色的沙地
			default: break;
			}
		}
		WriteChar(18, 36, "◣★◢", 0x0F);                     //老家
		WriteChar(18, 37, "███", 0x0F);                     //老家
		WriteChar(18, 38, "◢█◣", 0x0F);                     //老家
	}
}
/********************************************************
函数功能:清除主屏幕
参数	:无
返回值	:无
*********************************************************/
void Game::ClearMainScreen()
{
	for (int i = 1; i < 39; i  )
	{
		WriteChar(1, i, "                                                \
                           ", 0x00);
	}
}
/********************************************************
函数功能:打印副屏幕
参数	:无
返回值	:无
*********************************************************/
void Game::DrawSideScreen()
{
	for (int i = 0; i < 40; i  )
	{
		for (int j = 40; j < 60; j  )
		{
			if (i == 0 || i == 39 || j == 59)
				WriteChar(j, i, "█", 0x0F);
		}
	}
	int basey = 2;
	WriteChar(47, basey, "第      关", 0x0F);
	WriteChar(46, basey   3, "分  数: ", 0x0F);
	WriteChar(46, basey   5, "生  命: ", 0x0F);
	WriteChar(46, basey   7, "生  命: ", 0x0F);
	WriteChar(43, basey   9, "剩余敌方坦克: ", 0x0F);
	WriteChar(43, basey   11, "当前游戏速度: ", 0x0F);
	WriteChar(43, basey   13, "当前游戏状态: ", 0x0F);
	WriteChar(40, basey   15, "════════════════════", 0x01);
	WriteChar(48, basey   21, "帮  助", 0x02);
	WriteChar(43, basey   23, "坦克A: 方向键  w a s d ", 0x02);
	WriteChar(43, basey   25, "     : 射击键  j 键 ", 0x02);
	WriteChar(43, basey   27, "坦克B: 方向键  ←↑→↓", 0x02);
	WriteChar(43, basey   29, "     : 射击键  5 键 ", 0x02);
	WriteChar(45, basey   31, "  - 调整游戏速度", 0x02);
	WriteChar(45, basey   33, "空格键 暂停游戏", 0x02);
	WriteChar(45, basey   35, "Esc键  退出游戏", 0x02);		
}
/********************************************************
函数功能:更新游戏信息
参数1	:无
返回值	:无
*********************************************************/
void Game::UpdateSideScreen()
{
	int basey = 2;
	//清除上一次信息
	WriteChar(49, basey, "  ", 黑色);
	WriteChar(50, basey   3, "   ", 黑色);
	WriteChar(50, basey   5, "   ", 黑色);
	WriteChar(50, basey   7, "   ", 黑色);
	WriteChar(50, basey   9, "   ", 黑色);
	WriteChar(50, basey   11, "   ", 黑色);
	//更新	
	WriteChar(49, basey, "", 黄色);
	printf("%d", GameLevel);				//游戏关卡
	WriteChar(50, basey   3, "", 红色);
	printf("%d", tankA.tankData.Score   tankB.tankData.Score);//更新游戏分数
	WriteChar(50, basey   5, "", 绿色);
	printf("%d", tankA.tankData.Revive);	//更新玩家A生命值(初始3条命)
	WriteChar(50, basey   7, "", 绿色);
	printf("%d", tankB.tankData.Revive);	//更新玩家B生命值
	WriteChar(50, basey   9, "", 红色);
	printf("%d", tankA.remain_AI);			//剩余AI数
	WriteChar(50, basey   11, "", 黄色);
	printf("%d", 21-GameSpeed);				//游戏速度
	WriteChar(50, basey   13, "正在进行", 黄色);	//游戏状态	
}

/********************************************************
函数功能:设置窗口信息
参数1	:窗口名称
参数2	:窗口宽度
参数3	:窗口高度
返回值	:成功返回真
*********************************************************/
bool Game::SetWindowSize(TCHAR* pszWindowTitle, short x, short y)
{
	HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
	HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleTitle(pszWindowTitle);                  //设置窗口名称
	//获取最大控制台窗口大小
	COORD pos = GetLargestConsoleWindowSize(hStdOut);
	COORD BuffSize = { pos.X   1,pos.Y   1 };
	//设置控制台缓冲区大小
	if (!SetConsoleScreenBufferSize(hStdOut, BuffSize))
	{	//设置失败
		printf("buffer err(%d,%d)%d\n", BuffSize.X, BuffSize.Y, GetLastError());
		return false;
	}
	SMALL_RECT srctWindow = { 0,0,x,y };             //矩形,保存左上角坐标和右下角坐标
	if (!SetConsoleWindowInfo(hStdOut, true, &srctWindow))
	{	//设置控制台窗口大小失败
		printf("size err%d\n", GetLastError());
		return false;
	}
	//设置控制台缓冲区大小
	COORD Buff = { x   1,y   1 };
	if (!SetConsoleScreenBufferSize(hStdOut, Buff))
	{	//设置失败
		printf("buffer err(%d,%d)%d\n", Buff.X, Buff.Y, GetLastError());
		return false;
	}
	return true;
}

/********************************************************
函数功能:游戏结束处理
参数	:0:我方死光1:老家炸毁
返回值	:无
*********************************************************/
void Game::GameOver(bool home)
{
	int timing = 0, ColorNo = 1;
	COLOR Color;
	while (1)
	{
		if (timing   % 30 == 0)        //30次打印一次
		{
			Color = SetColor(ColorNo);
			if(home)
			{
				WriteChar(18, 20, "老家炸毁!", Color);     //主屏幕中心打印
				
			}
			WriteChar(18, 21, "游戏结束!", Color);         //主屏幕中心打印
			WriteChar(50, 15, "游戏结束!", Color);         //副屏幕打印
			WriteChar(45, 18, "请按回车键继续游戏!", Color); 
			WriteChar(45, 19, "或按 Esc键退出游戏!", Color);
			if (  ColorNo == 8)
				ColorNo = 1;
		}
		if (GetAsyncKeyState(0xD) & 0x8000)  //回车键
		{
			ClearMainScreen();			//主屏清屏函数
			GetMap(GameLevel);			//获取关卡地图
			InitGame();					//从本关重新开始
			break;
		}
		if (GetAsyncKeyState(0x1B) & 0x8000)  //Esc键退出	
			exit(0);
		Sleep(20);
	}
}

/********************************************************
函数功能:用户自定义地图
参数1	:无
返回值	:无
*********************************************************/
void Game::UserMap()
{
	ClearFullScreen();				//清屏
	DrawMainScreen(obMap);			//打印主屏幕
	DrawUserSideScreen();			//打印副屏幕
	MouseOp();						//鼠标操作处理
}
/********************************************************
函数功能:游戏胜负检测
参数	:无
返回值	:无
*********************************************************/
void Game::GameCheck()
{
	//胜利条件:AI坦克死光
	//AItank死光,胜利
	if (tankA.remain_AI == 0 && AItank[0].tankData.Alive == 0 && AItank[1].tankData.Alive == 0 &&
		AItank[2].tankData.Alive == 0 && AItank[3].tankData.Alive == 0)
	{
		NextLevel();
	}
	//胜利处理函数
	//失败条件:我方坦克死光或者老家炸毁(老家炸毁瞬间调用GameOver函数,在这不做判断)
	if (SingleMode)		//单人模式	
	{
		if (tankA.tankData.Revive == 0 && tankA.tankData.Alive == 0)
			GameOver(0);		
	}
	else
	{
		if (tankA.tankData.Revive == 0 && tankA.tankData.Alive == 0 && 
			tankB.tankData.Revive == 0 && tankB.tankData.Alive == 0)
			GameOver(0);	
	}		
}
/********************************************************
函数功能:清屏函数(全屏)
参数	:无
返回值	:无
*********************************************************/
void Game::ClearFullScreen()
{
	for (int i = 0; i < 40; i  )
	{
		WriteChar(0, i, "                                                           \
                                                            ", 0x00);
	}
}
/********************************************************
函数功能:玩家坦克复活
参数	:无
返回值	:无
*********************************************************/
void Game::MytankRebirth()
{
	if (SingleMode)		//单人模式
	{
		while (1)
		{
			if (tankA.tankData.Alive == 0 && g_counter[玩家A复活时间]   % 10 == 0)		//复活时间1s
				tankA.CreatePlayer();
			else
				return;
			Sleep(100);
		}
	}
	else
	{		//双人模式
		while (1)
		{
			if (tankA.tankData.Alive == 0 && g_counter[玩家A复活时间]   % 10 == 0)		//复活时间1s
				tankA.CreatePlayer();
			else if (tankB.tankData.Alive == 0 && g_counter[玩家B复活时间]   % 10 == 0)
				tankB.CreatePlayer();
			else
				return;
			Sleep(100);
		}
	}
}