坦克大战C++

news/2024/11/28 1:04:26/

| 主要分类7个部分GAME、Globanl、Map、Tanks、Bullet、源

  • 这个版本中遇到一个问题,在程序第一次运行的时候对地图进行保存,再次读取的时候无法读取到地形,但是debug找问题的时候却能够绘制地形。希望有大佬可以帮忙指正,
  • 项目写的比较乱有些东西没有封装好,希望可以有用得到的地方
    ·

源.cpp

源即主函数文件

#include <cstdlib>#include "API.h"
#include "Game.h"
C_GameClass Game;
int main ()
{HideCursor();system("mode con cols=200 lines=55");//Games();//Game.Welcome();Game.Games();//Game.Welcome();//system("pause");}

API

API.h

#pragma once
//清理光标
extern void HideCursor();//字符类型输出到坐标
extern void WriteChar(int x, int y, const char* szBuf, int Color);//整数类型输出到坐标
extern void WriteInt(int x, int y, int szBuf, int Color);
//主菜单获取鼠标输入
extern void SelectInt();//关卡选择获取鼠标进行菜单选择输入
extern void LevelSet();
//胜利界面选择获取鼠标进行菜单选择输入
extern void WinsSet();
//死亡界面选择获取鼠标进行菜单选择输入
extern void OverSet();
//暂停页面选择
extern void PausedSet();
//绘制地图选择
extern void CustomMapSet();//开场音乐
extern void WelcomeMusic();//游戏结束音乐
extern void GameOverMusic();//坦克死亡音乐
extern void TankOverMusic();//坦克移动音乐
extern void TankMoveMusic();//发射子弹音乐
extern void BulletMusic();

API.cpp

#include <conio.h>
#include <iostream>
#include <Windows.h>
#pragma comment(lib,"winmm.lib")
#include "Global.h"
#include "API.h"#include "Game.h"//清理光标
void HideCursor()
{CONSOLE_CURSOR_INFO cursor;cursor.bVisible = FALSE;cursor.dwSize = sizeof(cursor);HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorInfo(handle, &cursor);
}//字符类型输出到坐标
void WriteChar(int x, int y, const char* szBuf, int Color)
{COORD pos = { x * 2,y };HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut, pos);SetConsoleTextAttribute(hOut, Color);std::cout << szBuf;
}//整数类型输出到坐标
void WriteInt(int x, int y, int szBuf, int Color)
{COORD pos = { x * 2,y };HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut, pos);SetConsoleTextAttribute(hOut, Color);std::cout << szBuf;
}//主菜单获取鼠标输入
void SelectInt()
{//1 获取控制台输入句柄HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);//2 循环获取控制台输入信息INPUT_RECORD ir = { 0 };DWORD dwMode = 0;//-----------------------------------------------------------GetConsoleMode(hConsoleInput, &dwMode);SetConsoleMode(hConsoleInput, dwMode | ENABLE_MOUSE_INPUT);//-----------------------------------------------------------DWORD dwRealCourt = 0;while (true){MOUSE_EVENT_RECORD MouseEv = ir.Event.MouseEvent;ReadConsoleInput(hConsoleInput,//控制台输入数据&ir,          //获取到的控制台信息就传到这个结构体中1,            //缓冲区INPUT_RECORD的数量&dwRealCourt  //传出,读取完毕的时候,究竟读取了几个结构体信息);//是一个鼠标信息if (ir.EventType == MOUSE_EVENT){//如果是鼠标信息,那么就是联合体中的这个字段起作用if (MouseEv.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;//开始游戏if (36 <= x && x <= 39 && y == 24){nSelectIntInput = 开始游戏;}//选择关卡else if (36 <= x && x <= 39 && y == 26){nSelectIntInput = 选择关卡;}//绘制地图else if (36 <= x && x <= 39 && y == 28){nSelectIntInput = 绘制地图;}//读取游戏else if (36 <= x && x <= 39 && y == 30){nSelectIntInput = 读取游戏;}//退出游戏else if (36 <= x && x <= 39 && y == 32){nSelectIntInput = 退出游戏;}return;}}}
}//关卡选择获取鼠标进行菜单选择输入
void LevelSet()
{//1 获取控制台输入句柄HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);//2 循环获取控制台输入信息INPUT_RECORD ir = { 0 };DWORD dwMode = 0;//-----------------------------------------------------------GetConsoleMode(hConsoleInput, &dwMode);SetConsoleMode(hConsoleInput, dwMode | ENABLE_MOUSE_INPUT);//-----------------------------------------------------------DWORD dwRealCourt = 0;while (true){MOUSE_EVENT_RECORD MouseEv = ir.Event.MouseEvent;ReadConsoleInput(hConsoleInput,//控制台输入数据&ir,          //获取到的控制台信息就传到这个结构体中1,            //缓冲区INPUT_RECORD的数量&dwRealCourt  //传出,读取完毕的时候,究竟读取了几个结构体信息);//是一个鼠标信息if (ir.EventType == MOUSE_EVENT){//如果是鼠标信息,那么就是联合体中的这个字段起作用if (MouseEv.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;if (36 <= x && x <= 38 && y == 26){nSelectLevelInput = 关卡一;}else if (36 <= x && x <= 38 && y == 28){nSelectLevelInput = 关卡二;}else if (36 <= x && x <= 41 && y == 30){nSelectLevelInput = 退出关卡选择;}return;}}}
}//胜利界面选择获取鼠标进行菜单选择输入
void WinsSet()
{//1 获取控制台输入句柄HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);//2 循环获取控制台输入信息INPUT_RECORD ir = { 0 };DWORD dwMode = 0;//-----------------------------------------------------------GetConsoleMode(hConsoleInput, &dwMode);SetConsoleMode(hConsoleInput, dwMode | ENABLE_MOUSE_INPUT);//-----------------------------------------------------------DWORD dwRealCourt = 0;while (true){MOUSE_EVENT_RECORD MouseEv = ir.Event.MouseEvent;ReadConsoleInput(hConsoleInput,//控制台输入数据&ir,          //获取到的控制台信息就传到这个结构体中1,            //缓冲区INPUT_RECORD的数量&dwRealCourt  //传出,读取完毕的时候,究竟读取了几个结构体信息);//是一个鼠标信息if (ir.EventType == MOUSE_EVENT){//如果是鼠标信息,那么就是联合体中的这个字段起作用if (MouseEv.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;if (30 <= x && x <= 32 && y == 40){nSelectWinsInput = 下一关;}else if (45 <= x && x <= 46 && y == 40){nSelectLevelInput = nSelectWinsInput = 退出;for (int y = 0; y < 边界Y; y++){for (int x = 0; x < 边界X; x++){Static_Map[y][x] = { 0 };Dynamic_Map[y][x] = { 0 };}}}return;}}}
}//死亡界面选择获取鼠标进行菜单选择输入
void OverSet()
{//1 获取控制台输入句柄HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);//2 循环获取控制台输入信息INPUT_RECORD ir = { 0 };DWORD dwMode = 0;//-----------------------------------------------------------GetConsoleMode(hConsoleInput, &dwMode);SetConsoleMode(hConsoleInput, dwMode | ENABLE_MOUSE_INPUT);//-----------------------------------------------------------DWORD dwRealCourt = 0;while (true){MOUSE_EVENT_RECORD MouseEv = ir.Event.MouseEvent;ReadConsoleInput(hConsoleInput,//控制台输入数据&ir,          //获取到的控制台信息就传到这个结构体中1,            //缓冲区INPUT_RECORD的数量&dwRealCourt  //传出,读取完毕的时候,究竟读取了几个结构体信息);//是一个鼠标信息if (ir.EventType == MOUSE_EVENT){//如果是鼠标信息,那么就是联合体中的这个字段起作用if (MouseEv.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;if (30 <= x && x <= 33 && y == 40){nSelectOverInput = 重新开始;}else if (45 <= x && x <= 46 && y == 40){nSelectLevelInput = nSelectOverInput = 退出;for (int y = 0; y < 边界Y; y++){for (int x = 0; x < 边界X; x++){Static_Map[y][x] = { 0 };Dynamic_Map[y][x] = { 0 };}}}return;}}}
}//暂停页面选择
void PausedSet()
{//1 获取控制台输入句柄HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);//2 循环获取控制台输入信息INPUT_RECORD ir = { 0 };DWORD dwMode = 0;//-----------------------------------------------------------GetConsoleMode(hConsoleInput, &dwMode);SetConsoleMode(hConsoleInput, dwMode | ENABLE_MOUSE_INPUT);//-----------------------------------------------------------DWORD dwRealCourt = 0;while (true){MOUSE_EVENT_RECORD MouseEv = ir.Event.MouseEvent;ReadConsoleInput(hConsoleInput,//控制台输入数据&ir,          //获取到的控制台信息就传到这个结构体中1,            //缓冲区INPUT_RECORD的数量&dwRealCourt  //传出,读取完毕的时候,究竟读取了几个结构体信息);//是一个鼠标信息if (ir.EventType == MOUSE_EVENT){//如果是鼠标信息,那么就是联合体中的这个字段起作用if (MouseEv.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;if (87 <= x && x <= 90 && y == 44){nSelectGamePaused = 继续游戏;}else if (87 <= x && x <= 90 && y == 48){nSelectLevelInput = nSelectGamePaused = 退出;for (int y = 0; y < 边界Y; y++){for (int x = 0; x < 边界X; x++){Static_Map[y][x] = { 0 };Dynamic_Map[y][x] = { 0 };}}}return;}}}
}//绘制地图选择
void CustomMapSet()
{//1 获取控制台输入句柄HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);//2 循环获取控制台输入信息INPUT_RECORD ir = { 0 };DWORD dwMode = 0;//-----------------------------------------------------------GetConsoleMode(hConsoleInput, &dwMode);SetConsoleMode(hConsoleInput, dwMode | ENABLE_MOUSE_INPUT);//-----------------------------------------------------------DWORD dwRealCourt = 0;while (nSelectDrawMap != 继续游戏 && nSelectDrawMap != 退出){MOUSE_EVENT_RECORD MouseEv = ir.Event.MouseEvent;ReadConsoleInput(hConsoleInput,//控制台输入数据&ir,          //获取到的控制台信息就传到这个结构体中1,            //缓冲区INPUT_RECORD的数量&dwRealCourt  //传出,读取完毕的时候,究竟读取了几个结构体信息);//是一个鼠标信息if (ir.EventType == MOUSE_EVENT){//如果是鼠标信息,那么就是联合体中的这个字段起作用if (MouseEv.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;//铁墙;if (87 <= x && x <= 91 && y == 6){nSelectDrawMap = 铁墙;}//砖墙if (87 <= x && x <= 91 && y == 10){nSelectDrawMap = 砖墙;}//草地if (87 <= x && x <= 91 && y == 14){nSelectDrawMap = 草地;}//水面if (87 <= x && x <= 91 && y == 18){nSelectDrawMap = 水面;}//家if (87 <= x && x <= 91 && y == 22){nSelectDrawMap =;}if (87 <= x && x <= 91 && y == 26){nSelectDrawMap = 继续游戏;}if (88 <= x && x <= 89 && y == 30){nSelectDrawMap = 退出;for (int y = 0; y < 边界Y; y++){for (int x = 0; x < 边界X; x++){Static_Map[y][x] = { 0 };Dynamic_Map[y][x] = { 0 };}}}}if (MouseEv.dwButtonState == RIGHTMOST_BUTTON_PRESSED){int x = MouseEv.dwMousePosition.X / 2;int y = MouseEv.dwMousePosition.Y;map.Draw(x, y, nSelectDrawMap);}}}
}//开场音乐
void WelcomeMusic()
{PlaySound(TEXT(开场音乐), NULL, SND_FILENAME | SND_ASYNC);
}//游戏结束音乐
void GameOverMusic()
{PlaySound(TEXT(GameOver), NULL, SND_FILENAME | SND_ASYNC);
}
//坦克死亡音乐
void TankOverMusic()
{PlaySound(TEXT(坦克死亡), NULL, SND_FILENAME | SND_ASYNC);
}
//坦克移动音乐
void TankMoveMusic()
{PlaySound(TEXT(坦克移动), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);
}
//发射子弹音乐
void BulletMusic()
{PlaySound(TEXT(发射子弹), NULL, SND_FILENAME | SND_ASYNC | SND_NOSTOP);
}

Globanl

Globanl.h

#pragma once
//#define UP	  0
//#define DOWN  1
//#define LEFT  2
//#define RIGHT 3//坦克子弹方向移动的枚举
enum 移动
{= 0,= 1,= 2,= 3
};//坦克子弹阵营的枚举
enum 阵营
{我方 = 1,敌方 = 2,
};//坦克子弹颜色枚举
enum 颜色
{黑色 = 0,深蓝色 = 1,深绿色 = 2,湖蓝 = 3,深红色 = 4,深紫色 = 5,暗黄色 = 6,白色 = 7,灰色 = 8,亮蓝色 = 9,亮绿色 = 10,浅蓝色 = 11,红色 = 12,紫色 = 13,黄色 = 14,亮白色 = 15,//线条绿色底色是粉色BUF绿色 = 'A',//线条绿色底色是红色BUF浅绿 = 'B',//线条蓝色底色是红色BUF蓝色 = 'C',//全身红BUF红色 = 'D',
};//子弹有效无效枚举
enum 子弹
{无效 = 0,有效 = 1,
};//地图属性枚举
enum 地图
{
空地 = 0,
砖墙 = 2,
水面 = 3,坦克 = 4,
子弹 = 5,草地 = 6,=  8,
铁墙 = 9,
};enum 界面选择
{开始游戏 = 1,选择关卡 = 2,绘制地图 = 3,读取游戏 = 4,退出游戏 = 5,
};enum 关卡选择
{关卡一 = 1,关卡二 = 2,退出关卡选择 = 3,自定义地图 = 4,
};enum 胜利失败选择
{下一关 = 1,重新开始 = 2,退出 = 11,继续游戏 = 15,
};//主界面选择
extern int nSelectIntInput;
//关卡选择
extern int nSelectLevelInput;
//胜利界面的选择
extern int nSelectWinsInput;
//死亡界面的选择
extern int nSelectOverInput;
//暂停界面选择
extern int nSelectGamePaused;
//绘制地图界面选择
extern int nSelectDrawMap;
//地图边界Y轴
#define 边界Y 55
//地图边界X轴
#define 边界X 80//静态地图
extern int Static_Map[边界Y][边界X];//动态地图
extern int Dynamic_Map[边界Y][边界X];//游戏分数
extern int GameScore;
//关卡分数
extern int LevelScore;
//当前地图
extern int TheMap;#define 开场音乐 "./sound/开场音乐.wav"
#define GameOver "./sound/GameOver.wav"
#define GameWins "./sound/开场音乐.wav"
#define 坦克死亡 "./sound/坦克死亡.wav"
#define 坦克移动 "./sound/坦克移动.wav"#define 发射子弹 "./sound/发射子弹.wav"//#define save "./Save.txt"

Globanlcpp

#include "Global.h"//静态地图初始化
int Static_Map[边界Y][边界X] = { 0 };
//动态地图初始化
int Dynamic_Map[边界Y][边界X] = { 0 };//主界面选择初始化
int nSelectIntInput = 0;
//关卡选择初始化
int nSelectLevelInput = 0;
//胜利界面的选择初始化
int nSelectWinsInput = 0;
//死亡界面的选择初始化
int nSelectOverInput = 0;
//游戏暂停界面选择初始化
int nSelectGamePaused = 0;
//绘制地图界选择初始化
int nSelectDrawMap = 0;
//游戏分数初始化
int GameScore = 0;
//关卡分数
int LevelScore = 0;
//当前地图
int TheMap = 0;

Map

Map.h

#pragma once
#include "Global.h"class C_MapClass
{
public://地图属性的绘制void Draw(int x, int y, int draw);//地图一void Map_One();//地图二void Map_Two();//绘制保存的地图void Map_Save();//用来打印自定义地图void DrawMapSver();};

Map.cpp

#include "Map.h"
#include <Windows.h>
#include "API.h"//地图一
void C_MapClass::Map_One()
{//----------------------------------------------------////                  边界for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){//设置为边界Draw(x, y, 铁墙);}else{Draw(x, y, 空地);}}}//----------------------------------------------------//                  铁墙//左侧for (int y = 16; y < 18; y++){for (int x = 9; x < 16; x++){Draw(x, y, 铁墙);}}for (int y = 18; y < 23; y++){for (int x = 14; x < 16; x++){Draw(x, y, 铁墙);}}//右侧for (int y = 16; y < 18; y++){for (int x = 64; x < 70; x++){Draw(x, y, 铁墙);}}for (int y = 18; y < 23; y++){for (int x = 64; x < 71; x++){Draw(x, y, 铁墙);}}//下方for (int y = 36; y < 41; y++){for (int x = 31; x < 49; x++){Draw(x, y, 铁墙);}}//----------------------------------------------------//                  砖墙for (int y = 1; y < 12; y++){//X轴for (int x = 37; x < 44; x++){Draw(x,  y,  砖墙);}}for (int y = 30; y < 36; y++){//X轴for (int x = 1; x < 79; x++){Draw(x, y, 砖墙);}}//----------------------------------------------------//水面for (int y = 12; y < 18; y++){//X轴for (int x = 30; x < 51; x++){Draw(x, y, 水面);}}for (int y = 18; y < 23; y++){//X轴for (int x = 1; x < 14; x++){Draw(x, y, 水面);}}for (int y = 18; y < 23; y++){//X轴for (int x = 66; x < 79; x++){Draw(x, y, 水面);}}//----------------------------------------------------//                  草地左侧for (int y = 23; y < 30; y++){//X轴for (int x = 11; x < 30; x++){Draw(x, y, 草地);}}for (int y = 12; y < 23; y++){//X轴for (int x = 25; x < 30; x++){Draw(x, y, 草地);}}//右侧for (int y = 23; y < 30; y++){//X轴for (int x = 51; x < 69; x++){Draw(x, y, 草地);}}for (int y = 12; y < 23; y++){//X轴for (int x = 51; x < 56; x++){Draw(x, y, 草地);}}//----------------------------------------------------//                   家for (int y = 51; y < 54; y++){//X轴for (int x = 39; x < 42; x++){Draw(x, y,);}}//家砖墙for (int y = 49; y < 51; y++){//X轴for (int x = 37; x < 44; x++){Draw(x, y, 砖墙);}}for (int y = 51; y < 54; y++){//X轴for (int x = 37; x < 39; x++){Draw(x, y, 砖墙);}}for (int y = 51; y < 54; y++){//X轴for (int x = 42; x < 44; x++){Draw(x, y, 砖墙);}}//----------------------------------------------------
}//地图二
void C_MapClass::Map_Two()
{//----------------------------------------------------//                      边界for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){//设置为边界Draw(x, y, 铁墙);}else{Draw(x, y, 空地);}}}//----------------------------------------------------//                     铁墙for (int y = 24; y < 26; y++){//X轴for (int x = 16; x < 31; x++){Draw(x, y, 铁墙);}}//----------------------------------------------------//                      草地for (int y = 12; y < 27; y++){//X轴for (int x = 50; x < 64; x++){Draw(x, y, 草地);}}//----------------------------------------------------//                      砖墙for (int y = 1; y < 5; y++){for (int x = 42; x < 55; x++){Draw(x, y, 砖墙);}}for (int y = 5; y < 12; y++){for (int x = 51; x < 55; x++){Draw(x, y, 砖墙);}}for (int y = 24; y < 34; y++){for (int x = 12; x < 16; x++){Draw(x, y, 砖墙);}}for (int y = 19; y < 25; y++){for (int x = 35; x < 50; x++){Draw(x, y, 砖墙);}}for (int y = 10; y < 21; y++){for (int x = 64; x < 68; x++){Draw(x, y, 砖墙);}}for (int y = 10; y < 14; y++){for (int x = 68; x < 79; x++){Draw(x, y, 砖墙);}}//----------------------------------------------------//                      水面for (int y = 34; y < 38; y++){for (int x = 1; x < 16; x++){Draw(x, y, 水面);}}for (int y = 19; y < 24; y++){for (int x = 12; x < 35; x++){Draw(x, y, 水面);}}for (int y = 24; y < 40; y++){for (int x = 31; x < 35; x++){Draw(x, y, 水面);}}for (int y = 36; y < 40; y++){for (int x = 26; x < 31; x++){Draw(x, y, 水面);}}//----------------------------------------------------//                       家for (int y = 51; y < 54; y++){//X轴for (int x = 39; x < 42; x++){Draw(x, y,);}}//家砖墙for (int y = 49; y < 51; y++){//X轴for (int x = 37; x < 44; x++){Draw(x, y, 砖墙);}}for (int y = 51; y < 54; y++){//X轴for (int x = 37; x < 39; x++){Draw(x, y, 砖墙);}}for (int y = 51; y < 54; y++){//X轴for (int x = 42; x < 44; x++){Draw(x, y, 砖墙);}}//----------------------------------------------------
}//绘制保存地图功能
void C_MapClass::Map_Save()
{for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){//设置为边界Draw(x, y, 铁墙);}//铁墙if (Dynamic_Map[y][x] == 铁墙){Draw(x, y, 铁墙);}//砖墙if (Dynamic_Map[y][x] == 砖墙){Draw(x, y, 砖墙);}//水面if (Dynamic_Map[y][x] == 水面){Draw(x, y, 水面);}//草地if (Dynamic_Map[y][x] == 草地){Draw(x, y, 草地);}//家if (Dynamic_Map[y][x] ==){Draw(x, y,);}}}
}//地图属性绘制
void C_MapClass::Draw (int x, int y ,int draw)
{switch (draw){case 铁墙:WriteChar(x, y, "■", 亮白色 | BACKGROUND_INTENSITY);Static_Map[y][x] = 铁墙;Dynamic_Map[y][x] = 铁墙;break;case 砖墙:WriteChar(x, y, "■", FOREGROUND_RED | FOREGROUND_GREEN | BACKGROUND_INTENSITY);Static_Map[y][x] = 砖墙;Dynamic_Map[y][x] = 砖墙;break;case 水面:WriteChar(x, y, "≈", BACKGROUND_BLUE | BACKGROUND_INTENSITY);Static_Map[y][x] = 水面;Dynamic_Map[y][x] = 水面;break;case 草地:WriteChar(x, y, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);Static_Map[y][x] = 草地;Dynamic_Map[y][x] = 草地;break;case:WriteChar(x, y, "★", FOREGROUND_RED | BACKGROUND_INTENSITY);Static_Map[y][x] =;Dynamic_Map[y][x] =;break;case 空地:WriteChar(x, y, "  ",1);Static_Map[y][x] = 空地;Dynamic_Map[y][x] = 空地;break;default:break;}
}//用来打印自定义地图
void C_MapClass::DrawMapSver()
{for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){//设置为边界Draw(x, y, 铁墙);}//铁墙if (Static_Map[y][x] == 铁墙){Draw(x, y, 铁墙);}//砖墙if (Static_Map[y][x] == 砖墙){Draw(x, y, 砖墙);}//水面if (Static_Map[y][x] == 水面){Draw(x, y, 水面);}//草地if (Static_Map[y][x] == 草地){Draw(x, y, 草地);}//家if (Static_Map[y][x] ==){Draw(x, y,);}}}
}

Game

Game.h

#pragma once
#include "Bullet.h"
#include "Map.h"
#include "Tanks.h"
extern void Games();
#define KEY_DOWN(key)((GetAsyncKeyState(key)& 0x8000)?(1):(0))
#define KEY_UP(key)((GetAsyncKeyState(key)& 0x8001)?(1):(0))extern C_TanksClass tanke_one;
extern C_TanksClass tanke_two;
extern C_TanksClass tanke_enemy[3];
extern C_BulletClass Bullet;
extern C_MapClass map;
class C_GameClass
{
public://死亡重置void TankDeathReset();//判断获取键盘输入并输入到缓冲区void GetOper();//敌方坦克随机移动开炮void AITank();// 敌方坦克初始化void EnemyInitialize();//玩家坦克子弹初始化void OurInitialize();//关卡一void Games_Cycle();//欢迎界面void Welcome();//主选择界面void SelectInterface();//开始游戏void StartGame();//选择关卡void SelectLevel();//暂停游戏void GamePaused();//关卡选择界面void LevelSelect();//胜利界面void GameWinsUI();//死亡界面void GameOverUI();//侧栏信息栏void MapNote();//游戏分数的UIvoid GameScoreUI();//总游戏void Games();//读取保存的游戏void Game_Out();//保存游戏void GameSave();//读取游戏void GameOut();//绘制地图功能void DrawMap();
private:};

Game.cpp

#include "Game.h"#include <conio.h>
#include <cstdio>
#include <ctime>#include "API.h"
#include "Bullet.h"
#include "Global.h"
C_TanksClass tanke_one;
C_TanksClass tanke_two;
C_TanksClass tanke_enemy[3];
C_MapClass map;//判断获取键盘输入并输入到缓冲区
void C_GameClass::GetOper()
{// 获取键盘输入控制坦克方向if (KEY_DOWN('W') && tanke_one.Life > 0) { TankMoveMusic();  tanke_one.InPut(); }// 获取键盘输入控制坦克方向if (KEY_DOWN('S') && tanke_one.Life > 0) { TankMoveMusic(); tanke_one.InPut(); }// 获取键盘输入控制坦克方向if (KEY_DOWN('A') && tanke_one.Life > 0) { TankMoveMusic(); tanke_one.InPut(); }// 获取键盘输入控制坦克方向if (KEY_DOWN('D') && tanke_one.Life > 0) { TankMoveMusic(); tanke_one.InPut(); }//发射子弹出现子弹(接收坦克的方向,x轴坐标,y轴坐标,是否发射按键接收)//黑色 = 0,淡蓝 = 1,淡绿 = 2,湖蓝 = 3,淡红 = 4,紫色 = 5,黄色 = 6,白色 = 7,灰色 = 8,蓝色 = 9,绿色 = 'A',淡浅绿 = 'B',红色 = 'C',淡紫 = 'D',if (KEY_UP('J') && Bullet.BulletInterval_one() && tanke_one.Life > 0) { BulletMusic(); Bullet.BulletFire(tanke_one.TanknDir(), tanke_one.TankPosX(), tanke_one.TankPosY(), 我方, tanke_one.TankColor, 有效, tanke_one.g_stcTank.nATK); }if (KEY_DOWN('P')) { GamePaused(); }// 获取键盘输入控制坦克方向if (KEY_DOWN(VK_UP) && tanke_two.Life > 0) { TankMoveMusic(); tanke_two.InPut(); }// 获取键盘输入控制坦克方向if (KEY_DOWN(VK_DOWN) && tanke_two.Life > 0) { TankMoveMusic(); tanke_two.InPut(); }// 获取键盘输入控制坦克方向if (KEY_DOWN(VK_LEFT) && tanke_two.Life > 0) { TankMoveMusic(); tanke_two.InPut(); }// 获取键盘输入控制坦克方向if (KEY_DOWN(VK_RIGHT) && tanke_two.Life > 0) { TankMoveMusic(); tanke_two.InPut(); }//发射子弹出现子弹(接收坦克的方向,x轴坐标,y轴坐标,是否发射按键接收)if (KEY_UP(VK_NUMPAD0) && Bullet.BulletInterval_two() && tanke_two.Life > 0) { BulletMusic(); Bullet.BulletFire(tanke_two.TanknDir(), tanke_two.TankPosX(), tanke_two.TankPosY(), 我方, tanke_two.TankColor, 有效, tanke_two.g_stcTank.nATK); }
}//敌方坦克随机移动开炮
void C_GameClass::AITank()
{//所有敌方随机方向for (int i = 0; i < 3; i++){//判断敌方坦克血量是否为零if (tanke_enemy[i].g_stcTank.nHP != 0){//将坦克当前方向付给准备获取移动的变量int TanknMoveDir = tanke_enemy[i].TanknDir();//检测碰撞if (!tanke_enemy[i].TankJudge()){//碰到障碍物//随机方向int Random = rand() % 4;//进行移动tanke_enemy[i].InPut(Random);}else{//没有碰到障碍物//继续前进tanke_enemy[i].InPut(TanknMoveDir);}//有一半的几率发射子弹if (rand() % 2 == 1 && Bullet.BulletInterval_enemy(i)){Bullet.BulletFire(tanke_enemy[i].TanknDir(), tanke_enemy[i].TankPosX(), tanke_enemy[i].TankPosY(), 敌方, tanke_enemy[i].TankColor, 有效, tanke_enemy[i].g_stcTank.nATK);}}//坦克死亡重新生成PS:防BUGelse{//初始化生成敌方坦克一if (i == 0){tanke_enemy[0].TankInit(11, 11, 深蓝色, 敌方,, 100,25);}//初始化生成敌方坦克二else if (i == 1){tanke_enemy[1].TankInit(14, 11, 深绿色, 敌方,, 100,25);}//初始化生成敌方坦克三else if (true){tanke_enemy[2].TankInit(17, 11, 深紫色, 敌方,, 100,100);}}}
}//玩家坦克初始化void C_GameClass::OurInitialize(){//玩家一坦克初始化tanke_one.TankInit(25, 52, 浅蓝色, 我方,,100,25);//玩家二坦克初始化tanke_two.TankInit(55, 52, 黄色, 我方,,100, 25);}//敌方坦克初始化void C_GameClass::EnemyInitialize(){//所有敌方初始化tanke_enemy[0].TankInit(11,11, 深蓝色, 敌方,, 100, 25);tanke_enemy[1].TankInit(14, 11, 深绿色, 敌方,, 100, 25);tanke_enemy[2].TankInit(17, 11, BUF绿色, 敌方,, 100, 100);}//所有死亡重置
void C_GameClass::TankDeathReset()
{//判断坦克是否死亡if (!tanke_one.Survive()){if (tanke_one.Life > 0){TankOverMusic();//清除坦克当前位置tanke_one.TanksClear();tanke_one.Life -= 1;if (tanke_one.Life > 0){//初始化坦克tanke_one.TankInit(25, 52, 浅蓝色, 我方,, 100, 25, tanke_one.Life);//绘制坦克tanke_one.TankDraw();}}}if (!tanke_two.Survive()){if (tanke_two.Life > 0){TankOverMusic();//清除坦克当前位置tanke_two.TanksClear();tanke_two.Life -= 1;if (tanke_two.Life > 0){//初始化坦克tanke_two.TankInit(55, 52, 黄色, 我方,, 100, 25, tanke_two.Life);//绘制坦克tanke_two.TankDraw();}}}if (!tanke_enemy[0].Survive()){tanke_enemy[0].TanksClear();tanke_enemy[0].TankInit(11, 11, 深蓝色, 敌方,, 100,25);tanke_enemy[0].TankDraw();}if (!tanke_enemy[1].Survive()){tanke_enemy[1].TanksClear();tanke_enemy[1].TankInit(14, 11, 深绿色, 敌方,, 100,25);tanke_enemy[1].TankDraw();}if (!tanke_enemy[2].Survive()){tanke_enemy[2].TanksClear();tanke_enemy[2].TankInit(17, 11, BUF绿色, 敌方,, 100,100);tanke_enemy[2].TankDraw();}
}//关卡循环
void C_GameClass::Games_Cycle()
{//画地图一if (TheMap == 关卡一){map.Map_One();}if (TheMap == 关卡二){map.Map_Two();}//侧栏信息栏目MapNote();Bullet = { NULL };Bullet.nBulletOver = 1;//判断是否下一关对需要通关的分数初始化if (nSelectWinsInput != 下一关 || nSelectOverInput == 重新开始){LevelScore = 0;if (nSelectOverInput == 重新开始){nSelectOverInput = 0;GameScore = 0;}}nSelectGamePaused = 0;//需要通关分数LevelScore += 10;//玩家坦克子弹初始化OurInitialize();//敌方坦克子弹初始化EnemyInitialize();//绘制坦克tanke_one.TankDraw();tanke_two.TankDraw();for (int i = 0; i < 3; i++){tanke_enemy[i].TankDraw();}while ((((GameScore != LevelScore) && (tanke_one.Life > 0 || tanke_two.Life > 0))&&(Bullet.nBulletOver != 0))&& nSelectGamePaused != 退出){//检测坦克是否移动开炮GetOper();//子弹移动绘制等Bullet.BulletMove(0);//坦克死亡重制TankDeathReset();//检测敌方坦克移动开炮AITank();//子弹移动绘制等Bullet.BulletMove(0);//分数UIGameScoreUI();Sleep(10);}//判断当前分数是否满足关卡通关分数if (GameScore == LevelScore){while (nSelectWinsInput != 退出){system("cls");//胜利界面选择控制变量nSelectWinsInput = 0;//打印胜利界面GameWinsUI();//胜利界面选择获取鼠标进行菜单选择输入WinsSet();//清屏system("cls");//判断是否下一关if (nSelectWinsInput == 下一关){if (TheMap == 关卡一){TheMap = 关卡二;Games_Cycle();}if (TheMap == 关卡二){TheMap = 关卡一;Games_Cycle();}}}}if (tanke_one.Life <= 0 && tanke_two.Life <= 0 || Bullet.nBulletOver == 0){while (nSelectOverInput != 退出){system("cls");//失败界面选择控制变量nSelectOverInput = 0;//打印失败界面GameOverUI();//失败界面选择获取鼠标进行菜单选择输入OverSet();//清屏system("cls");//判断是否重新开始if (nSelectOverInput == 重新开始){Games_Cycle();}}}
}//欢迎界面
void C_GameClass::Welcome()
{WelcomeMusic();//边框for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){WriteChar(x, y, "■", 15 | BACKGROUND_INTENSITY);}}}WriteChar(11, 20, "                                             ■                                                      ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 21, "                                             ■                          ■     ■                   ■    ■    ■         ", rand() % 16 | rand() % 16);WriteChar(11, 22, "    ■        ■■■■■                     ■                          ■     ■                   ■    ■    ■         ", rand() % 16 | rand() % 16);WriteChar(11, 23, "    ■        ■      ■               ■■■■■■■              ■    ■     ■                   ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 24, "    ■        ■      ■                     ■                    ■    ■     ■                   ■    ■    ■         ", rand() % 16 | rand() % 16);WriteChar(11, 25, "    ■        ■      ■                     ■                    ■    ■     ■                   ■    ■    ■         ", rand() % 16 | rand() % 16);WriteChar(11, 26, "    ■        ■■■  ■                 ■■■■■                ■    ■     ■                   ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 27, "  ■■■      ■      ■                 ■      ■            ■■■■■■■■■■■■                  ■  ■             ", rand() % 16 | rand() % 16);WriteChar(11, 28, "    ■        ■      ■                 ■      ■                ■    ■     ■                     ■■  ■■           ", rand() % 16 | rand() % 16);WriteChar(11, 29, "    ■        ■      ■                 ■■■■■                ■    ■     ■                   ■  ■  ■  ■         ", rand() % 16 | rand() % 16);WriteChar(11, 30, "    ■        ■      ■                   ■  ■                  ■    ■     ■                 ■    ■  ■    ■       ", rand() % 16 | rand() % 16);WriteChar(11, 31, "    ■        ■■■■■                  ■   ■                  ■    ■■■■■              ■     ■   ■     ■■    ", rand() % 16 | rand() % 16);WriteChar(11, 32, "    ■■                                 ■    ■   ■             ■                                  ■    ■             ", rand() % 16 | rand() % 16);WriteChar(11, 33, "    ■                                  ■     ■   ■             ■                                 ■     ■             ", rand() % 16 | rand() % 16);WriteChar(11, 34, "  ■        ■■■■■■■            ■       ■■■■            ■■■■■■■■■■              ■      ■             ", rand() % 16 | rand() % 16);WriteChar(11, 35, "                                    ■                                                                       ■             ", rand() % 16 | rand() % 16);WriteChar(11, 36, "                                                                                                             ■             ", rand() % 16 | rand() % 16);//WriteChar(85, 20, "■开始游戏", 15);_getch();
}//主选择界面
void C_GameClass::SelectInterface()
{//边框for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){WriteChar(x, y, "■", 15 | BACKGROUND_INTENSITY);}}}WriteChar(36, 24, "开始游戏", rand() % 16 );WriteChar(36, 26, "选择关卡", rand() % 16 );WriteChar(36, 28, "绘制地图", rand() % 16 );WriteChar(36, 30, "读取游戏", rand() % 16 );WriteChar(36, 32, "退出游戏", rand() % 16 );
}//开始游戏
void C_GameClass::StartGame()
{//游戏一TheMap = 关卡一;Games_Cycle();}//选择关卡
void C_GameClass::SelectLevel ()
{//选关卡的变量重置nSelectLevelInput = 无效;while (nSelectLevelInput != 退出关卡选择){//清屏system("cls");//绘制选关卡界面LevelSelect();//关卡选择获取鼠标进行菜单选择输入LevelSet();//清屏system("cls");if (nSelectLevelInput == 关卡一){TheMap = 关卡一;Games_Cycle();}if (nSelectLevelInput == 关卡二){TheMap = 关卡二;Games_Cycle();}}}//绘制地图功能
void C_GameClass::DrawMap()
{if (nSelectOverInput != 重新开始){TheMap = 自定义地图;nSelectDrawMap = 0;//边框for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){map.Draw(x, y, 铁墙);}}}WriteChar(82, 1, " ﹎﹎﹎﹎﹎控制台按键﹎﹎﹎﹎﹎", 黄色);WriteChar(82, 2, "┆                             ┆", 黄色);WriteChar(82, 3, "┆                             ┆", 黄色);WriteChar(82, 4, "┆                             ┆", 黄色);WriteChar(82, 5, "┆                             ┆", 黄色);WriteChar(82, 6, "┆         铁墙【  】          ┆", 黄色);WriteChar(82, 7, "┆                             ┆", 黄色);WriteChar(82, 8, "┆                             ┆", 黄色);WriteChar(82, 9, "┆                             ┆", 黄色);WriteChar(82, 10, "┆         砖墙【  】          ┆", 黄色);WriteChar(82, 11, "┆                             ┆", 黄色);WriteChar(82, 12, "┆                             ┆", 黄色);WriteChar(82, 13, "┆                             ┆", 黄色);WriteChar(82, 14, "┆         草地【  】          ┆", 黄色);WriteChar(82, 15, "┆                             ┆", 黄色);WriteChar(82, 16, "┆                             ┆", 黄色);WriteChar(82, 17, "┆                             ┆", 黄色);WriteChar(82, 18, "┆         水面【  】          ┆", 黄色);WriteChar(82, 19, "┆                             ┆", 黄色);WriteChar(82, 20, "┆                             ┆", 黄色);WriteChar(82, 21, "┆                             ┆", 黄色);WriteChar(82, 22, "┆          家 【  】          ┆", 黄色);WriteChar(82, 23, "┆                             ┆", 黄色);WriteChar(82, 24, "┆                             ┆", 黄色);WriteChar(82, 25, "┆                             ┆", 黄色);WriteChar(82, 26, "┆          开始游戏           ┆", 黄色);WriteChar(82, 27, "┆                             ┆", 黄色);WriteChar(82, 28, "┆                             ┆", 黄色);WriteChar(82, 29, "┆                             ┆", 黄色);WriteChar(82, 30, "┆            退出             ┆", 黄色);WriteChar(82, 31, "┆                             ┆", 黄色);WriteChar(82, 32, "┆                             ┆", 黄色);WriteChar(82, 33, " ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊", 黄色);WriteChar(90, 6, "■", 亮白色 | BACKGROUND_INTENSITY);WriteChar(90, 10, "■", FOREGROUND_RED | FOREGROUND_GREEN | BACKGROUND_INTENSITY);WriteChar(90, 14, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);WriteChar(90, 18, "≈", BACKGROUND_BLUE | BACKGROUND_INTENSITY);WriteChar(90, 22, "★", FOREGROUND_RED | BACKGROUND_INTENSITY);CustomMapSet();}if (nSelectDrawMap != 退出){//初始化子弹Bullet = { NULL };//初始化游戏分数GameScore = 0;//初始化游戏死亡界面的选择变量nSelectOverInput = 0;//初始化自定义关卡的分数LevelScore = 999999;//初始化子弹没有打到家Bullet.nBulletOver = 1;//初始化绘制地图的选择变量nSelectDrawMap = 0;//初始化暂停界面的选择nSelectGamePaused = 0;//打印自定义的地图map.DrawMapSver();//玩家坦克子弹初始化OurInitialize();//敌方坦克子弹初始化EnemyInitialize();//侧栏信息栏目MapNote();//绘制坦克tanke_one.TankDraw();tanke_two.TankDraw();for (int i = 0; i < 3; i++){tanke_enemy[i].TankDraw();}//绘制子弹//for (int nCount = 1; nCount <= Bullet.nBulletNumber; nCount++)//{//	Bullet.BulletDraw(nCount, Bullet.g_stcBullet[nCount].nDir);//}while ((((GameScore != LevelScore) && (tanke_one.Life > 0 || tanke_two.Life > 0)) && (Bullet.nBulletOver != 0)) && nSelectGamePaused != 退出){//检测坦克是否移动开炮GetOper();//子弹移动绘制等Bullet.BulletMove(0);//坦克死亡重制TankDeathReset();//检测敌方坦克移动开炮AITank();//子弹移动绘制等Bullet.BulletMove(0);//分数UIGameScoreUI();Sleep(10);}//判断当前分数是否满足关卡通关分数if (false){while (nSelectWinsInput != 退出){system("cls");//胜利界面选择控制变量nSelectWinsInput = 0;//打印胜利界面GameWinsUI();//胜利界面选择获取鼠标进行菜单选择输入WinsSet();//清屏system("cls");//判断是否下一关if (nSelectWinsInput == 下一关){//Games_Cycle();}}}if (tanke_one.Life <= 0 && tanke_two.Life <= 0 || Bullet.nBulletOver == 0){while (nSelectOverInput != 退出){system("cls");//失败界面选择控制变量nSelectOverInput = 0;//打印失败界面GameOverUI();//失败界面选择获取鼠标进行菜单选择输入OverSet();//清屏system("cls");//判断是否重新开始if (nSelectOverInput == 重新开始){DrawMap();}}}}
}//读取保存的游戏
void C_GameClass::Game_Out()
{//读取保存的地图map.Map_Save();//侧栏信息栏目MapNote();nSelectGamePaused = 0;//绘制坦克tanke_one.TankDraw();tanke_two.TankDraw();for (int i = 0; i < 3; i++){tanke_enemy[i].TankDraw();}for (int nCount = 1; nCount <= Bullet.nBulletNumber; nCount++){Bullet.BulletDraw(nCount, Bullet.g_stcBullet[nCount].nDir);}while ((((GameScore != LevelScore) && (tanke_one.Life > 0 || tanke_two.Life > 0)) && (Bullet.nBulletOver != 0)) && nSelectGamePaused != 退出){//检测坦克是否移动开炮GetOper();//子弹移动绘制等Bullet.BulletMove(0);//坦克死亡重制TankDeathReset();//检测敌方坦克移动开炮AITank();//子弹移动绘制等Bullet.BulletMove(0);//分数UIGameScoreUI();Sleep(10);}//判断当前分数是否满足关卡通关分数if (GameScore == LevelScore){while (nSelectWinsInput != 退出){system("cls");//胜利界面选择控制变量nSelectWinsInput = 0;//打印胜利界面GameWinsUI();//胜利界面选择获取鼠标进行菜单选择输入WinsSet();//清屏system("cls");//判断是否下一关if (nSelectWinsInput == 下一关){Games_Cycle();}}}if (tanke_one.Life <= 0 && tanke_two.Life <= 0 || Bullet.nBulletOver == 0){while (nSelectOverInput != 退出){system("cls");//失败界面选择控制变量nSelectOverInput = 0;//打印失败界面GameOverUI();//失败界面选择获取鼠标进行菜单选择输入OverSet();//清屏system("cls");//判断是否重新开始if (nSelectOverInput == 重新开始){//判断是否是自定义地图if (TheMap = 自定义地图){DrawMap();}else{Games_Cycle();}}}}
}//暂停游戏
void C_GameClass::GamePaused()
{GameSave();nSelectGamePaused = 0;WriteChar(82, 41, " ﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎",   黄色);WriteChar(82, 42, "┆                             ┆", 黄色);WriteChar(82, 43, "┆                             ┆", 黄色);WriteChar(82, 44, "┆          继续游戏           ┆", 黄色);WriteChar(82, 45, "┆                             ┆", 黄色);WriteChar(82, 46, "┆                             ┆", 黄色);WriteChar(82, 47, "┆                             ┆", 黄色);WriteChar(82, 48, "┆          退出游戏           ┆", 黄色);WriteChar(82, 49, "┆                             ┆", 黄色);WriteChar(82, 50, "┆                             ┆", 黄色);WriteChar(82, 51, " ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊",   黄色);while (nSelectGamePaused != 退出  && nSelectGamePaused != 继续游戏){PausedSet();}if (nSelectGamePaused == 继续游戏){WriteChar(82, 41, " ﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎", 黄色);WriteChar(82, 42, "┆                             ┆", 黄色);WriteChar(82, 43, "┆                             ┆", 黄色);WriteChar(82, 44, "┆                             ┆", 黄色);WriteChar(82, 45, "┆                             ┆", 黄色);WriteChar(82, 46, "┆                             ┆", 黄色);WriteChar(82, 47, "┆                             ┆", 黄色);WriteChar(82, 48, "┆                             ┆", 黄色);WriteChar(82, 49, "┆                             ┆", 黄色);WriteChar(82, 50, "┆                             ┆", 黄色);WriteChar(82, 51, " ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊", 黄色);WriteChar(83, 44, " ● 坦克 P 1", 浅蓝色);WriteChar(83, 48, " ● 坦克 P 2", 黄色);}
}//关卡选择界面
void C_GameClass::LevelSelect()
{//边框for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){WriteChar(x, y, "■", 15 | BACKGROUND_INTENSITY);}}}WriteChar(36, 26, "关卡一", rand() % 16);WriteChar(36, 28, "关卡二", rand() % 16);WriteChar(36, 30, "退出关卡选择", rand() % 16);}//胜利界面
void C_GameClass::GameWinsUI()
{WelcomeMusic();//边框for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){WriteChar(x, y, "■", 15 | BACKGROUND_INTENSITY);}}}WriteChar(11, 10, "    ■■■■■■                  ■■                      ■               ■             ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 11, "  ■           ■                ■  ■                    ■■             ■■            ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 12, " ■                             ■    ■                  ■  ■           ■  ■           ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 13, "■                             ■      ■                ■    ■         ■    ■          ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 14, "■                            ■        ■              ■      ■       ■      ■         ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 15, "■                           ■■■■■■■            ■        ■     ■        ■        ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 16, "■          ■■■■        ■            ■          ■          ■   ■          ■       ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 17, " ■            ■ ■       ■              ■        ■            ■■             ■      ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 18, "  ■          ■  ■      ■                ■       ■             ■              ■      ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 19, "   ■■■■■■          ■                  ■     ■              ■               ■     ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 20, "                                                                                                                   ", rand() % 16 | rand() % 16);WriteChar(11, 21, "       ■           ■           ■         ■■■            ■            ■■            ■■■■■             ", rand() % 16 | rand() % 16);WriteChar(11, 22, "       ■           ■           ■           ■              ■           ■ ■          ■         ■            ", rand() % 16 | rand() % 16);WriteChar(11, 23, "       ■          ■■          ■           ■              ■         ■   ■         ■                        ", rand() % 16 | rand() % 16);WriteChar(11, 24, "        ■        ■  ■        ■            ■              ■       ■     ■          ■                       ", rand() % 16 | rand() % 16);WriteChar(11, 25, "         ■      ■    ■      ■             ■              ■      ■      ■            ■■■■               ", rand() % 16 | rand() % 16);WriteChar(11, 26, "          ■    ■      ■    ■              ■              ■     ■       ■                    ■             ", rand() % 16 | rand() % 16);WriteChar(11, 27, "           ■  ■        ■  ■               ■              ■   ■         ■                     ■            ", rand() % 16 | rand() % 16);WriteChar(11, 28, "            ■■          ■■                ■              ■ ■           ■         ■         ■             ", rand() % 16 | rand() % 16);WriteChar(11, 29, "             ■            ■               ■■■            ■■            ■          ■■■■■               ", rand() % 16 | rand() % 16);WriteChar(30, 40, "下一关", rand() % 16 | rand() % 16);WriteChar(45, 40, "退出", rand() % 16 | rand() % 16);
}//死亡界面
void C_GameClass::GameOverUI()
{GameOverMusic();//边框for (int y = 0; y < 边界Y; y++){//X轴for (int x = 0; x < 边界X; x++){//判断是否为边界的位置if (y == 0 || x == 0 || x == 边界X - 1 || y == 边界Y - 1){WriteChar(x, y, "■", 15 | BACKGROUND_INTENSITY);}}}WriteChar(11, 10, "    ■■■■■■                  ■■                      ■               ■             ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 11, "  ■           ■                ■  ■                    ■■             ■■            ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 12, " ■                             ■    ■                  ■  ■           ■  ■           ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 13, "■                             ■      ■                ■    ■         ■    ■          ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 14, "■                            ■        ■              ■      ■       ■      ■         ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 15, "■                           ■■■■■■■            ■        ■     ■        ■        ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 16, "■          ■■■■        ■            ■          ■          ■   ■          ■       ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 17, " ■            ■ ■       ■              ■        ■            ■■             ■      ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 18, "  ■          ■  ■      ■                ■       ■             ■              ■      ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 19, "   ■■■■■■          ■                  ■     ■              ■               ■     ■■■■■■■         ", rand() % 16 | rand() % 16);WriteChar(11, 20, "                                                                                                                   ", rand() % 16 | rand() % 16);WriteChar(11, 21, "                   ■■■■■        ■              ■     ■■■■■■■      ■■■■■■                       ", rand() % 16 | rand() % 16);WriteChar(11, 22, "                 ■          ■       ■            ■      ■                  ■         ■                      ", rand() % 16 | rand() % 16);WriteChar(11, 23, "               ■              ■      ■          ■       ■                  ■           ■                    ", rand() % 16 | rand() % 16);WriteChar(11, 24, "               ■              ■       ■        ■        ■                  ■         ■                      ", rand() % 16 | rand() % 16);WriteChar(11, 25, "               ■              ■        ■      ■         ■■■■■■■      ■■■■■■                       ", rand() % 16 | rand() % 16);WriteChar(11, 26, "               ■              ■         ■    ■          ■                  ■        ■                       ", rand() % 16 | rand() % 16);WriteChar(11, 27, "               ■              ■          ■  ■           ■                  ■         ■                      ", rand() % 16 | rand() % 16);WriteChar(11, 28, "                 ■          ■             ■■            ■                  ■          ■                     ", rand() % 16 | rand() % 16);WriteChar(11, 29, "                   ■■■■■                ■             ■■■■■■■      ■           ■                    ", rand() % 16 | rand() % 16);WriteChar(30, 40, "重新开始", rand() % 16 | rand() % 16);WriteChar(45, 40, "退出", rand() % 16 | rand() % 16);
}//绘制地图侧栏的备注信息
void C_GameClass::MapNote()
{WriteChar(82,1,  " ﹎﹎﹎﹎﹎控制台按键﹎﹎﹎﹎﹎",   黄色);WriteChar(82,2,  "┆                             ┆", 黄色);WriteChar(82,3,  "┆                             ┆", 黄色);WriteChar(82,4,  "┆    玩家1                    ┆", 黄色);WriteChar(82,5,  "┆                             ┆", 黄色);WriteChar(82,6,  "┆ 【W】:向上                 ┆", 黄色);WriteChar(82,7,  "┆                             ┆", 黄色);WriteChar(82,8,  "┆ 【S】:向下                 ┆", 黄色);WriteChar(82,9,  "┆                             ┆", 黄色);WriteChar(82,10, "┆ 【A】:向左                 ┆", 黄色);WriteChar(82,11, "┆                             ┆", 黄色);WriteChar(82,12, "┆ 【D】:向右                 ┆", 黄色);WriteChar(82,13, "┆                             ┆", 黄色);WriteChar(82,14, "┆ 【J】:射击                 ┆", 黄色);WriteChar(82,15, "┆                             ┆", 黄色);WriteChar(82,16, "┆                             ┆", 黄色);WriteChar(82,17, "┆    玩家2                    ┆", 黄色);WriteChar(82,18, "┆                             ┆", 黄色);WriteChar(82,19, "┆ 【↑】:向上                ┆", 黄色);WriteChar(82,20, "┆                             ┆", 黄色);WriteChar(82,21, "┆ 【↓】:向下                ┆", 黄色);WriteChar(82,22, "┆                             ┆", 黄色);WriteChar(82,23, "┆ 【←】:向左                ┆", 黄色);WriteChar(82,24, "┆                             ┆", 黄色);WriteChar(82,25, "┆ 【→】:向右                ┆", 黄色);WriteChar(82,26, "┆                             ┆", 黄色);WriteChar(82,27, "┆ 【0】:射击                 ┆", 黄色);WriteChar(82,28, "┆                             ┆", 黄色);WriteChar(82,29, "┆                             ┆", 黄色);WriteChar(82,30, "┆ 【P】:保存游戏并退出       ┆", 黄色);WriteChar(82,31, "┆                             ┆", 黄色);WriteChar(82,32, "┆                             ┆", 黄色);WriteChar(82,33, " ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊",   黄色);WriteChar(82,34, " ﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎",   黄色);WriteChar(82,35, "┆                             ┆", 黄色);WriteChar(82,36, "┆                             ┆", 黄色);WriteChar(82,37, "┆  ☆分 数☆                  ┆", 黄色);WriteChar(82,38, "┆                             ┆", 黄色);WriteChar(82,39, "┆                             ┆", 黄色);WriteChar(82,40, " ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊",   黄色);WriteChar(82,41, " ﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎﹎",   黄色);WriteChar(82,42, "┆                             ┆", 黄色);WriteChar(82,43, "┆                             ┆", 黄色);WriteChar(82,44, "┆                             ┆", 黄色);WriteChar(82,45, "┆                             ┆", 黄色);WriteChar(82,46, "┆                             ┆", 黄色);WriteChar(82,47, "┆                             ┆", 黄色);WriteChar(82,48, "┆                             ┆", 黄色);WriteChar(82,49, "┆                             ┆", 黄色);WriteChar(82,50, "┆                             ┆", 黄色);WriteChar(82,51, " ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊",   黄色);WriteChar(83, 44, " ● 坦克 P 1", 浅蓝色);WriteChar(83, 48, " ● 坦克 P 2", 黄色);}//游戏分数的UI
void C_GameClass::GameScoreUI()
{//WriteChar(88, 37, "分数:", rand() % 16 | rand() % 16);WriteInt(90, 37, GameScore, rand() % 16 | rand() % 16);
}//保存游戏
void C_GameClass::GameSave()
{FILE* pFile = NULL;fopen_s(&pFile, "./Save.txt", "w");//坦克fwrite(&tanke_one, sizeof(C_TanksClass), 1, pFile);			fwrite(&tanke_two, sizeof(C_TanksClass), 1, pFile);			fwrite(&tanke_enemy[0], sizeof(C_TanksClass), 1, pFile);fwrite(&tanke_enemy[1], sizeof(C_TanksClass), 1, pFile);fwrite(&tanke_enemy[2], sizeof(C_TanksClass), 1, pFile);//子弹fwrite(&Bullet, sizeof(C_BulletClass), 1, pFile);//游戏分数fwrite(&GameScore, sizeof(int), 1, pFile);//通关分数fwrite(&LevelScore, sizeof(int), 1, pFile);//当前地图fwrite(&TheMap, sizeof(int), 1, pFile);//静态地图for (int x = 0; x < 边界Y; x++){fwrite(Static_Map[x], sizeof(int), 80, pFile);		//地图内容}//动态地图for (int x = 0; x < 边界Y; x++){fwrite(Dynamic_Map[x], sizeof(int), 80, pFile);		//地图内容}fclose(pFile);
}//读取游戏
void C_GameClass::GameOut()
{FILE* pFile = NULL;fopen_s(&pFile, "./Save.txt", "r");//坦克fread(&tanke_one, sizeof(C_TanksClass), 1, pFile);fread(&tanke_two, sizeof(C_TanksClass), 1, pFile);fread(&tanke_enemy[0], sizeof(C_TanksClass), 1, pFile);fread(&tanke_enemy[1], sizeof(C_TanksClass), 1, pFile);fread(&tanke_enemy[2], sizeof(C_TanksClass), 1, pFile);//子弹fread(&Bullet, sizeof(C_BulletClass), 1, pFile);//游戏分数fread(&GameScore, sizeof(int), 1, pFile);//通关分数fread(&LevelScore, sizeof(int), 1, pFile);//当前地图fread(&TheMap, sizeof(int), 1, pFile);//静态地图for (int x = 0; x < 边界Y; x++){fread(Static_Map[x], sizeof(int), 80, pFile);		//地图内容}//动态地图for (int x = 0; x < 边界Y; x++){fread(Dynamic_Map[x], sizeof(int), 80, pFile);		//地图内容}fclose(pFile);
}//游戏主函数
void C_GameClass::Games()
{//欢迎界面Welcome();while (nSelectIntInput != 退出游戏){//初始化主页面选择nSelectIntInput = 0;//初始化关卡选择TheMap = 0;//清屏system("cls");//打印主选择界面SelectInterface();//获取鼠标进行菜单选择输入SelectInt();//对获取输入进行判断switch (nSelectIntInput){//新游戏------------------------------------------完成case 开始游戏:system("cls");//开始游戏StartGame();break;//选择游戏关卡-----------------------------------完成case 选择关卡:system("cls");//选择关卡SelectLevel();break;//绘制地图---------------------------------------case 绘制地图:system("cls");DrawMap();//GameOverUI();break;//读取游戏---------------------------------------完成case 读取游戏:system("cls");//读取游戏GameOut();Game_Out();break;default:system("cls");break;}}
}

Tanks

Tanks.h

#pragma once
#include <ctime>
#include <Windows.h>class C_TanksClass/*:virtual public C_BulletClass*/
{
public://用来存储坦克相关的结构体typedef struct _TANKINFO{//存储坐标COORD pos;//存储方向int nDir;//血量int nHP = 100;//攻击力量int nATK = 25;//等级int nLevel = 2;//速度int nSpeed;//移动过的时间int nClock;//随机移动步数int nOper[10];//敌我坦克识别int nTanksiDentify = 0;}TANKINFO;TANKINFO g_stcTank;//定义坦克上下左右的形状int Tanks[4][3][3] ={{{0,1,0},{1,1,1},{1,0,1}},{{1,0,1},{1,1,1},{0,1,0}},{{0,1,1},{1,1,0},{0,1,1}},{{1,1,0},{0,1,1},{1,1,0}}};//坦克初始化void TankInit(int X, int Y, int Color, int iDentify, int Dir, int Hp, int nATK, int nLife = 3);//检测坦克存活bool Survive();//坦克颜色int TankColor = 0;//记录坦克移动时间clock_t m_TankEnd;//控制坦克两次移动间隔是否移动bool TankInterval();//获取键盘输入控制坦克方向void InPut(int Input);//绘制坦克void TankDraw();//清理坦克void TanksClear();//用于存储从键盘获取的坦克方向char cTankInput;//用于返回子弹方向的接口int TanknDir();int nTanknDir = 0;//用于返回子弹出现位置的X轴接口int TankPosX();int nTankPosX = 0;//用于返回子弹出现位置的Y轴接口int TankPosY();int nTankPosY = 0;//用于返回键盘接收到的信息char cInput();//碰撞判定bool TankJudge();//我方游戏坦克命数int Life = 1;
private:};

Tanks.cpp

#include "Tanks.h"#include <ctime>#include "API.h"
#include "Game.h"
#include "Global.h"
#include "Map.h"//用于存储从键盘获取初始化坦克方向
//char cTankInput = 0;//坦克初始化(X坐标,Y坐标,颜色,阵营,方向,血量)
void C_TanksClass::TankInit (int X, int Y, int Color, int iDentify, int Dir, int Hp, int nATK, int nLife)
{//初始化X坐标g_stcTank.pos.X = X;//初始化Y坐标g_stcTank.pos.Y = Y;//初始化颜色TankColor = Color;//初始化阵营g_stcTank.nTanksiDentify = iDentify;//初始化方向g_stcTank.nDir = Dir;//初始化血量g_stcTank.nHP = Hp;//初始化攻击力g_stcTank.nATK = nATK;//初始化命数Life = nLife;
}//坦克移动时间间隔判断
bool C_TanksClass::TankInterval()
{//控制坦克两次移动间隔是否移动(当前时间 - 曾经移动过的时间 < 80)if (clock() - m_TankEnd < 80){//不可移动return false;}else{//可以移动,并将现在时间赋值到曾经移动过的时间m_TankEnd = clock();return true;}
};//获取键盘输入控制坦克方向(方向)
void C_TanksClass::InPut(int Input)
{判断俩子弹发射间隔是否发射if (TankInterval()){//清理坦克(走之前先将当前坐标坦克清理)TanksClear();//通过接受键盘输入判断坦克方向switch (Input){case://判断之前输入的方向与现在输入的方向是否相同,if (g_stcTank.nDir !=){//不相同将方向转为输入的方向g_stcTank.nDir =;}else{//相同,向同方向移动坐标(移动前进行碰撞检测)if (TankJudge()){//如果碰撞则不进行移动g_stcTank.pos.Y--;}}break;case:if (g_stcTank.nDir !=){g_stcTank.nDir =;}else{if (TankJudge()){g_stcTank.pos.Y++;}}break;case:if (g_stcTank.nDir !=){g_stcTank.nDir =;}else{if (TankJudge()){g_stcTank.pos.X--;}}break;case:if (g_stcTank.nDir !=){g_stcTank.nDir =;}else{if (TankJudge()){g_stcTank.pos.X++;}}break;default:break;}//判断坦克是否死亡//PS:因为这里需要移动才会进入到这里所以这里可有可无已在外部实现if (Survive()){//没有死亡绘制坦克TankDraw();}else{//死亡清除坦克TanksClear();}}
}//碰撞判定
bool C_TanksClass::TankJudge()
{//根据坦克的方向进行判定坦克前面三个点(方向)switch (g_stcTank.nDir){case://如果不是空地不是草地那么不能走if (Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X] != 空地 && Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X] != 草地/* && Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X + 1] != 空地 && Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X + 1] != 草地/* && Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X + 1] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X - 1] != 空地 && Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X - 1] != 草地/* && Dynamic_Map[g_stcTank.pos.Y - 2][g_stcTank.pos.X - 1] != 子弹*/){return false;}break;case:if (Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X] != 空地 && Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X] != 草地/* && Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X + 1] != 空地 && Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X + 1] != 草地/* && Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X + 1] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X - 1] != 空地 && Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X - 1] != 草地/* && Dynamic_Map[g_stcTank.pos.Y + 2][g_stcTank.pos.X - 1] != 子弹*/){return false;}break;case:if (Dynamic_Map[g_stcTank.pos.Y][g_stcTank.pos.X - 2] != 空地 && Dynamic_Map[g_stcTank.pos.Y][g_stcTank.pos.X - 2] != 草地/* && Dynamic_Map[g_stcTank.pos.Y][g_stcTank.pos.X - 2] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y + 1][g_stcTank.pos.X - 2] != 空地 && Dynamic_Map[g_stcTank.pos.Y + 1][g_stcTank.pos.X - 2] != 草地 /*&& Dynamic_Map[g_stcTank.pos.Y + 1][g_stcTank.pos.X - 2] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y - 1][g_stcTank.pos.X - 2] != 空地 && Dynamic_Map[g_stcTank.pos.Y - 1][g_stcTank.pos.X - 2] != 草地/* && Dynamic_Map[g_stcTank.pos.Y - 1][g_stcTank.pos.X - 2] != 子弹*/){return false;}break;case:if (Dynamic_Map[g_stcTank.pos.Y][g_stcTank.pos.X + 2] != 空地 && Dynamic_Map[g_stcTank.pos.Y][g_stcTank.pos.X + 2] != 草地 /*&& Dynamic_Map[g_stcTank.pos.Y][g_stcTank.pos.X + 2] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y + 1][g_stcTank.pos.X + 2] != 空地 && Dynamic_Map[g_stcTank.pos.Y + 1][g_stcTank.pos.X + 2] != 草地/* && Dynamic_Map[g_stcTank.pos.Y + 1][g_stcTank.pos.X + 2] != 子弹*/|| Dynamic_Map[g_stcTank.pos.Y - 1][g_stcTank.pos.X + 2] != 空地 && Dynamic_Map[g_stcTank.pos.Y - 1][g_stcTank.pos.X + 2] != 草地 /*&& Dynamic_Map[g_stcTank.pos.Y - 1][g_stcTank.pos.X + 2] != 子弹*/){return false;}break;default:return true;break;}
}//绘制坦克
void C_TanksClass::TankDraw()
{//通过循环对什么方向的坦克进行绘制for (int y = 0; y < 3; y++){for (int x = 0; x < 3; x++){//根据坦克方向绘制样子//g_stcTank.nDir记录方向if (Tanks[g_stcTank.nDir][y][x] != 0){//静态地图这个位置是不是草地//g_stcTank.pos.X和g_stcTank.pos.Y记录中心坐标if (Static_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] == 草地){//如果是草地直接绘制草地WriteChar(g_stcTank.pos.X - 1 + x, g_stcTank.pos.Y - 1 + y, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);//将坦克信息放到动态地图上Dynamic_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] = 坦克;}else{//否则绘制坦克//PS:其他的所有WriteChar(g_stcTank.pos.X - 1 + x, g_stcTank.pos.Y - 1 + y, "□", TankColor);//将坦克信息放到动态地图上Dynamic_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] = 坦克;}}}}
}//清理坦克
void C_TanksClass::TanksClear()
{/*int nDir = g_stcTank.nDir;*///与绘制坦克一样for (int y = 0; y < 3; y++){for (int x = 0; x < 3; x++){//根据坦克方向判断要擦除的位置if (Tanks[g_stcTank.nDir][y][x] != 0){//判断静态地图这个位置是不是草地if (Static_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] == 草地){//是草地输出草地到屏幕WriteChar(g_stcTank.pos.X - 1 + x, g_stcTank.pos.Y - 1 + y, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);//将动态地图设为草地Dynamic_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] = Static_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x];}//判断静态地图这个位置是不是水面if (Static_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] == 水面){//是水面输出水面到屏幕WriteChar(g_stcTank.pos.X - 1 + x, g_stcTank.pos.Y - 1 + y, "≈", BACKGROUND_BLUE | BACKGROUND_INTENSITY);//将动态地图设为水面Dynamic_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] = Static_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x];}//判断动态地图这个位置是不是坦克if (Dynamic_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] == 坦克){// 是坦克输出空地到屏幕WriteChar(g_stcTank.pos.X - 1 + x, g_stcTank.pos.Y - 1 + y, "  ", 1);//将动态地图设为空地Dynamic_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] = 空地;}//g_stcTank.nTanksrMark = 空地;//g_Map[g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x] = maps.nLevelMap[1][g_stcTank.pos.Y - 1 + y][g_stcTank.pos.X - 1 + x];}	}}
}//检测坦克存活
bool C_TanksClass::Survive ()
{//如果血量小于等于100if (g_stcTank.nHP <= 0){//死亡return false;}else{//存活return true;}
}//用于返回坦克方向的接口
int C_TanksClass::TanknDir()
{return g_stcTank.nDir;}//用于返回坦克的X轴接口
int C_TanksClass::TankPosX()
{return g_stcTank.pos.X;
}
//用于返回坦克的Y轴接口int C_TanksClass::TankPosY()
{return g_stcTank.pos.Y;
}//用于返回键盘接收到的信息
char C_TanksClass::cInput()
{return cTankInput;
}

Bullet

Bullet.h

#pragma once
#include <ctime>
#include <Windows.h>#include "Global.h"//子弹类
class C_BulletClass
{
public:typedef struct _BULLETINFO{//存储坐标COORD pos;//存储方向int nDir;//血量int nHP;//攻击力量int nATK = 25;//等级int nLevel = 1;//速度int nSpeed;//移动过的时间int nLastClock;//子弹颜色int nColor;//子弹存活标识int nBullerExist = 无效;//阵营敌我坦克识别int nCampiDentify = 0;}BULLETINFO;//子弹结构体 对象【数量】BULLETINFO g_stcBullet[100];//char cBulletInput = NULL;//记录子弹数量int nBulletNumber = NULL;//记录子弹发射时间clock_t m_oneBulletEnd;clock_t m_twoBulletEnd;clock_t m_enemyBulletEnd[3];//控制两子弹发射间隔是否发射bool BulletInterval_one();bool BulletInterval_two();bool BulletInterval_enemy(int i);//接收发射数据获取坦克坐标发射子弹void BulletFire(int nDir, int nPosX, int nPosY, int nCamp, int nColor, int Exist, int nATK);//移动子弹void BulletMove(int BulletErase);//子弹碰撞检测void BulletCollide(int nNumber, int nDir);//回收失效子弹void BulletReclaim();//绘制子弹void BulletDraw(int nNumber, int nDir);//擦除子弹void BulletClear(int nNumber);//检测子弹与坦克扣血void Tank_HP_Red(int nNumber, int X, int Y);//当所有子弹打到家返回0int nBulletOver = 1;//子弹失效int BulletOver();//子弹方向的接口int BulletPosX();int nBulletPosX = 0;//子弹方向的接口int BulletPosY();int nBulletPosY = 0;
};

Bullet.cpp

这里面有很多冗余代码
子弹和坦克的检查没必要写一个switch
只需要一个if判断即可

if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 坦克){//子弹置为无效g_stcBullet[nNumber].nBullerExist = 无效;//对坦克进行扣血Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y);//返回调用函数废弃}

下面是代码

#include "Bullet.h"
#include <ctime>#include "API.h"
#include "Game.h"
#include "Global.h"
#include "Tanks.h"//再声明子弹对象
C_BulletClass Bullet;//玩家一两子弹发射间隔
bool C_BulletClass::BulletInterval_one()
{//控制两子弹发射间隔是否发射(当前时间 - 上次发射的时间 < 400)if ( clock()-m_oneBulletEnd < 400){//不能发射return false;}else{//可以发射//将当前时间存储到上次发射的时间变量中m_oneBulletEnd = clock();return true;}
};//玩家二两子弹发射间隔
bool C_BulletClass::BulletInterval_two()
{//控制两子弹发射间隔是否发射if (clock() - m_twoBulletEnd < 400){return false;}else{m_twoBulletEnd = clock();return true;}
};//人机两子弹发射间隔
bool C_BulletClass::BulletInterval_enemy(int i)
{//控制两子弹发射间隔是否发射if (clock() - m_enemyBulletEnd[i] < 400){return false;}else{m_enemyBulletEnd[i] = clock();return true;}
};
//发射子弹出现子弹,子弹初始化(接收坦克的方向,x轴坐标,y轴坐标,阵营标识,颜色)
void C_BulletClass::BulletFire(int nDir, int nPosX, int nPosY,int nCamp, int nColor ,int Exist,int nATK)
{////子弹数量自增nBulletNumber++;//子弹初始速度g_stcBullet[nBulletNumber].nSpeed = 60;//子弹当前移动时间g_stcBullet[nBulletNumber].nLastClock = clock();//子弹的方向g_stcBullet[nBulletNumber].nDir = nDir;//子弹的阵营g_stcBullet[nBulletNumber].nCampiDentify = nCamp;//子弹的颜色g_stcBullet[nBulletNumber].nColor = nColor;//子弹是否有效g_stcBullet[nBulletNumber].nBullerExist = 有效;//子弹威力g_stcBullet[nBulletNumber].nATK = nATK;//根据方向判断switch (nDir){case://子弹是否存活if (g_stcBullet[nBulletNumber].nBullerExist != 0)//接收X轴坐标g_stcBullet[nBulletNumber].pos.X = nPosX;//接收Y轴坐标g_stcBullet[nBulletNumber].pos.Y = nPosY - 2;//进行子弹碰撞检测BulletCollide(nBulletNumber, nDir);break;case:g_stcBullet[nBulletNumber].pos.X = nPosX;g_stcBullet[nBulletNumber].pos.Y = nPosY + 2;BulletCollide(nBulletNumber, nDir);break;case:g_stcBullet[nBulletNumber].pos.X = nPosX - 2;g_stcBullet[nBulletNumber].pos.Y = nPosY;BulletCollide(nBulletNumber, nDir);break;case:g_stcBullet[nBulletNumber].pos.X = nPosX + 2;g_stcBullet[nBulletNumber].pos.Y = nPosY;BulletCollide(nBulletNumber, nDir);break;default:break;}}//子弹移动
void C_BulletClass::BulletMove(int BulletErase)
{//对所有子弹进行循环从第一颗开始for (int nCount = 1; nCount <= nBulletNumber; nCount++){//子弹擦除BulletClear(nCount);//控制子弹移动速度 当前时间-上次移动的时间 > 速度if (clock() - g_stcBullet[nCount].nLastClock > g_stcBullet[nCount].nSpeed){//当前子弹接收当前移动的时间信息g_stcBullet[nCount].nLastClock = clock();//根据当前子弹方向判断switch (g_stcBullet[nCount].nDir){case://当前子弹移动g_stcBullet[nCount].pos.Y--;break;case:g_stcBullet[nCount].pos.Y++;break;case:g_stcBullet[nCount].pos.X--;break;case:g_stcBullet[nCount].pos.X++;break;default:break;}}//子弹绘制BulletDraw(nCount, g_stcBullet[nCount].nDir);//回收失效子弹BulletReclaim();}
}//回收失效子弹
void C_BulletClass::BulletReclaim()
{//对所有子弹进行循环for (int nCount = 1;nCount>0 &&nCount <= nBulletNumber; nCount++){//查看当前子弹是否无效if (g_stcBullet[nCount].nBullerExist == 无效){//将子弹后面所有数组前移for (int x = nCount; x <= nBulletNumber; x++){g_stcBullet[x] = g_stcBullet[x + 1];}//子弹数量减一nBulletNumber--;//从当前子弹位置继续nCount--;}}
}//子弹碰撞检测
void C_BulletClass::BulletCollide(int nNumber, int nDir)
{//判断子弹下一个位置是否是砖墙铁墙或者坦克如果是则子弹失效if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 砖墙 ||Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 铁墙 ||Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 坦克){//子弹失效jjjg_stcBullet[nNumber].nBullerExist = 无效;}//砖墙检测if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 砖墙){//绘制空地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "  ", 黑色);//将动态地图设为空地Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 空地;//子弹失效g_stcBullet[nNumber].nBullerExist = 无效;}//与家的检测if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] ==){//绘制空地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "  ", 黑色);//将动态地图设为空地Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 空地;//子弹失效g_stcBullet[nNumber].nBullerExist = 无效;//当子弹打到家返回0默认1nBulletOver = 0;//Bullet.nBulletOver = 0;}//子弹检测for (int nCount = 0; nCount < 100; ++nCount){//对所有子弹进行循环,对当前子弹进行判断不等于当前子弹,if (nNumber != nCount){//判断子弹的XY轴是否相等if (g_stcBullet[nNumber].pos.X == g_stcBullet[nCount].pos.X &&g_stcBullet[nNumber].pos.Y == g_stcBullet[nCount].pos.Y){//置为无效g_stcBullet[nNumber].nBullerExist = 无效;//如果静态地图当前位置是砖墙或者空地,//PS:因为子弹走过的路动态图上都是子弹或者空地if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 砖墙 ||Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 空地){//绘制空地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "  ", 黑色);//输出到动态图上Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 空地;}//判断静态图上是否是水面if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 水面){//绘制水面WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "≈", BACKGROUND_BLUE | BACKGROUND_INTENSITY);//将动态图设为水面Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X];}//判断静态图上是否是草地if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 草地){//绘制草地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);//将动态图设为草地Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X];}else{//防止bugDynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] =Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X];}//将子弹置为无效g_stcBullet[nCount].nBullerExist = 无效;//BulletClear(i);}}}//坦克检测(方向)switch (nDir){case://动态图的当前位置是否是坦克if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 坦克){//子弹置为无效g_stcBullet[nNumber].nBullerExist = 无效;//对坦克进行扣血Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y);//返回调用函数废弃}/*elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X - 1] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X - 1, g_stcBullet[nNumber].pos.Y);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X + 1] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X + 1, g_stcBullet[nNumber].pos.Y);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}*/break;case:if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y);}/*elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X - 1] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X - 1, g_stcBullet[nNumber].pos.Y);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X + 1] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X + 1, g_stcBullet[nNumber].pos.Y);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}*/break;case:if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y);}/*elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y - 1][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y - 1);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y + 1][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y + 1);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}*/break;case:if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y);}/*elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y - 1][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y - 1);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}elseif (Dynamic_Map[g_stcBullet[nNumber].pos.Y + 1][g_stcBullet[nNumber].pos.X] == 坦克){g_stcBullet[nNumber].nBullerExist = 无效;Tank_HP_Red(nNumber, g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y + 1);nBulletLapse = g_stcBullet[nNumber].nBullerExist;nBulletPosX = g_stcBullet[nNumber].pos.X;nBulletPosX = g_stcBullet[nNumber].pos.Y;}*/break;default:break;}//if (nBulletLapse == 无效)//{//	if (Dynamic_Map[nBulletPosY][nBulletPosX] == 子弹)//	{//		nBulletLapse = g_stcBullet[nNumber].nBullerExist = 0;//		nBulletPosX = g_stcBullet[nNumber].pos.X;//		nBulletPosX = g_stcBullet[nNumber].pos.Y;//		WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "  ", 黑色);//		Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 空地;//	}//}
}
//绘制子弹
void C_BulletClass::BulletDraw(int nNumber,int nDir)
{//判断子弹是否有效BulletCollide(nNumber, nDir);//检测子弹失效if (g_stcBullet[nNumber].nBullerExist == 有效){//判断子弹要绘制的位置是否是草地if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 草地){//绘制草地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);//动态图设为子弹Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 子弹;}//判断子弹要绘制的位置是否是水面else if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 水面){//设为水面WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "●", g_stcBullet[nNumber].nColor);//动态图设为子弹Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 子弹;}//如果不是草地或者水面正常打印子弹else{//绘制子弹WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "●", g_stcBullet[nNumber].nColor);//动态图设为子弹Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 子弹;}}//g_stcBullet[x].nBullerMark = 子弹;
}//擦除子弹
void C_BulletClass::BulletClear(int nNumber)
{//判断子弹是否有效//BulletCollide(x);//检测子弹是否失效if (g_stcBullet[nNumber].nBullerExist == 有效){//判断准备擦除的位置是否原本是草地是则将位置擦除为草地if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 草地){//绘制草地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "屮", BACKGROUND_GREEN | BACKGROUND_INTENSITY);//动态图设为草地Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X];return;}//判断准备擦除的位置是否原本是水面是则将位置擦除为水面else if (Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 水面){//绘制水面WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "≈", BACKGROUND_BLUE | BACKGROUND_INTENSITY);//动态图设为水面Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = Static_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X];return;}//准备擦除的位置原本是空地则擦除为空地else if (Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] == 子弹){//绘制空地WriteChar(g_stcBullet[nNumber].pos.X, g_stcBullet[nNumber].pos.Y, "  ", 黑色);//动态图设为空地Dynamic_Map[g_stcBullet[nNumber].pos.Y][g_stcBullet[nNumber].pos.X] = 空地;return;}}}//判断坦克进行扣血
void C_BulletClass::Tank_HP_Red (int nNumber,int X, int Y)
{//玩家一//Y轴和X轴小于范围内if (Y <= tanke_one.g_stcTank.pos.Y + 2 && Y >= tanke_one.g_stcTank.pos.Y - 2 &&X <= tanke_one.g_stcTank.pos.X + 2 && X >= tanke_one.g_stcTank.pos.X - 2){//判断是不是同一阵营if (g_stcBullet[nNumber].nCampiDentify != tanke_one.g_stcTank.nTanksiDentify){//对坦克进行扣血tanke_one.g_stcTank.nHP -= g_stcBullet[nNumber].nATK;return;}}//玩家二if (Y <= tanke_two.g_stcTank.pos.Y + 2 && Y >= tanke_two.g_stcTank.pos.Y - 2 && X <= tanke_two.g_stcTank.pos.X + 2 && X >= tanke_two.g_stcTank.pos.X - 2){if (g_stcBullet[nNumber].nCampiDentify != tanke_two.g_stcTank.nTanksiDentify){tanke_two.g_stcTank.nHP -= g_stcBullet[nNumber].nATK;return;}}//敌方所有坦克for (int i = 0; i < 3; i++){if (Y <= tanke_enemy[i].g_stcTank.pos.Y + 2 && Y >= tanke_enemy[i].g_stcTank.pos.Y - 2 &&X <= tanke_enemy[i].g_stcTank.pos.X + 2 && X >= tanke_enemy[i].g_stcTank.pos.X - 2){if (g_stcBullet[nNumber].nCampiDentify != tanke_enemy[i].g_stcTank.nTanksiDentify){tanke_enemy[i].g_stcTank.nHP -= g_stcBullet[nNumber].nATK;//当敌方坦克扣血加分GameScore++;return;}}}
}//子弹失效
int C_BulletClass::BulletOver()
{return nBulletOver;
}
//返回子弹X轴
int C_BulletClass::BulletPosX()
{return nBulletPosX;
}
//返回子弹Y轴
int C_BulletClass::BulletPosY()
{return nBulletPosY;
}

http://www.ppmy.cn/news/706414.html

相关文章

java写的坦克大战

坦克大战&#xff08;Java版本&#xff09; 实现一个java版本的坦克大战游戏 【功能提示】 1. 游戏要有图形用户界面&#xff0c;界面能够反映游戏所有的细节。 2. 界面中要有坦克&#xff0c;墙&#xff0c;树林&#xff0c;河流。 3. 界面中要有一个“家”,“家”被攻击…

Java之详解坦克大战游戏(六)

现在代码已经越写越多了&#xff0c;这里我们又新建一个包com.TankGame4&#xff0c;复制原来的两个java文件&#xff0c;首先我们来实现一个功能&#xff1a;防止敌人的坦克重叠运动。我们把判断是否碰撞的函数写到EnemyTank类中 Members.java //敌人的坦克&#xff0c;把敌…

JS小游戏(坦克大战)

效果图如下&#xff1a; 游戏主界面htmljs代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Tank War</title><style>body{text-align: center;}canvas{background-image…

整整3年了,谁还能“点点点”一辈子?

经常都有人问我软件测试前景怎么样&#xff0c;每年也都帮助很多朋友做职业分析和学习规划&#xff0c;也很欣慰能够通过自己的努力帮到一些人进入到大厂。 2023年软件测试行业的发展现状以及未来的前景趋势 最近很多测试人在找工作的时候&#xff0c;明显的会发现功能测试很…

小而强大:通过容器化应用实现前端微服务

微服务架构是一种软件架构模式&#xff0c;用于构建复杂应用程序。它将一个大型的单体应用程序拆分为一组更小、更独立的服务&#xff0c;每个服务都运行在自己的进程中&#xff0c;并通过轻量级的通信机制进行交互。每个服务都专注于解决特定的业务功能或服务&#xff0c;并且…

黑芝麻智能招股书:三年研发投入16亿,今年出货要破10万片

作者&#xff1a;张祥威编辑&#xff1a;德新 国产大算力芯片赛道的首家上市公司就要来了。 近日&#xff0c;Black Sesame International Holding Limited也就是黑芝麻智能&#xff0c;向港交所递交上市申请材料&#xff0c;计划在港股主板挂牌。 招股书披露&#xff0c;黑芝麻…

当BIM遇上VR。让你体会一把什么是win win~

在座各位对于VR应该不陌生吧?但你可知道&#xff0c;在建筑界混如果不清楚BIMVR&#xff0c;就会在圈子里一脸懵逼。 BIMVR是个什么鬼?先上几张图让大家深深地体会一下! CAD世界中的 管线描述 BIM世界中的管线描述 BIMVR是什么盖世神技? BIM是通过数字信息模拟建筑的真实信息…

李松南:智能全真时代的多媒体技术——关于8K、沉浸式和人工智能的思考

点击上方“LiveVideoStack”关注我们 视觉体验在全真时代显得越发重要&#xff0c;如何提高用户的视觉体验&#xff1f;更好的编码标准带来的低码率高画质、超分等视频处理手段带来的画质提升、三维视频带来深度感知、任意视点视频或者VR360视频带来的用户交互、扩展现实与虚拟…