当前位置:   article > 正文

【C/C++ 10】扫雷小游戏

【C/C++ 10】扫雷小游戏

一、题目

写一个扫雷小游戏,每次输入一个坐标,若该处是地雷,则游戏失败,若该处不是地雷,则显示周围地雷数量,若扫除全部非地雷区域,则扫雷成功。

二、算法

设置两张地图(二维数组)mine和show,一张用于埋雷,一张用于显示当前的排雷情况。

两张地图的大小都比游戏雷场的ROW和COL加了两行两列,方便计算每个点周围的雷数。

mine的数据类型是int,0表示无雷,1表示有雷。

三、代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <iostream>
  3. #include <ctime>
  4. #include <Windows.h>
  5. using namespace std;
  6. #define ROW 5
  7. #define COL 5
  8. #define ROWS (ROW + 2)
  9. #define COLS (COL + 2)
  10. #define BOOM 3
  11. class Game
  12. {
  13. public:
  14. void Init()
  15. {
  16. memset(_mine, 0, sizeof(int) * ROWS * COLS);
  17. memset(_show, '*', ROWS * COLS);
  18. _boom = BOOM;
  19. for (int i = 0; i < ROWS; ++i)
  20. for (int j = 0; j < COLS; ++j)
  21. _mine[i][j] == 0;
  22. // 埋雷
  23. while (_boom)
  24. {
  25. int x = rand() % ROW + 1;
  26. int y = rand() % COL + 1;
  27. if (_mine[x][y] != 1)
  28. {
  29. _mine[x][y] = 1;
  30. --_boom;
  31. }
  32. }
  33. }
  34. void Display()
  35. {
  36. system("cls");
  37. cout << "--------- 扫雷 ---------" << endl << " ";
  38. for (int i = 1; i <= COL; ++i)
  39. printf("%2d ", i);
  40. cout << endl;
  41. for (int i = 1; i <= ROW; ++i)
  42. {
  43. printf("%2d ", i);
  44. for (int j = 1; j <= COL; ++j)
  45. {
  46. cout << ' ' << _show[i][j] << ' ';
  47. }
  48. cout << endl;
  49. }
  50. }
  51. void ShowMines()
  52. {
  53. cout << endl << endl;
  54. cout << "--------- 雷场 ---------" << endl << " ";
  55. for (int i = 1; i <= COL; ++i)
  56. printf("%2d ", i);
  57. cout << endl;
  58. for (int i = 1; i <= ROW; ++i)
  59. {
  60. printf("%2d ", i);
  61. for (int j = 1; j <= COL; ++j)
  62. {
  63. if (_mine[i][j] == 0)
  64. cout << " ";
  65. else
  66. cout << " B ";
  67. }
  68. cout << endl;
  69. }
  70. }
  71. char GetMineCount(int x, int y)
  72. {
  73. return _mine[x - 1][y - 1] + _mine[x][y - 1] + _mine[x + 1][y - 1]
  74. + _mine[x - 1][y + 1] + _mine[x][y + 1] + _mine[x + 1][y + 1]
  75. + _mine[x - 1][y] + _mine[x + 1][y] + '0';
  76. }
  77. void Sweep()
  78. {
  79. int count = ROW * COL - BOOM;
  80. while (count)
  81. {
  82. int x, y;
  83. cout << "请输入扫雷坐标:";
  84. cin >> x >> y;
  85. if (x < 1 || y < 1 || x > ROW || y > COL)
  86. {
  87. cout << "坐标输入不合法,请重新输入" << endl;
  88. continue;
  89. }
  90. if (_mine[x][y] == 1)
  91. {
  92. ShowMines();
  93. cout << endl << "很遗憾, 你踩到地雷了……" << endl;
  94. return;
  95. }
  96. else
  97. {
  98. _show[x][y] = GetMineCount(x, y);
  99. Display();
  100. count--;
  101. }
  102. }
  103. cout << endl << "恭喜你,扫雷成功!" << endl;
  104. ShowMines();
  105. }
  106. private:
  107. int _mine[ROWS][COLS];
  108. char _show[ROWS][COLS];
  109. int _boom;
  110. };
  111. int main()
  112. {
  113. srand((unsigned int)time(nullptr));
  114. Game game;
  115. game.Init();
  116. game.Display();
  117. game.Sweep();
  118. return 0;
  119. }

四、测试

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/90798
推荐阅读
相关标签
  

闽ICP备14008679号