| 主要分类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();
//游戏分数的UI
void 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:防BUG
else
{
//初始化生成敌方坦克一
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);
//分数UI
GameScoreUI();
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);
//分数UI
GameScoreUI();
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);
//分数UI
GameScoreUI();
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 ()
{
//如果血量小于等于100
if (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);
//当所有子弹打到家返回0
int 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] == 坦克)
{
//子弹失效jjj
g_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默认1
nBulletOver = 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
{
//防止bug
Dynamic_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);
//返回调用函数废弃
}/*else
if (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;
}else
if (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);
}/*else
if (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;
}else
if (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);
}/*else
if (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;
}else
if (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);
}/*else
if (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;
}else
if (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;
}