基本信息
源码名称:c++ 坦克大战 小游戏源码(入门级)
源码大小:8.80M
文件格式:.rar
开发语言:C/C++
更新时间:2019-04-19
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在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); } } }