基本信息
源码名称: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);
}
}
}