飞道的博客

C语言实现五子棋(n子棋)

429人阅读  评论(0)

五子棋的历史背景:

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

五子棋容易上手,老少皆宜,而且趣味横生,引人入胜。它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。


不难看出,五子棋是我们中华民族发明的,我们必须了解他,作为程序员,我们更加要懂得如何把五子棋的代码给敲出来,我研究了一天了,调试了无数次,修改了无数错误,到最后运行成功的那一刹那,我就很开心,就想以博客的形式分享给大家!

一.设计过程步骤

ps:整个五子棋一共有三个文件,200多行代码,不复杂,多琢磨,很好懂,分为text.c,game.h,game.c文件,在最后会给出完整代码。

1.初始化二维数组

为了数组里面存放的每个数是我们想初始化的,我们初始化一个二维数组(方阵的格式,即 n*n)用来存放棋子,里面的元素可以按照我们的意愿来初始化;在此代码中将数组中每个元素初始化为一个空格。


   
  1. #define ROW 5
  2. #define COL 5
  3. void InitBoard(char board[ROW][COL], int row, int col)
  4. {
  5. int i = 0;
  6. int j = 0;
  7. for (i = 0; i < ROW; i++)
  8. {
  9. for ( int j = 0; j < COL; j++)
  10. {
  11. board[i][j] = ' ';
  12. }
  13. }
  14. }

2.构造一个棋盘

在初始化一个数组后的基础上我们来构造一个棋盘,使得整个代码的结构更加清晰,可读性高。


   
  1. #define ROW 5
  2. #define COL 5
  3. void DisplayBoard(char board[ROW][COL], int row, int col)
  4. {
  5. int i = 0;
  6. int j = 0;
  7. for (i = 0; i < row; i++)
  8. {
  9. for(j= 0;j<col;j++)
  10. {
  11. printf( " %c ", board[i][j]); //注意:%c的左右是有两个空格的
  12. if (j < col -1) //最后一列不打印|,也就是打印4个|,只是为了美观,不加也行,见下图
  13. printf( "|");
  14. }
  15. printf( "\n");
  16. if (i < row - 1) //最后一行不进行打印---和|,见下图
  17. {
  18. int j = 0;
  19. for (j = 0; j < col; j++)
  20. {
  21. printf( "---");
  22. if (j < col - 1) //和上面一样,见下图
  23. printf( "|");
  24. }
  25. printf( "\n");
  26. }
  27. }
  28. }

3.玩家走法


   
  1. //玩家
  2. void PlayerMove(char board[ROW][COL], int row, int col)
  3. {
  4. int x = 0;
  5. int y = 0;
  6. printf( "玩家走:>");
  7. while ( 1)
  8. {
  9. printf( "请输入下棋的坐标\n");
  10. scanf_s( "%d %d", &x, &y);
  11. //判断坐标的合法性
  12. if (x >= 1 && x <= row && y >= 1 && y <= col)
  13. {
  14. //下棋
  15. //坐标是否被占用
  16. if ( ' ' == board[x - 1][y - 1]) //等号量变也可以调换,我这样写要是出错那编译器会提示错误,如果换过来的话那就不会提示错误了,这样找bug可能会很难受
  17. //如果是空格的话,这个位置就是空的,可以下棋
  18. {
  19. board[x - 1][y - 1] = '*';
  20. break;
  21. }
  22. else
  23. {
  24. printf( "坐标被占用,请重新输入\n");
  25. }
  26. }
  27. else
  28. {
  29. printf( "坐标非法,请重新选择\n");
  30. }
  31. }
  32. }

4.电脑随机下棋


   
  1. //电脑
  2. void ComputerMove(char board[ROW][COL], int row, int col)
  3. {
  4. printf( "电脑走:>\n");
  5. while ( 1)
  6. {
  7. int x = rand() % ROW; //rand是根据系统的情况来自动生成一个随机数
  8. int y = rand() % COL;
  9. //判断占用
  10. if (board[x][y] == ' ')
  11. {
  12. board[x][y] = '#';
  13. break;
  14. }
  15. }
  16. }

5.判断是否能分出胜负


   
  1. //判断游戏是否有输赢
  2. char IsWin(char board[ROW][COL], int row, int col)
  3. {
  4. int i = 0;
  5. //判断五行每行五个元素是否相等
  6. for (i = 0; i < row; i++)
  7. {
  8. if (board[i][ 0] == board[i][ 1] && board[i][ 1] == board[i][ 2] && board[i][ 2] == board[i][ 3]
  9. && board[i][ 3] == board[i][ 4] && board[i][ 1] != ' ')
  10. {
  11. return board[i][ 1];
  12. }
  13. }
  14. //判断五列每一列的元素是否相等
  15. for (i = 0; i < col; i++)
  16. {
  17. if (board[ 0][i] == board[ 1][i] && board[ 1][i] == board[ 2][i] && board[ 2][i] == board[ 3][i]
  18. && board[ 3][i] == board[ 4][i] && board[ 1][i] != ' ')
  19. {
  20. return board[i][ 1];
  21. }
  22. }
  23. //判断\对角线元素是否相等
  24. if (board[ 0][ 0] == board[ 1][ 1] && board[ 1][ 1] == board[ 2][ 2]&&
  25. board[ 2][ 2] == board[ 3][ 3]&&board[ 3][ 3] == board[ 4][ 4] && board[ 1][ 1]!= ' ')
  26. {
  27. return board[ 1][ 1];
  28. }
  29. //判断/对角线元素是否相等
  30. if ( board[ 4][ 0]== board[ 3][ 1] && board[ 3][ 1] == board[ 2][ 2]&&
  31. board[ 2][ 2] == board[ 1][ 3] &&board[ 1][ 3] == board[ 0][ 4] && board[ 1][ 1]!= ' ')
  32. {
  33. return board[ 1][ 1];
  34. }

6.判断是否平局


   
  1. int IsFull(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0;
  4. int j = 0;
  5. for (i = 0; i < row; i++)
  6. {
  7. for (j = 0; j < col; j++)
  8. {
  9. if (board[i][j] == ' ')
  10. {
  11. return 0;
  12. }
  13. }
  14. }
  15. return 1;
  16. }
  17. //判断平局
  18. //如果棋盘满了则返回1,不满返回0
  19. int ret = IsFull(board, row, col);
  20. if (ret == 1)
  21. {
  22. return 'Q';
  23. }
  24. return 'C';

以下是game.h文件的代码


   
  1. #pragma once
  2. //头文件的包含
  3. #include<stdio.h>
  4. #include<time.h>
  5. #include<stdlib.h>
  6. //符号定义
  7. #define ROW 5
  8. #define COL 5
  9. //函数声明
  10. //初始化棋盘的
  11. void InitBoard(char board[ROW][COL], int row, int col);
  12. //打印棋盘的函数
  13. void DisplayBoard(char board[ROW][COL], int row, int col);
  14. //玩家下棋
  15. void PlayerMove(char board[ROW][COL], int row, int col);
  16. //电脑下棋
  17. void ComputerMove(char board[ROW][COL], int row, int col);
  18. char IsWin(char board[ROW][COL], int row, int col);

以下是text.c文件的代码


   
  1. #include"game.h"
  2. void menu()
  3. {
  4. printf( "*******************************\n");
  5. printf( "********* 1.play ************\n");
  6. printf( "********* 0.exit ************\n");
  7. printf( "*******************************\n");
  8. }
  9. void game()
  10. {
  11. //储存数据--二维数组
  12. char board[ROW][COL];
  13. //初始化棋盘为空格
  14. InitBoard(board, ROW, COL);
  15. //打印棋盘--本质打印数组的内容
  16. DisplayBoard(board,ROW,COL);
  17. char ret = 0;
  18. while ( 1)
  19. {
  20. //玩家下棋
  21. PlayerMove(board, ROW, COL);
  22. DisplayBoard(board, ROW, COL);
  23. //判断玩家是否赢
  24. ret = IsWin(board, ROW, COL);
  25. if (ret != 'C')
  26. break;
  27. //电脑下棋
  28. ComputerMove(board, ROW, COL);
  29. DisplayBoard(board, ROW, COL);
  30. ret = IsWin(board, ROW, COL);
  31. if (ret =! 'C')
  32. break;
  33. }
  34. if (ret == '*')
  35. printf( "玩家胜利\n");
  36. else if (ret == '#')
  37. printf( "电脑胜利\n");
  38. else
  39. printf( "平局\n");
  40. DisplayBoard(board, ROW, COL);
  41. }
  42. int main()
  43. {
  44. srand(( unsigned int) time( NULL));
  45. int input = 0;
  46. do
  47. {
  48. menu();
  49. printf( "请选择:>");
  50. scanf_s( "%d", &input);
  51. switch (input)
  52. {
  53. case 1:
  54. game();
  55. break;
  56. case 0:
  57. printf( "退出游戏\n");
  58. break;
  59. default:
  60. printf( "选择错误,重新选择\n");
  61. break;
  62. }
  63. } while (input);
  64. return 0;
  65. }

二.完整代码:

game.h文件


   
  1. #pragma once
  2. //头文件的包含
  3. #include<stdio.h>
  4. #include<time.h>
  5. #include<stdlib.h>
  6. //符号定义
  7. #define ROW 5
  8. #define COL 5
  9. //函数声明
  10. //初始化棋盘的
  11. void InitBoard(char board[ROW][COL], int row, int col);
  12. //打印棋盘的函数
  13. void DisplayBoard(char board[ROW][COL], int row, int col);
  14. //玩家下棋
  15. void PlayerMove(char board[ROW][COL], int row, int col);
  16. //电脑下棋
  17. void ComputerMove(char board[ROW][COL], int row, int col);
  18. char IsWin(char board[ROW][COL], int row, int col);

game.c文件


   
  1. #include"game.h"
  2. void InitBoard(char board[ROW][COL], int row, int col)
  3. {
  4. int i = 0;
  5. int j = 0;
  6. for (i = 0; i < ROW; i++)
  7. {
  8. for ( int j = 0; j < COL; j++)
  9. {
  10. board[i][j] = ' ';
  11. }
  12. }
  13. }
  14. void DisplayBoard(char board[ROW][COL], int row, int col)
  15. {
  16. int i = 0;
  17. int j = 0;
  18. for (i = 0; i < row; i++)
  19. {
  20. for(j= 0;j<col;j++)
  21. {
  22. printf( " %c ", board[i][j]);
  23. if (j < col -1)
  24. printf( "|");
  25. }
  26. printf( "\n");
  27. if (i < row - 1)
  28. {
  29. int j = 0;
  30. for (j = 0; j < col; j++)
  31. {
  32. printf( "---");
  33. if (j < col - 1)
  34. printf( "|");
  35. }
  36. printf( "\n");
  37. }
  38. //printf("---|---|---\n");
  39. }
  40. }
  41. //玩家
  42. void PlayerMove(char board[ROW][COL], int row, int col)
  43. {
  44. int x = 0;
  45. int y = 0;
  46. printf( "玩家走:>");
  47. while ( 1)
  48. {
  49. printf( "请输入下棋的坐标\n");
  50. scanf_s( "%d %d", &x, &y);
  51. //判断坐标的合法性
  52. if (x >= 1 && x <= row && y >= 1 && y <= col)
  53. {
  54. //下棋
  55. //坐标是否被占用
  56. if ( ' ' == board[x - 1][y - 1])
  57. {
  58. board[x - 1][y - 1] = '*';
  59. break;
  60. }
  61. else
  62. {
  63. printf( "坐标被占用,请重新输入\n");
  64. }
  65. }
  66. else
  67. {
  68. printf( "坐标非法,请重新选择\n");
  69. }
  70. }
  71. }
  72. //电脑
  73. void ComputerMove(char board[ROW][COL], int row, int col)
  74. {
  75. printf( "电脑走:>\n");
  76. while ( 1)
  77. {
  78. int x = rand() % ROW;
  79. int y = rand() % COL;
  80. //判断占用
  81. if (board[x][y] == ' ')
  82. {
  83. board[x][y] = '#';
  84. break;
  85. }
  86. }
  87. }
  88. int IsFull(char board[ROW][COL], int row, int col)
  89. {
  90. int i = 0;
  91. int j = 0;
  92. for (i = 0; i < row; i++)
  93. {
  94. for (j = 0; j < col; j++)
  95. {
  96. if (board[i][j] == ' ')
  97. {
  98. return 0;
  99. }
  100. }
  101. }
  102. return 1;
  103. }
  104. //判断游戏是否有输赢
  105. char IsWin(char board[ROW][COL], int row, int col)
  106. {
  107. int i = 0;
  108. //判断五行
  109. for (i = 0; i < row; i++)
  110. {
  111. if (board[i][ 0] == board[i][ 1] && board[i][ 1] == board[i][ 2] && board[i][ 2] == board[i][ 3]
  112. && board[i][ 3] == board[i][ 4] && board[i][ 1] != ' ')
  113. {
  114. return board[i][ 1];
  115. }
  116. }
  117. //判断五列
  118. for (i = 0; i < col; i++)
  119. {
  120. if (board[ 0][i] == board[ 1][i] && board[ 1][i] == board[ 2][i] && board[ 2][i] == board[ 3][i]
  121. && board[ 3][i] == board[ 4][i] && board[ 1][i] != ' ')
  122. {
  123. return board[i][ 1];
  124. }
  125. }
  126. //判断\对角线
  127. if (board[ 0][ 0] == board[ 1][ 1] && board[ 1][ 1] == board[ 2][ 2]&& board[ 2][ 2] == board[ 3][ 3]
  128. &&board[ 3][ 3] == board[ 4][ 4] && board[ 1][ 1]!= ' ')
  129. {
  130. return board[ 1][ 1];
  131. }
  132. //判断/对角线
  133. if ( board[ 4][ 0]== board[ 3][ 1] && board[ 3][ 1] == board[ 2][ 2]&& board[ 2][ 2] == board[ 1][ 3]
  134. &&board[ 1][ 3] == board[ 0][ 4] && board[ 1][ 1]!= ' ')
  135. {
  136. return board[ 1][ 1];
  137. }
  138. //判断平局
  139. //如果棋盘满了则返回1,不满返回0
  140. int ret = IsFull(board, row, col);
  141. if (ret == 1)
  142. {
  143. return 'Q';
  144. }
  145. return 'C';
  146. }

以下是text.c文件:


   
  1. #include"game.h"
  2. void menu()
  3. {
  4. printf( "*******************************\n");
  5. printf( "********* 1.play ************\n");
  6. printf( "********* 0.exit ************\n");
  7. printf( "*******************************\n");
  8. }
  9. void game()
  10. {
  11. //储存数据--二维数组
  12. char board[ROW][COL];
  13. //初始化棋盘为空格
  14. InitBoard(board, ROW, COL);
  15. //打印棋盘--本质打印数组的内容
  16. DisplayBoard(board,ROW,COL);
  17. char ret = 0;
  18. while ( 1)
  19. {
  20. //玩家下棋
  21. PlayerMove(board, ROW, COL);
  22. DisplayBoard(board, ROW, COL);
  23. //判断玩家是否赢
  24. ret = IsWin(board, ROW, COL);
  25. if (ret != 'C')
  26. break;
  27. //电脑下棋
  28. ComputerMove(board, ROW, COL);
  29. DisplayBoard(board, ROW, COL);
  30. ret = IsWin(board, ROW, COL);
  31. if (ret =! 'C')
  32. break;
  33. }
  34. if (ret == '*')
  35. printf( "玩家胜利\n");
  36. else if (ret == '#')
  37. printf( "电脑胜利\n");
  38. else
  39. printf( "平局\n");
  40. DisplayBoard(board, ROW, COL);
  41. }
  42. int main()
  43. {
  44. srand(( unsigned int) time( NULL));
  45. int input = 0;
  46. do
  47. {
  48. menu();
  49. printf( "请选择:>");
  50. scanf_s( "%d", &input);
  51. switch (input)
  52. {
  53. case 1:
  54. game();
  55. break;
  56. case 0:
  57. printf( "退出游戏\n");
  58. break;
  59. default:
  60. printf( "选择错误,重新选择\n");
  61. break;
  62. }
  63. } while (input);
  64. return 0;
  65. }

最后,大家有问题可以指出来,关个注,点个赞,评个论,我们一起进步!

2023.02.09

From:努力进大厂的新青年


转载:https://blog.csdn.net/weixin_73233099/article/details/128960888
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场