《扫雷》是一款大众类的益智小游戏,于1992年发行。游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输,直到如今,也是一款解压的小游戏。它不仅有意思,而且占用内存还小,只可惜在win10扫雷就不自带了,但是它仍然活跃在大学生身边。今天我们就来复现一下扫雷。
首先要明确扫雷程序的组成:
目录
主菜单menu();
展示游戏面DisplayDesk();
显示雷面DisplayMine();
布雷assignmine();
揭开put();
主菜单menu();
玩游戏一定需要游戏菜单,对于控制台的扫雷我选择的是这样:
———————扫雷———————
————————————————
—————1.开始游戏——————
—————2.退出游戏——————
————————————————
———————扫雷———————
请选择:
代码:
void menu() {
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " —————1.开始游戏——————" << endl;
cout << " —————2.退出游戏——————" << endl;
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " 请选择:";
}
在这之前我加入了一定数量的" "将菜单置于屏幕中间
对于如何快速计算出中心位置可以看如下操作:
tip:宽度就是对应的可以显示的每一行的位数,一个英语字符为一位,一个中文字符为2位
显示游戏桌面DisplayDesk();
定义游戏桌面ShowDesk[10][10]={ {'','','','','','','','','',''},{'','','','','','','','','',''}, {'','','','','','','','','',''}, {'','','','','','','','','',''}, {'','','','','','','','','',''}, {'','','','','','','','','',''}, {'','','','','','','','','',''}, {'','','','','','','','','',''}, {'','','','','','','','','',''} };
双循环显示:
void DisplayDesk() {
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " 1 2 3 4 5 6 7 8 9" << endl;
for (int i = 0; i < 9; i++) {
cout << " " << i + 1 << " ";
for (int j = 0; j < 9; j++)
cout << " " << ShowDesk[i][j] << " ";
cout << " " << i + 1;
cout << endl;
}
cout << " 1 2 3 4 5 6 7 8 9" << endl;
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " 输入坐标(x y):";
}
效果图:
布雷assginmine();
布雷要得到一个真随机数。rand()产生的仅仅是假随机数,为了产生真随机数需要用到time.h头文件,代码:
int Desk[11][11]
void assignmine() {
srand((unsigned int)time(NULL));
for (int i = 0; i < 10;) {
int x = rand() % 9+1;
int y = rand() % 9+1;
if (Desk[x][y] == 0) {
Desk[x][y] = 1;
i++;
}
}
}
显示雷面DisplayMine();
和显示游戏桌面一样没什么特别的变化,直接上代码:
void DisplayMine() {
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " 1 2 3 4 5 6 7 8 9" << endl;
for (int i = 1; i < 10; i++) {
cout << " " << i <<" ";
for (int j = 1; j < 10; j++)
cout << " "<<Desk[i][j]<<" ";
cout << " " << i;
cout << endl;
}
cout << " 1 2 3 4 5 6 7 8 9" << endl;
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
}
效果图:
揭开put();
揭开对应的数字产生要计算该位置附近的雷的数量,为了不进行分类讨论,所以对于99的游戏来说,放置雷的数组定义为1111。计算完之后,将对应的ShowDesk数组的位置替换为对应数字,并进行判断游戏是否结束。
代码:
void put() {
int x, y,flag=1;
while (coun[0] > 0) {
cin >> x >> y;
if (Desk[x][y] == 1) {
cout << " Game Over!" << endl;
flag = 0;
break;
}
ShowDesk[x-1][y-1] = Desk[x - 1][y - 1] + Desk[x - 1][y] + Desk[x - 1][y + 1] + Desk[x][y - 1] + Desk[x][y + 1] + Desk[x + 1][y - 1] + Desk[x + 1][y] + Desk[x + 1][y + 1]+'0';
system("cls");
DisplayDesk();
coun[0]--;
}
if (flag)
cout << " 恭喜通过!"<<endl;
}
完整代码+优化
#include<time.h>
#include<iostream>
using namespace std;
int Desk[11][11] = { 0 }, flag[9][9] = { 0 }, mine[1] = { 10 }, coun[1] = { 71 };
char ShowDesk[10][10] = { {'*','*','*','*','*','*','*','*','*','*'},{'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, {'*','*','*','*','*','*','*','*','*','*'}, };
void menu();
void DisplayMine();
void DisplayDesk();
void assignmine();
void put();
void menu() {
int m;
//空白有44个,内容占用了32个位置,一共120个位
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " —————1.开始游戏——————" << endl;
cout << " —————2.退出游戏——————" << endl;
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " 请选择:";
cin >> m;
if (m == 1) {
system("cls");
assignmine();
DisplayDesk();
put();
DisplayMine();
}
}
void DisplayMine() {
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " 1 2 3 4 5 6 7 8 9" << endl;
//cout << " %d|"<<1;//46空白格
for (int i = 1; i < 10; i++) {
cout << " " << i <<" ";
for (int j = 1; j < 10; j++)
cout << " "<<Desk[i][j]<<" ";
cout << " " << i;
cout << endl;
}
cout << " 1 2 3 4 5 6 7 8 9" << endl;
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
}
void DisplayDesk() {
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " 1 2 3 4 5 6 7 8 9" << endl;
for (int i = 0; i < 9; i++) {
cout << " " << i + 1 << " ";
for (int j = 0; j < 9; j++)
cout << " " << ShowDesk[i][j] << " ";
cout << " " << i + 1;
cout << endl;
}
cout << " 1 2 3 4 5 6 7 8 9" << endl;
cout << " ————————————————" << endl;
cout << " ———————扫雷———————" << endl;
cout << " ————————————————" << endl;
cout << " 输入坐标(x y):";
}
void assignmine() {
srand((unsigned int)time(NULL));
for (int i = 0; i < 10;) {
int x = rand() % 9+1;
int y = rand() % 9+1;
if (Desk[x][y] == 0) {
Desk[x][y] = 1;
i++;
}
}
}
void put() {
int x, y,flag=1;
while (coun[0] > 0) {
cin >> x >> y;
if (Desk[x][y] == 1) {
cout << " Game Over!" << endl;
flag = 0;
break;
}
ShowDesk[x-1][y-1] = Desk[x - 1][y - 1] + Desk[x - 1][y] + Desk[x - 1][y + 1] + Desk[x][y - 1] + Desk[x][y + 1] + Desk[x + 1][y - 1] + Desk[x + 1][y] + Desk[x + 1][y + 1]+'0';
system("cls");
DisplayDesk();
coun[0]--;
}
if (flag)
cout << " 恭喜通过!"<<endl;
}
int main() {
menu();
return 0;
}
tip:system("cls");清除控制台的内容
标签:10,1.0,cout,int,void,扫雷,DisplayMine,控制台,游戏 From: https://blog.51cto.com/u_16256111/8789958