总体思路:
1.随机生成雷区
2.将每一个方块旁边有几个雷的数量算出来
3.不断的输入想要翻的方块
4.判断是否输赢
5.改变此方块的状态
直接上代码:
#include <iostream> #include <ctime> #include <chrono> //计时头文件 #include <string.h>
using namespace std::chrono; //懒得打了 using namespace std;
const int N = 100010;
struct cell //定义方块结构体 { ? ? bool ismine; //是否是雷 ? ? int minenum; //四周有几个雷 ? ? char costume; //显示出来的字符 ? ? bool ischecked; //是否翻过 };
cell minefeild[N][N]; //定义雷区 int gamest = 0; //定义输赢 int n, m; //定义雷区大小 int minesum; //定义雷的数量 int ad[8][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {-1, -1}, {-1, 1}, {1, 1}, {1, -1}}; //定义方向盘,方便找四周的雷
void init() //初始化雷区 { ? ? for (int i = 0; i < N; i ++ ) ? ? ? ? for (int j = 0; j < N; j ++ ) ? ? ? ? ? ? minefeild[i][j] = {false, 0, 'X', false}; }
void generate() //生成雷区 { ? ? int p = 0; ? ? while (p != minesum) //随机放雷 ? ? { ? ? ? ? int x = rand() % n + 1; ? ? ? ? int y = rand() % m + 1; ? ? ? ? if (minefeild[x][y].ismine == false) ? ? ? ? { ? ? ? ? ? ? minefeild[x][y].ismine = true; ? ? ? ? ? ? minefeild[x][y].minenum = 0; ? ? ? ? ? ? minefeild[x][y].costume = '*'; ? ? ? ? ? ? p ++ ; ? ? ? ? } ? ? } ? ?? ? ? for (int i = 1; i <= n; i ++ ) //计算四周雷的数量 ? ? { ? ? ? ? for (int j = 1; j <= m; j ++ ) ? ? ? ? { ? ? ? ? ? ? for (int k = 0; k < 8; k ++ ) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? if (minefeild[i + ad[k][0]][j + ad[k][1]].ismine) ? ? ? ? ? ? ? ? ? ? minefeild[i][j].minenum ++ ; ? ? ? ? ? ? } ? ? ? ? } ? ? } }
void print() //打印游戏进行时的雷区 { ? ? for (int i = 1; i <= n; i ++ ) ? ? { ? ? ? ? for (int j = 1; j <= m; j ++ ) ? ? ? ? { ? ? ? ? ? ? if (minefeild[i][j].ischecked == false) cout << 'X'; ? ? ? ? ? ? else if (minefeild[i][j].ismine) cout << '*'; ? ? ? ? ? ? else if (minefeild[i][j].minenum == 0) cout << 'O'; ? ? ? ? ? ? else cout << minefeild[i][j].minenum; ? ? ? ? } ? ? ? ? cout << endl; ? ? } }
void showanswer() //显示答案 { ? ? for (int i = 1; i <= n; i ++ ) ? ? { ? ? ? ? for (int j = 1; j <= m; j ++ ) ? ? ? ? { ? ? ? ? ? ? if (minefeild[i][j].ismine) cout << '*'; ? ? ? ? ? ? else if (minefeild[i][j].minenum == 0) cout << 'O'; ? ? ? ? ? ? else cout << minefeild[i][j].minenum; ? ? ? ? } ? ? ? ? cout << endl; ? ? } }
void checkcell(int x, int y) //翻这个方块 { ? ? minefeild[x][y].ischecked = true; ? ? if (minefeild[x][y].ismine == false) ? ? ? ? minefeild[x][y].costume = char('0' + minefeild[x][y].minenum); }
bool checkwin() //查看是否赢了 { ? ? int a = 0; ? ? for (int i = 1; i <= n; i ++ ) ? ? ? ? for (int j = 1; j <= m; j ++ ) ? ? ? ? ? ? if (minefeild[i][j].ischecked) a ++ ; ? ? return a == n * m - minesum; }
bool checklose(int x, int y) //查看是否翻到了雷 { ? ? return minefeild[x][y].ismine; }
int main() { ? ? srand(time(0)); //初始化随机种子 ? ? init(); ? ?? ????//输入雷区参数???? ? ? cout << "Welcome to C++ minesweeper!" << endl; ? ? cout << "Enter the size of the minefeild! (n m)" << endl; ? ? cin >> n >> m; ? ? while (1) ? ? { ? ? ? ? if (n > 1 || m > 1) break; ? ? ? ? else ? ? ? ? { ? ? ? ? ? ? cout << "n or m is too small, please input again!" << endl; ? ? ? ? ? ? cin >> n >> m; ? ? ? ? } ? ? } ? ? cout << "Enter the number of mines in the minefeild! (< n * m)" << endl; ? ? cin >> minesum; ? ? while (minesum >= n * m || minesum <= 0) ? ? { ? ? ? ? if (minesum >= n * m) ? ? ? ? ? ? cout << "Too many mines, enter again!" << endl; ? ? ? ? else if (minesum <= 0) ? ? ? ? ? ? cout << "Number of mines can't be less than 1!" << endl; ? ? ? ? cin >> minesum; ? ? } ? ??
? ? //生成雷区 ? ? generate(); ? ? print(); ? ? auto start = steady_clock::now(); //初始化计时器 ? ??
? ? //不断输入和判断现在要翻到方块 ? ? while (1) ? ? { ? ? ? ? int x, y; ? ? ? ? cin >> x >> y; ? ? ? ? checkcell(x, y); ? ? ? ? print(); ? ? ? ? if (checklose(x, y)) ? ? ? ? { ? ? ? ? ? ? gamest = 2; ? ? ? ? ? ? break; ? ? ? ? } ? ? ? ? if (checkwin()) ? ? ? ? { ? ? ? ? ? ? gamest = 1; ? ? ? ? ? ? break; ? ? ? ? } ? ? } ? ??
? ? //输出结果 ? ? if (gamest == 1) cout << "YOU WIN" << endl; ? ? else if (gamest == 2) cout << "YOU LOSE" << endl; ? ?? ? ? auto end = steady_clock::now(); ? ? auto t = duration_cast<seconds>(end - start); ? ? cout << "You used " << t.count() << "sec to finsh." << endl; ? ?? ? ? showanswer(); ? ?? ? ? return 0; }
为了让萌新能看懂,代码长了一点,巨老勿喷!
关注加三连?
|