#include<iostream>
#include"MyHead.h"
using namespace std;
//设置窗口的标题
void setWindows(){
system("title 扫雷");
system("mode con: cols=98 lines=25");
}
//重置窗口
void ReturnWindows(){
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT rc = { 0, 0, 98, 25 };
SetConsoleWindowInfo(hOut, true, &rc);
}
//设置颜色
void Color(int n){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n);
}
//申请地图
void GetMap(int ***pMap, int mapHeight, int mapWidth){
*pMap = (int **)malloc(sizeof(int *)*mapHeight);
if (*pMap == NULL){
return;
}
for (int i = 0; i < mapHeight; i++){
*(*pMap + i) = (int*)malloc(sizeof(int)*mapWidth);
if (*(*pMap + i) == NULL){
return;
}
for (int j = 0; j < mapWidth; j++){
if (i == 0 || j == 0 || i == mapHeight - 1 || j == mapWidth - 1){
*(*(*pMap + i) + j) = -10;
continue;
}
*(*(*pMap + i) + j) = 10;
}
}
}
//获取地图标记
void GetFlag(int ***pFlag, int mapHeight, int mapWidth){
*pFlag = (int **)malloc(sizeof(int *)*mapHeight);
if (*pFlag == NULL){
return;
}
for (int i = 0; i < mapWidth; i++){
*(*pFlag + i) = (int*)malloc(sizeof(int)*mapWidth);
if (*(*pFlag + i) == NULL){
return;
}
for (int j = 0; j < mapWidth; j++){
*(*(*pFlag + i) + j) = 1;
}
}
}
//绘制地图
void PrintMap(int ***pMap, int mapHeight, int mapWidth){
if (pMap == NULL){
return;
}
/*for (int i = 0; i < mapHeight; i++){
for (int j = 0; j < mapWidth; j++){
cout << *(*(*pMap + i) + j) << " ";
}
cout << endl;
}
cout << endl;*/
for (int i = 0; i < mapHeight; i++){
for (int j = 0; j < mapWidth; j++){
switch (*(*(*pMap + i) + j)){
Color(15);
case 0:
cout << " ";//空地
break;
case 10:
cout << "■"; //初始地图值;
break;
case -10:
Color(14);
cout << "■"; //地图边框值;
Color(15);
break;
case 20:
cout << "■"; //隐式雷;
break;
case 30:
Color(4);
cout << "★"; //显式雷;
Color(15);
break;
case 40:
Color(5);
cout << "☆"; //标记雷(true);
Color(7);
break;
case 50:
Color(5);
cout << "☆"; //标记雷I(false);
Color(15);
break;
default:
{
switch (*(*(*pMap + i) + j)){
case 1:
cout << "①";
break;
case 2:
cout << "②";
break;
case 3:
cout << "③";
break;
case 4:
cout << "④";
break;
case 5:
cout << "⑤";
break;
case 6:
cout << "⑥";
break;
case 7:
cout << "⑦";
break;
case 8:
cout << "⑧";
break;
}
}
break;
}
}
cout << endl;
}
}
//获取雷的数量
int GetCurrentBoomCount(int ***pMap, int begin_x, int begin_y, int mapHeight, int mapWidth){
int currentBoomCount = 0;
for (int i = 0; i < 8; i++){
if ((begin_x + Go_x[i]) >= mapHeight - 1 || (begin_y + Go_y[i]) >= mapWidth - 1 || (begin_x + Go_x[i]) < 1 || (begin_y + Go_y[i]) < 1){
continue;
}
if (*(*(*pMap + (begin_x + Go_x[i])) + (begin_y + Go_y[i])) == 20){
currentBoomCount++;
}
}
return currentBoomCount;
}
//运行游戏
void RunGame(int ***pMap, int ***pFlag, int begin_x, int begin_y, int mapHeight, int mapWidth){
int currentBoomCount = GetCurrentBoomCount(pMap, begin_x, begin_y, mapHeight, mapWidth);
if (currentBoomCount == 0){
*(*(*pMap + begin_x) + begin_y) = 0;
*(*(*pFlag + begin_x) + begin_y) = 0;
for (int i = 0; i < 8; i++){
if ((begin_x + Go_x[i]) >= mapHeight - 1 || (begin_y + Go_y[i]) >= mapWidth - 1 || (begin_x + Go_x[i]) < 1 || (begin_y + Go_y[i]) < 1){
continue;
}
if (*(*(*pFlag + (begin_x + Go_x[i])) + (begin_y + Go_y[i])) == 1){
RunGame(pMap, pFlag, begin_x + Go_x[i], begin_y + Go_y[i], mapHeight, mapWidth);
}
}
}
else{
*(*(*pFlag + begin_x) + begin_y) = 0;
*(*(*pMap + begin_x) + begin_y) = currentBoomCount;
}
}
//开始游戏
int BeginGame(int ***pMap, int ***pFlag, int begin_x, int begin_y, int mapHeight, int mapWidth, int flag){
if (flag == 0){
if (pMap == NULL){
return -1;
}
if (begin_x >= mapHeight - 1 || begin_y >= mapWidth - 1 || begin_x < 1 || begin_y < 1){
return -2;
}
if (*(*(*pMap + begin_x) + begin_y) == 20){
for (int i = 0; i < mapHeight; i++){
for (int j = 0; j < mapWidth; j++){
if (*(*(*pMap + i) + j) == 20){
*(*(*pMap + i) + j) = 30;
}
}
}
system("CLS");
PrintMap(pMap, mapHeight, mapWidth);
return -3;
}
else if (*(*(*pMap + begin_x) + begin_y) == 10){
RunGame(pMap, pFlag, begin_x, begin_y, mapHeight, mapWidth);
}
else{
return -2;
}
}
else{
if (pMap == NULL){
return -1;
}
if (begin_x >= mapHeight - 1 || begin_y >= mapWidth - 1 || begin_x < 1 || begin_y < 1){
return -2;
}
if (*(*(*pMap + begin_x) + begin_y) == 20){
getBoom++;
system("CLS");
*(*(*pMap + begin_x) + begin_y) = 40;
PrintMap(pMap, mapHeight, mapWidth);
}
else if ((*(*(*pMap + begin_x) + begin_y) == 40)){
getBoom--;
system("CLS");
*(*(*pMap + begin_x) + begin_y) = 20;
PrintMap(pMap, mapHeight, mapWidth);
}
else if ((*(*(*pMap + begin_x) + begin_y) == 50)){
system("CLS");
*(*(*pMap + begin_x) + begin_y) = 10;
PrintMap(pMap, mapHeight, mapWidth);
trueBoom--;
}
else{
if (*(*(*pFlag + begin_x) + begin_y) == 1){
system("CLS");
*(*(*pMap + begin_x) + begin_y) = 50;
PrintMap(pMap, mapHeight, mapWidth);
trueBoom++;
}
else{
return -2;
}
}
}
return 0;
}
//设置雷在地图上
void SetBoom(int ***pMap, int mapHeight, int mapWidth, int boomCount){
if (pMap == NULL){
return;
}
for (int i = 1; i < mapHeight - 1; i++){
for (int j = 1; j < mapWidth - 1; j++){
boomCount--;
*(*(*pMap + i) + j) = 20;
if (boomCount == 0){
goto flag;
}
}
}
flag:;
}
//重新排布雷
void SwapBoom(int ***pMap, int mapHeight, int mapWidth){
if (pMap == NULL){
return;
}
srand((unsigned)time(NULL));
for (int i = 1; i < mapHeight - 1; i++){
for (int j = 1; j < mapWidth - 1; j++){
int ra = 50;
while (ra--){
int x = rand() % (mapHeight - 2) + 1;
int y = rand() % (mapWidth - 2) + 1;
if ((*(*(*pMap + i) + j)) != (*(*(*pMap + x) + y))){
*(*(*pMap + i) + j) = (*(*(*pMap + i) + j)) ^ (*(*(*pMap + x) + y));
*(*(*pMap + x) + y) = (*(*(*pMap + i) + j)) ^ (*(*(*pMap + x) + y));
*(*(*pMap + i) + j) = (*(*(*pMap + i) + j)) ^ (*(*(*pMap + x) + y));
}
}
}
}
}
//释放地图
void FreeMap(int ***pMap, int mapHeight){
if (pMap == NULL){
return;
}
for (int i = 0; i < mapHeight; i++){
if (*(*pMap + i) != NULL){
free(*(*pMap + i));
*(*pMap + i) = NULL;
}
}
if (*pMap != NULL){
free(*pMap);
*pMap = NULL;
}
}
//登录界面
bool LoginWin(){
char username[150];
char password[150];
cout << endl << endl << endl << endl;
Color(12);
cout << "\t\t\t\t\t" << "-------------------" << endl;
cout << "\t\t\t\t\t" << " 欢迎登录 " << endl;
cout << "\t\t\t\t\t" << "-------------------" << endl;
cout << "\t\t\t\tUserName:";
Color(11);
cin >> username;
Color(12);
cout << "\t\t\t\tPassWord:";
Color(11);
cin >> password;
Color(12);
cout << endl << endl;;
if (strcmp(username, "root") == 0 && strcmp(password, "root") == 0){
cout << "__________________________________________________________________________________________________" << endl;
cout << endl;
Color(11);
cout << "\t...登录成功..." << endl;
Color(12);
cout << "__________________________________________________________________________________________________" << endl;
return true;
}
else{
cout << "__________________________________________________________________________________________________" << endl;
cout << endl;
Color(11);
cout << "\t...登录失败..." << endl;
Color(12);
cout << "__________________________________________________________________________________________________" << endl;
return false;
}
Color(7);
system("pause");
}
//登录成功
void LoginSuc(){
Color(10);
cout << endl;
cout << "\t\t\t\t\t" << " 登录成功" << endl;
cout << "玩法详情:" << endl;
cout << "\t① " << "首先输入地图的长(mapHeight)、高(mapWidth)、埋雷的数量(boomCount)。" << endl;
cout << "\t② " << "然后输入一个坐标point(x,y)、紧接着输入处理类型(Flag)。" << endl;
cout<<"\t 如:1-->标雷。2-->挖雷" << endl;
cout << "\t③ " << "当踩到雷的时候则其余的雷全部爆炸、游戏失败。" << endl;
cout << "\t④ " << "当正确标注所有雷之后、游戏结束、玩家胜利。" << endl;
cout << "\t⑤ " << "注意 所有的坐标point(x,y)";
Color(12);
cout<<"[ 0<x<mapHeight-1 || 0<y<mapWidth-1]" << endl;
Color(10);
cout << endl;
}
//函数入口
int main(){
int flag;
bool fg;
int **pMap = NULL;
int **pFlag = NULL;
int mapHeight, mapWidth, boomCount, begin_x, begin_y;
setWindows();
fg = LoginWin();
if (fg){
system("pause");
system("CLS");
LoginSuc();
system("pause");
system("CLS");
cout << "Enter MapHeight、MapWidth、BoomCount:";
cin >> mapHeight >> mapWidth >> boomCount;
GetMap(&pMap, mapHeight, mapWidth);
GetFlag(&pFlag, mapHeight, mapWidth);
if (pMap == NULL || pFlag == NULL){
cout << "...Loading Map Error..." << endl;
return 0;
}
SetBoom(&pMap, mapHeight, mapWidth, boomCount);
SwapBoom(&pMap, mapHeight, mapWidth);
system("CLS");
while (true){
if (getBoom == boomCount && trueBoom == 0){
MessageBox(NULL, TEXT("恭喜你、全部猜中啦"), TEXT("SYSTEM"), MB_ICONINFORMATION | MB_OK);
cout << "...You Win..." << endl;
return 0;
}
PrintMap(&pMap, mapHeight, mapWidth);
cout << "Enter Point(x,y):";
cin >> begin_x >> begin_y;
cout << "Enter Flag(0 or 1):";
cin >> flag;
int ret = BeginGame(&pMap, &pFlag, begin_x, begin_y, mapHeight, mapWidth, flag);
if (ret == -1){
cout << "...Loading Map Error..." << endl;
break;
}
else if (ret == -2){
cout << "Enter Point(x,y):";
}
else if (ret == -3){
MessageBox(NULL, TEXT("很遗憾、踩中雷啦"), TEXT("SYSTEM"), MB_ICONSTOP | MB_OK);
cout << "...Game Over..." << endl;
break;
}
else{
}
system("CLS");
}
FreeMap(&pMap, mapHeight);
FreeMap(&pFlag, mapHeight);
}
else{
ReturnWindows();
return 0;
}
return 0;
}
/*
MyHead.h
#ifndef MYHEAD_H
#define MYHEAD_H
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iomanip>
#include<conio.h>
#include<ctime>
#include<Windows.h>
int getBoom = 0;
int trueBoom = 0;
int Go_x[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int Go_y[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
//设置窗口的标题
void setWindows();
//重置窗口
void ReturnWindows();
//设置颜色
void Color(int n);
//登录界面
bool LoginWin();
//登录成功
void LoginSuc();
//申请地图
void GetMap(int ***pMap, int mapHeight, int mapWidth);
//获取地图标记
void GetFlag(int ***pFlag, int mapHeight, int mapWidth);
//绘制地图
void PrintMap(int ***pMap, int mapHeight, int mapWidth);
//设置雷在地图上
void SetBoom(int ***pMap, int mapHeight, int mapWidth, int boomCount);
//重新排布雷
void SwapBoom(int ***pMap, int mapHeight, int mapWidth);
//获取雷的数量
int GetCurrentBoomCount(int ***pMap, int begin_x, int begin_y, int mapHeight, int mapWidth);
//开始游戏
int BeginGame(int ***pMap, int ***pFlag, int begin_x, int begin_y, int mapHeight, int mapWidth, int flag);
//运行游戏
void RunGame(int ***pMap, int ***pFlag, int begin_x, int begin_y, int mapHeight, int mapWidth);
//释放地图
void FreeMap(int ***pMap, int mapHeight);
#endif
*/