服务器之家

服务器之家 > 正文

C++实现简单五子棋游戏

时间:2021-09-07 14:04     来源/作者:adorable_

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

规则

(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)黑方的第一枚棋子可下在棋盘任意交叉点上。
(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)

五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

实现方案

通过缩小棋盘来抑制五子棋先行的优势,在这里使用15路棋盘。

(1)提供3个选择模式

C++实现简单五子棋游戏

(2)输入坐标(注意横纵坐标之间需要空格)

C++实现简单五子棋游戏

(3)输入非法坐标

C++实现简单五子棋游戏

(4)判断输赢

  • 判断行是否满足条件
  • 判断列是否满足条件
  • 判断主对角线是否满足条件
  • 判断副对角线是否满足条件

C++实现简单五子棋游戏

之后可选择yes再来一局,也可以选择no退出游戏。

源代码如下:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2.  
  3. #include <iostream>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <time.h>
  7. #include <string.h>
  8.  
  9. using namespace std;
  10.  
  11. const int N = 15; //15*15的棋盘
  12. const char ChessBoard = ' '; //棋盘标志
  13. const char flag1 = 'o'; //玩家1或电脑标志
  14. const char flag2 = 'x'; //玩家2标志
  15.  
  16. typedef struct Position{ //坐标
  17. int row; //行
  18. int col; //列
  19. }Position;
  20.  
  21. class GoBang{ //五子棋类
  22. public:
  23. GoBang(){
  24. InitChessBoard(); //初始化棋盘
  25. }
  26. void Play(){ //下棋
  27. Position Play1; //玩家1或电脑
  28. Position Play2; //玩家2
  29. while (1){
  30. int mode = ChoiceMode();
  31. while (1){
  32. if (mode == 1){ //电脑VS玩家
  33. ComputerChess(Play1, flag1); //电脑走
  34. if (GetVictory(Play1, 0, flag1)){ //0代表电脑,为真则表示电脑获胜
  35. break;
  36. }
  37. PlayChess(Play2, 2, flag2); //玩家2走
  38. if (GetVictory(Play2, 2, flag2)){ //2代表玩家2
  39. break;
  40. }
  41. }
  42. else{ //玩家1VS玩家2
  43. PlayChess(Play1, 1, flag1); //玩家1走
  44. if (GetVictory(Play1, 1, flag1)){ //玩家1赢
  45. break;
  46. }
  47. PlayChess(Play2, 2, flag2); //玩家2走
  48. if (GetVictory(Play2, 2, flag2)){ //玩家2赢
  49. break;
  50. }
  51. }
  52. }
  53. cout << "======再来一局=======" << endl;
  54. cout << "yes or no :";
  55. char s[] = "yes";
  56. cin >> s;
  57. if (strcmp(s, "no") == 0){
  58. break;
  59. }
  60. }
  61. }
  62.  
  63. protected:
  64. void InitChessBoard(){ //初始化棋盘
  65. for (int i = 0; i < N + 1; ++i){
  66. for (int j = 0; j < N + 1; ++j){
  67. _ChessBoard[i][j] = ChessBoard;
  68. }
  69. }
  70. }
  71.  
  72. int ChoiceMode(){ //选择模式
  73. system("cls");
  74. //系统调用,清屏
  75. InitChessBoard(); //重新初始化棋盘
  76. cout << "*************************************************" << endl;
  77. cout << "******************0、退出************************" << endl;
  78. cout << "******************1、电脑VS玩家******************" << endl;
  79. cout << "******************2、玩家VS玩家******************" << endl;
  80. cout << "*************************************************" << endl;
  81. while (1){
  82. int i = 0;
  83. cout << "请选择模式:";
  84. cin >> i;
  85. if (i == 0){ //退出
  86. exit(1);
  87. }
  88. if (i == 1 || i == 2){
  89. return i;
  90. }
  91. else{
  92. cout << "非法输入,请重新输入!" << endl;
  93. }
  94. }
  95. }
  96.  
  97. void PrintChessBoard(){ //打印棋盘
  98. printf(" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");
  99. printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
  100. for (int i = 1; i < N + 1; ++i)
  101. {
  102. printf("%2d ", i);
  103. printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n", _ChessBoard[i][1], _ChessBoard[i][2], _ChessBoard[i][3], _ChessBoard[i][4], _ChessBoard[i][5], _ChessBoard[i][6], _ChessBoard[i][7], _ChessBoard[i][8], _ChessBoard[i][9], _ChessBoard[i][10], _ChessBoard[i][11], _ChessBoard[i][12], _ChessBoard[i][13], _ChessBoard[i][14], _ChessBoard[i][15]);
  104. printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
  105. }
  106. cout << endl;
  107. }
  108.  
  109. void ComputerChess(Position& pos, char flag){ //电脑走
  110. //PrintChessBoard(); //打印棋盘
  111. int x = 0;
  112. int y = 0;
  113. while (1){ //循环查找空位置
  114. x = (rand() % N) + 1; //产生从1~N的随机数
  115. srand((unsigned int)time(NULL));
  116. y = (rand() % N) + 1; //产生从1~N的随机数
  117. srand((unsigned int)time(NULL));
  118. if (_ChessBoard[x][y] == ChessBoard){ //如果这个位置为空(没有棋子),跳出循环,下棋
  119. break;
  120. }
  121. }
  122. pos.row = x;
  123. pos.col = y;
  124. _ChessBoard[pos.row][pos.col] = flag;
  125. }
  126.  
  127. void PlayChess(Position& pos, int player, char flag){
  128. PrintChessBoard(); //打印棋盘
  129. while (1){
  130. printf("请玩家%d输入坐标:", player);
  131. cin >> pos.row >> pos.col;
  132. if (JudgeValue(pos) == 1){ //判断坐标是否合法
  133. break;
  134. }
  135. cout << "坐标不合法,请重新输入:" << endl;
  136. }
  137. _ChessBoard[pos.row][pos.col] = flag;
  138. }
  139.  
  140. int JudgeValue(const Position& pos){ //判断坐标的合法性
  141. //1.在棋盘上
  142. if (pos.row > 0 && pos.row <= N && pos.col > 0 && pos.col <= N){
  143. //2.所在位置为空(没有棋子)
  144. if (_ChessBoard[pos.row][pos.col] == ChessBoard){
  145. return 1; //合法
  146. }
  147. }
  148. return 0; //非法
  149. }
  150.  
  151. int JudgeVictory(Position pos, char flag){ //判断是否有玩家获胜(底层判断)
  152. int begin = 0;
  153. int end = 0;
  154.  
  155. //1.判断行是否满足条件
  156. (pos.col - 4) > 0 ? begin = (pos.col - 4) : begin = 1;
  157. (pos.col + 4) > N ? end = N : end = (pos.col + 4);
  158. for (int i = pos.row, j = begin; j + 4 <= end; ++j){
  159. if (_ChessBoard[i][j] == flag && _ChessBoard[i][j + 1] == flag &&
  160. _ChessBoard[i][j + 2] == flag && _ChessBoard[i][j + 3] == flag &&
  161. _ChessBoard[i][j + 4] == flag)
  162. return 1;
  163. }
  164. //2.判断列是否满足条件
  165. (pos.row - 4) > 0 ? begin = (pos.row - 4) : begin = 1;
  166. (pos.row + 4) > N ? end = N : end = (pos.row + 4);
  167. for (int j = pos.col, i = begin ; i + 4 <= end; ++i){
  168. if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j] == flag &&
  169. _ChessBoard[i + 2][j] == flag && _ChessBoard[i + 3][j] == flag &&
  170. _ChessBoard[i + 4][j] == flag)
  171. return 1;
  172. }
  173. //3.判断主对角线是否满足条件
  174. int len = 0; //相对长度
  175. int start = 0;
  176. int finish = 0;
  177. pos.row > pos.col ? len = pos.col - 1 : len = pos.row - 1;
  178. if (len > 4){
  179. len = 4;
  180. }
  181. begin = pos.row - len; //横坐标起始位置
  182. start = pos.col - len; //纵坐标起始位置
  183.  
  184. pos.row > pos.col ? len = N - pos.row : len = N - pos.col;
  185. if (len > 4){
  186. len = 4;
  187. }
  188. end = pos.row + len; //横坐标结束位置
  189. finish = pos.col + len; //纵坐标结束位置
  190.  
  191. for (int i = begin, j = start; (i + 4 <= end) && (j + 4 <= finish); ++i, ++j){
  192. if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j + 1] == flag &&
  193. _ChessBoard[i + 2][j + 2] == flag && _ChessBoard[i + 3][j + 3] == flag &&
  194. _ChessBoard[i + 4][j + 4] == flag)
  195. return 1;
  196. }
  197. //4.判断副对角线是否满足条件
  198. (pos.row - 1) > (N - pos.col) ? len = N - pos.col : len = pos.row - 1;
  199. if (len > 4){
  200. len = 4;
  201. }
  202. begin = pos.row - len; //横坐标起始位置
  203. start = pos.col + len; //纵坐标起始位置
  204.  
  205. (N - pos.row) > (pos.col - 1) ? len = pos.col - 1 : len = N - pos.row;
  206. if (len > 4){
  207. len = 4;
  208. }
  209. end = pos.row + len; //横坐标结束位置
  210. finish = pos.col - len; //纵坐标结束位置
  211. for (int i = begin, j = start; (i + 4 <= end) && (j - 4 >= finish); ++i, --j){
  212. if (_ChessBoard[i][j] == flag && _ChessBoard[i + 1][j - 1] == flag &&
  213. _ChessBoard[i + 2][j - 2] == flag && _ChessBoard[i + 3][j - 3] == flag &&
  214. _ChessBoard[i + 4][j - 4] == flag)
  215. return 1;
  216. }
  217. //该位置并未下棋
  218. for (int x = 1; x < N + 1; ++x){
  219. for (int y = 1; y < N + 1; ++y){
  220. if (_ChessBoard[x][y] == ChessBoard){
  221. return 0; //未下棋
  222. }
  223. }
  224. }
  225. return -1; //和局
  226. }
  227.  
  228. bool GetVictory(Position& pos, int player, char flag){ //判断具体哪位玩家赢
  229. if (JudgeVictory(pos, flag) != 0){ //判断有无人获胜
  230. if (JudgeVictory(pos, flag) == 1){ //判断是否有人获胜,1表示获胜
  231. PrintChessBoard(); //打印棋盘
  232. if (player == 0){
  233. cout << "电脑获胜!" << endl;
  234. }
  235. else{
  236. printf("恭喜玩家%d获胜!\n", player);
  237. }
  238. }
  239. else{
  240. printf("和局!\n");
  241. }
  242. return true; //有人获胜
  243. }
  244. return false; //没人获胜
  245. }
  246.  
  247. private:
  248. char _ChessBoard[N + 1][N + 1]; //棋盘
  249. };
  250.  
  251. int main(){
  252. GoBang g;
  253. g.Play();
  254. system("pause");
  255. return 0;
  256. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

原文链接:https://blog.csdn.net/adorable_/article/details/80295916

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部