当前位置:   article > 正文

三子棋的代码实现(c语言)_让c语言自动下三子棋的代码

让c语言自动下三子棋的代码

前言:

三子棋也就是大家经常说的井字棋,今天用代码实现一下井字棋。

首先井字棋需要有棋盘,玩家与电脑对战,还要有判断输赢的功能。最后实现的效果就像下面的

 图片一样。

将代码模块化

我们将代码分为三个模块,能让我们的代码看上去更加的整洁,在优化和调试起来也更加便利。

游戏菜单

 

 我们打算玩家玩完一局,不过瘾继续玩,所以设置了一个while循环,玩家输入0,会跳出循环。

  1. void menu()
  2. {
  3. printf("*****************************\n");
  4. printf("***** 1.play 0.exit *****\n");
  5. printf("*****************************\n");
  6. }

 上面是菜单的函数,主要是为了让主函数更加的简练

  1. int main()
  2. {
  3. int input=0;
  4. do
  5. {
  6. menu();
  7. printf("请输入:>");
  8. scanf("%d", &input);
  9. switch (input)
  10. {
  11. case 1:
  12. printf("开始游戏\n");
  13. break;
  14. case 0:
  15. printf("退出游戏\n");
  16. break;
  17. default:
  18. printf("非法输入,请重新输入\n");
  19. }
  20. } while(input);
  21. return 0;
  22. }

 

上图便是菜单的运行图片

 游戏代码的实现

首先游戏分出胜负的条件,不管横竖或者斜着,都要三个连起来,如下图所示:

 有了这个想法我们就去想办法敲代码

game函数

将game函数写进主函数里,输入 1,开始游戏

  1. switch (input)
  2. {
  3. case 1:
  4. printf("开始游戏\n");
  5. game();
  6. break;
  7. case 0:
  8. printf("退出游戏\n");
  9. break;
  10. default:
  11. printf("非法输入,请重新输入\n");
  12. }
棋盘的实现
  1. //为了让棋盘可变,我们在game.h定义二维数组的行和列
  2. char board[ROW ][COL] = { 0 };//ROW和COL在game.h中有定义

 注意define定义格式!!!

初始化棋盘

  1. //初始化棋盘 使其全部成为空格,初始化在game.c中完成
  2. Initboard(board, ROW, COL);

初始化棋盘自定义函数,函数的实现在game.c中完成

  1. void Initboard(char board[ROW][COL], int row, int col)
  2. {
  3. //将数组中的0,全部初始化位空格
  4. int i = 0;
  5. int j = 0;
  6. for (i = 0; i < row; i++)
  7. {
  8. for (j = 0; j < col; j++)
  9. {
  10. board [i][j] = ' ';
  11. }
  12. }
  13. }

在game.h中写好声明

打印棋盘
  1. //打印棋盘
  2. Displayboard(board, ROW, COL);

函数在game.c中完成

  1. void Displayboard(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0;
  4. for (i = 0; i < row; i++)
  5. {
  6. int j = 0;
  7. for (j = 0; j < col; j++)
  8. { //打印数据
  9. printf(" %c ", board[i][j]);
  10. if (j < col - 1)
  11. {
  12. printf("|");
  13. }
  14. }
  15. printf("\n");//换行
  16. //打印分割行
  17. if (i < row - 1)
  18. {
  19. for (int j = 0; j < col; j++)
  20. {
  21. printf("---");
  22. if (j < col - 1)
  23. {
  24. printf("|");
  25. }
  26. }
  27. printf("\n");
  28. }
  29. }
  30. }

棋盘格式如图所示,再参考代码,慢慢体会。

玩家下棋

棋盘已经打印好了,那么接下来就到了下棋的时候了,可以选择让玩家先下棋,也可以让电脑先下棋,在这我就先让玩家下棋了。

  1. //玩家下棋
  2. Playermove(board, ROW, COL);

函数在game.c中实现

  1. void Playermove(char board[ROW][COL], int row, int col)
  2. {
  3. int x = 0;
  4. int y = 0;
  5. printf("开始下棋:\n");
  6. while (1)
  7. {
  8. printf("请输入:>");
  9. scanf("%d %d", &x, &y);
  10. //坐标合法化的判断
  11. if (x >= 1 && x <= row && y >= 1 && y <= col)
  12. {
  13. if (board[x-1][y-1] == ' ')
  14. {
  15. board[x-1][y-1] = '*';
  16. break;
  17. }
  18. else
  19. printf("坐标被占用,请重新输入:");
  20. }
  21. else
  22. printf("坐标非法,请重新输入");
  23. }

上面的思想主要就是,玩家需要输入1-3之间的数字,并且输入的坐标的位置没有被占领,如果输入错误,请重新输入。

玩家下棋我用了‘*’每次下完棋之后再打印一次棋盘

需要注意的一点是,程序是面向大众的,所以就不要奢求让大家明白数组下标是从0开始的,也就是我们让左上角的坐标为(1 ,1)

 

电脑下棋

电脑下棋,我用到了rand函数,也就是让电脑随即下。rand函数的使用大家可以去MSDN或者http://www.cplusplus.com中看一下使用方法。

rand函数使用前需要先使用srand函数,设置一下起始,为了保证数字的随机,我们又需要引用time函数,值得一提的是srand函数写在何位置需要结合代码需要。

  1. //电脑下棋
  2. Computerboard(board, ROW, COL);

函数同样在game.c中完成

  1. void Computerboard(char board[ROW][COL], int row, int col)
  2. {
  3. //电脑随机下
  4. printf("电脑下棋\n");
  5. int x = 0;
  6. int y = 0;
  7. while (1)
  8. {
  9. x = rand() % row;
  10. y = rand() % col;//模以row和col是为了让随机值保持在0~2之间
  11. if (board[x][y] == ' ')
  12. {
  13. board[x][y] = '#';
  14. break;
  15. }
  16. }
  17. }

 srand函数如下,在test.c中。

  1. int main()
  2. {
  3. srand((unsigned int)time(NULL));//设计随机数起始的

电脑下棋之后再次打印棋盘

判断输赢

一局游戏只有以下四种状态 。

  1. //判断输赢
  2. ret=Iswin(board, ROW, COL);

 

  1. Iswin(char board[ROW][COL], int row, int col)
  2. {
  3. //行
  4. int i = 0;
  5. for (i = 0; i < row; i++)
  6. {
  7. if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][0]!=' ')
  8. {
  9. return board[i][0];
  10. }
  11. }
  12. //列
  13. int j = 0;
  14. for (j = 0; j < col; j++)
  15. {
  16. if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
  17. {
  18. return board[0][j];
  19. }
  20. }
  21. //对角线
  22. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  23. {
  24. return board[1][1];
  25. }
  26. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  27. {
  28. return board[1][1];
  29. }
  30. //都没赢,就平局,也就是棋盘满了
  31. if (IsFull(board, row, col))
  32. {
  33. return 'Q';
  34. }
  35. //游戏继续
  36. return 'C';
  37. }

 某一行某一列或者其中一个对角线被*或者#占满则是玩家或者电脑获胜

如果没有发现某一行,某一列或者对角线,并且棋盘满了,那就是平局,所以还需要判断棋盘是否满了

  1. 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. }

返回0则是没满,返回1就是满了,用if接收IsFull,若为真则返回Q,说明平局

若为0,则说明为假,不返回

  1. if (IsFull(board, row, col))
  2. {
  3. return 'Q';
  4. }

 在game函数中,每次玩家和电脑下完棋,就判断一次输赢,根据IsFull返回值判断输赢平局或者是否继续。判断输赢之后再次打印一下棋盘。

  1. while(1)
  2. {
  3. //玩家下棋
  4. Playermove(board, ROW, COL);
  5. ret=Iswin(board, ROW, COL);
  6. if (ret != 'C')
  7. {
  8. break;
  9. }
  10. //打印棋盘
  11. Displayboard(board, ROW, COL);
  12. //电脑下棋
  13. Computerboard(board, ROW, COL);
  14. ret=Iswin(board, ROW, COL);
  15. if (ret != 'C')
  16. {
  17. break;
  18. }
  19. //打印棋盘
  20. Displayboard(board, ROW, COL);
  21. }
  22. if (ret == '*')
  23. printf("玩家获胜\n");
  24. if (ret == '#')
  25. printf("电脑获胜\n");
  26. if (ret == 'Q')
  27. printf("平局\n");
  28. Displayboard(board, ROW, COL);
  29. }

代码全貌

test.c
  1. #include"game.h"
  2. void menu()
  3. {
  4. printf("*****************************\n");
  5. printf("***** 1.play 0.exit *****\n");
  6. printf("*****************************\n");
  7. }
  8. void game()
  9. {
  10. char ret = 0;
  11. //为了让棋盘可变,我们在game.h定义二维数组的行和列
  12. char board[ROW ][COL] = { 0 };//ROW和COL在game.h中有定义
  13. //初始化棋盘 使其全部成为空格,初始化在game.c中完成
  14. Initboard(board, ROW, COL);
  15. //打印棋盘
  16. Displayboard(board, ROW, COL);
  17. //开始下棋
  18. while(1)
  19. {
  20. //玩家下棋
  21. Playermove(board, ROW, COL);
  22. ret=Iswin(board, ROW, COL);
  23. if (ret != 'C')
  24. {
  25. break;
  26. }
  27. //打印棋盘
  28. Displayboard(board, ROW, COL);
  29. //电脑下棋
  30. Computerboard(board, ROW, COL);
  31. ret=Iswin(board, ROW, COL);
  32. if (ret != 'C')
  33. {
  34. break;
  35. }
  36. //打印棋盘
  37. Displayboard(board, ROW, COL);
  38. }
  39. if (ret == '*')
  40. printf("玩家获胜\n");
  41. if (ret == '#')
  42. printf("电脑获胜\n");
  43. if (ret == 'Q')
  44. printf("平局\n");
  45. Displayboard(board, ROW, COL);
  46. }
  47. int main()
  48. {
  49. srand((unsigned int)time(NULL));//设计随机数起始的
  50. int input=0;
  51. do
  52. {
  53. menu();
  54. printf("请输入:>");
  55. scanf("%d", &input);
  56. switch (input)
  57. {
  58. case 1:
  59. printf("开始游戏\n");
  60. game();
  61. break;
  62. case 0:
  63. printf("退出游戏\n");
  64. break;
  65. default:
  66. printf("非法输入,请重新输入\n");
  67. }
  68. } while(input);
  69. return 0;
  70. }
game.c
  1. #include "game.h"
  2. void Initboard(char board[ROW][COL], int row, int col)
  3. {
  4. //将数组中的0,全部初始化位空格
  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. board [i][j] = ' ';
  12. }
  13. }
  14. }
  15. void Displayboard(char board[ROW][COL], int row, int col)
  16. {
  17. int i = 0;
  18. for (i = 0; i < row; i++)
  19. {
  20. int j = 0;
  21. for (j = 0; j < col; j++)
  22. { //打印数据
  23. printf(" %c ", board[i][j]);
  24. if (j < col - 1)
  25. {
  26. printf("|");
  27. }
  28. }
  29. printf("\n");//换行
  30. //打印分割行
  31. if (i < row - 1)
  32. {
  33. for (int j = 0; j < col; j++)
  34. {
  35. printf("---");
  36. if (j < col - 1)
  37. {
  38. printf("|");
  39. }
  40. }
  41. printf("\n");
  42. }
  43. }
  44. }
  45. void Playermove(char board[ROW][COL], int row, int col)
  46. {
  47. int x = 0;
  48. int y = 0;
  49. printf("开始下棋:\n");
  50. while (1)
  51. {
  52. printf("请输入:>");
  53. scanf("%d %d", &x, &y);
  54. //坐标合法化的判断
  55. if (x >= 1 && x <= row && y >= 1 && y <= col)
  56. {
  57. if (board[x-1][y-1] == ' ')
  58. {
  59. board[x-1][y-1] = '*';
  60. break;
  61. }
  62. else
  63. printf("坐标被占用,请重新输入:");
  64. }
  65. else
  66. printf("坐标非法,请重新输入");
  67. }
  68. }
  69. void Computerboard(char board[ROW][COL], int row, int col)
  70. {
  71. //电脑随机下
  72. printf("电脑下棋\n");
  73. int x = 0;
  74. int y = 0;
  75. while (1)
  76. {
  77. x = rand() % row;
  78. y = rand() % col;
  79. if (board[x][y] == ' ')
  80. {
  81. board[x][y] = '#';
  82. break;
  83. }
  84. }
  85. }
  86. IsFull(char board[ROW][COL], int row, int col)
  87. {
  88. int i = 0;
  89. int j = 0;
  90. for (i = 0; i < row; i++)
  91. {
  92. for (j = 0; j < col; j++)
  93. {
  94. if (board[i][j] == ' ')
  95. {
  96. return 0;
  97. }
  98. }
  99. }
  100. return 1;
  101. }
  102. //每次玩家和电脑下完棋之后都要判断是否游戏结束
  103. Iswin(char board[ROW][COL], int row, int col)
  104. {
  105. //行
  106. int i = 0;
  107. for (i = 0; i < row; i++)
  108. {
  109. if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][0]!=' ')
  110. {
  111. return board[i][0];
  112. }
  113. }
  114. //列
  115. int j = 0;
  116. for (j = 0; j < col; j++)
  117. {
  118. if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
  119. {
  120. return board[0][j];
  121. }
  122. }
  123. //对角线
  124. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  125. {
  126. return board[1][1];
  127. }
  128. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  129. {
  130. return board[1][1];
  131. }
  132. //都没赢,就平局,也就是棋盘满了
  133. if (IsFull(board, row, col))
  134. {
  135. return 'Q';
  136. }
  137. //游戏继续
  138. return 'C';
  139. }
game.h
  1. #pragma once
  2. #include<stdio.h>
  3. #define ROW 3
  4. #define COL 3
  5. //初始化棋盘
  6. void Initboard(char board[ROW][COL], int row, int col);
  7. //打印棋盘
  8. void Displayboard(char board[ROW][COL], int row, int col);
  9. //玩家下棋
  10. void Playermove(char board[ROW][COL], int row, int col);
  11. //电脑下棋
  12. void Computerboard(char board[ROW][COL], int row, int col);
  13. //判断输赢
  14. Iswin(char board[ROW][COL], int row, int col);

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

闽ICP备14008679号