当前位置:首页 > 通信资讯 > 正文

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

规则

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

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

实现方案

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

(1)提供3个选择模式

基于c++的五子棋游戏设计与实现(c语言实现五子棋小游戏)

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

基于c++的五子棋游戏设计与实现(c语言实现五子棋小游戏)

(3)输入非法坐标

基于c++的五子棋游戏设计与实现(c语言实现五子棋小游戏)

(4)判断输赢

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

基于c++的五子棋游戏设计与实现(c语言实现五子棋小游戏)

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

源代码如下:

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

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

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

如果您对该产品感兴趣,请填写办理(客服微信:xiaoxiongyidong)

为您推荐:

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。