欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C/C++_扫雷

程序员文章站 2022-04-23 17:10:55
#include #include"MyHead.h" using namespace std; //设置窗口的标题 void setWindo...
#include
#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="" mapheight="" >>="" mapwidth="" boomcount;="" getmap(&pmap,="" mapheight,="" mapwidth);="" getflag(&pflag,="" if="" (pmap="=" null="" pflag="=" null){="" cout="" <<="" "...loading="" map="" error..."="" endl;="" return="" 0;="" }="" setboom(&pmap,="" mapwidth,="" boomcount);="" swapboom(&pmap,="" system("cls");="" while="" (true){="" (getboom="=" boomcount="" &&="" trueboom="=" 0){="" messagebox(null,="" text("恭喜你、全部猜中啦"),="" text("system"),="" mb_iconinformation="" |="" mb_ok);="" "...you="" win..."="" printmap(&pmap,="" "enter="" point(x,y):";="" cin="" begin_x="" begin_y;="" flag(0="" or="" 1):";="" flag;="" int="" ret="BeginGame(&pMap," &pflag,="" begin_x,="" begin_y,="" flag);="" (ret="=" -1){="" break;="" else="" -2){="" -3){="" text("很遗憾、踩中雷啦"),="" mb_iconstop="" "...game="" over..."="" else{="" freemap(&pmap,="" mapheight);="" freemap(&pflag,="" returnwindows();="" }
#ifndef MYHEAD_H
#define MYHEAD_H
#include
#include
#include
#include
#include
#include
#include


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