#include <iostream> #include <cstdio> #include <cstring> #include <windows.h> #include <conio.h> #include <stdlib.h> #include <ctime> using namespace std; class Button { public: int startX, endX; int startY, endY; }; int width, height; int numTarget; int numHasWent; Button startGame, quit; char a[101][101]; bool s[101][101]; int way[101][3]; int dx[] = {0, 0, 1, -1, 1, 1, -1, -1}; int dy[] = {1, -1, 0, 0, -1, 1, -1, 1}; void init(); void start(); void procedure(); void bfs(int,int); void die(); void color(int); int suiJi(); int numTargetAround(int,int); COORD mousePosition(); bool hasClicked(); int main(int argc, char *argv[]) { SetConsoleTitle("扫雷"); init(); procedure(); return 0; } void init() { startGame.startX = 1; startGame.endX = 8; startGame.startY = startGame.endY = 2; quit.startX = 10; quit.endX = 13; quit.startY = quit.endY = 2; start(); cout << "请输入雷阵行数:"; cin >> height; cout << "请输入雷阵列数:"; cin >> width; if (height < 3) height = 3; if (height > 20) height = 20; if (width < 3) width = 3; if (width > 20) width = 20; memset(s, false, sizeof(s)); memset(a, 0, sizeof(a)); numHasWent = 0; numTarget = height*width/4; srand(time(0)); for (int i=1; i<=numTarget; i++) { int targetX = rand()%height+1; int targetY = rand()%width+1; a[targetX][targetY] = '*'; } numTarget = 0; for (int i=1; i<=height; i++) { for (int j=1; j<=width; j++) { if (a[i][j] == '*') { numTarget++; } } } for (int i=1; i<=height; i++) { for (int j=1; j<=width; j++) { if (a[i][j] != '*') { a[i][j] = numTargetAround(i, j)+48; } } } quit.startX = 1; quit.endX = 4; quit.startY = height+2; quit.endY = height+2; cout << "按任意键开始......"; getch(); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0, 0}); cout << " " << endl; cout << " " << endl; cout << " " << endl; cout << " " << endl; cout << " " << endl; cout << " " << endl; cout << " " << endl; cout << " " << endl; } void start() { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0,0}); cout << "# 控制台扫雷 #" << endl; cout << "#--------------#" << endl; cout << "#开始游戏|退出|#" << endl; cout << "#--------------#" << endl; while (1) { if (hasClicked()) { COORD pos = mousePosition(); if (pos.X>=startGame.startX and pos.X<=startGame.endX and pos.Y>=startGame.startY and pos.Y<=startGame.endY) { break; }else if (pos.X>=quit.startX and pos.X<=quit.endX and pos.Y>=quit.startY and pos.Y<=quit.endY) { exit(0); } } } } void procedure() { while (numHasWent+numTarget < height*width) { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0, 0}); for (int i=0; i<=height+1; i++) { for (int j=0; j<=width+1; j++) { if (i>=1 && i<=height && j>=1 && j<=width) { if (s[i][j] == false) { color(9); cout << '#'; }else{ color(10); if (a[i][j] != '0') cout << a[i][j]; else cout << ' '; } }else{ color(15); cout << '#'; } } cout << endl; } color(7); cout << "|退出|" << endl; cout << "------" << endl; bool clicked = false; while (!clicked) { if (hasClicked()) { COORD pos = mousePosition(); if (pos.X>=quit.startX and pos.X<=quit.endX and pos.Y>=quit.startY and pos.Y<=quit.endY) { return; }else{ if (pos.Y>=1 and pos.Y<=height and pos.X>=1 and pos.X<=width) { if (s[pos.Y][pos.X] == false) { if (a[pos.Y][pos.X] == '*') { die(); return; }else{ numHasWent++; s[pos.Y][pos.X] = true; bfs(pos.Y, pos.X); } } } } clicked = true; } } } SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0,0}); for (int i=0; i<=height+1; i++) { for (int j=0; j<=width+1; j++) { if (i>=1 and i<=height and j>=1 and j<=width) { if (s[i][j] == false) { color(9); cout << '#'; }else{ color(10); if (a[i][j] != '0') cout << a[i][j]; else cout << ' '; } }else{ color(15); cout << '#'; } } cout << endl; } color(7); cout << " " << endl << " " << endl; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0, height+2}); cout << "你赢了!" << endl; cout << "按任意键退出......"; getch(); } void bfs(int x, int y) { int head = 0, tail = 1; memset(way, 0, sizeof(way)); way[1][0] = x; way[1][1] = y; while (head < tail) { head++; for (int i=0; i<4; i++) { int xx = way[head][0]+dx[i]; int yy = way[head][1]+dy[i]; if (xx>=1 && xx<=height && yy>=1 && yy<=width && !s[xx][yy] && a[xx][yy]!='*' && way[head][2]<height/2) { s[xx][yy] = true; numHasWent++; tail++; way[tail][0] = xx; way[tail][1] = yy; way[tail][2] = way[head][2]+1; } } } } void die() { SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0, 0}); for (int i=0; i<=height+1; i++) { for (int j=0; j<=width+1; j++) { cout << ' '; } } cout << " " << endl; cout << " " << endl; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), (COORD){0, 0}); for (int i=0; i<=height+1; i++) { for (int j=0; j<=width+1; j++) { if (i>=1 and i<=height and j>=1 and j<=width) { if (a[i][j] == '*') { color(12); cout << a[i][j]; }else{ if (s[i][j] == false) { color(9); cout << '#'; }else{ color(10); if (a[i][j] != '0') cout << a[i][j]; else cout << ' '; } } }else{ color(15); cout << '#'; } } cout << endl; } color(7); cout << "你over了!" << endl; cout << "按任意键退出......"; getch(); cout << endl; } void color(int a) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a); } int suiJi() { srand(time(0)); return rand(); } int numTargetAround(int x, int y) { int ans = 0; for (int i=0; i<8; i++) { int xx = x+dx[i], yy = y+dy[i]; if (xx>=1 && xx<=height && yy>=1 && yy<=width) { if (a[xx][yy] == '*') { ans++; } } } return ans; } COORD mousePosition() { HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); DWORD res; INPUT_RECORD inRec; ReadConsoleInput(hIn, &inRec, 1, &res); if (inRec.EventType == MOUSE_EVENT) { return inRec.Event.MouseEvent.dwMousePosition; } return (COORD){-1, -1}; } bool hasClicked() { HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); DWORD res; INPUT_RECORD inRec; ReadConsoleInput(hIn, &inRec, 1, &res); if (inRec.EventType == MOUSE_EVENT) { if (inRec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) { return true; } return false; } return false; }