当前位置:   article > 正文

C语言详解三子棋_"printf(\"%c|\", board[i][j]);啥意思"

"printf(\"%c|\", board[i][j]);啥意思"

最近学了三子棋C语言写法,费了很多心血,特地发出来,希望大家可以互相交流,共同进步

首先,为了将代码写的简洁明了,我将三子棋代码实现分为了三个部分,分别是test.c game.c和game.h,它们各司其职,功能如下图所示

我先将代码写出来

1.test.c部分主要写三子棋游戏的主体代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"game.h"//引用自己定义的头文件用""
  3. void menu()
  4. {
  5. printf("***************************\n");
  6. printf("**********1.play***********\n");
  7. printf("**********0.exit***********\n");
  8. printf("***************************\n");
  9. }
  10. void game()
  11. { //储存二维数组(引用game.h)
  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. {
  27. break;
  28. }
  29. //电脑下棋
  30. ComputerMove(board, ROW, COL);
  31. DisplayBoard(board, ROW, COL);
  32. //判断电脑是否赢了游戏
  33. ret = IsWin(board, ROW,COL);
  34. if (ret != 'C')
  35. {
  36. break;
  37. }
  38. }
  39. if (ret == '*')
  40. {
  41. printf("玩家赢了\n");
  42. }
  43. else if (ret == '#')
  44. {
  45. printf("电脑赢了\n");
  46. }
  47. else if(ret=='Q')
  48. {
  49. printf("平局\n");
  50. }
  51. //DisplayBoard(board, ROW, COL);
  52. }
  53. int main()
  54. {
  55. int input = 0;
  56. srand((unsigned int)time(NULL));
  57. do
  58. {
  59. menu();
  60. printf("请选择:>");
  61. scanf("%d", &input);
  62. switch (input)
  63. {
  64. case 1:
  65. game();
  66. break;
  67. case 0:
  68. printf("退出游戏\n");
  69. break;
  70. default:
  71. printf("输入错误,请重新输入\n");
  72. break;
  73. }
  74. } while (input);/*当输入1时, 玩游戏, 在break跳出来, 再重新输入input;
  75. 输入0时, 直接结束了; 输入其他值, 也会重新输入input.*/
  76. }

game.h部分是游戏内容的总纲,起头部作用

  1. #pragma once
  2. //注意game.h是用来定义函数的,具体实现在game.c中
  3. #include<stdio.h>//头文件的包含,这样那那两个.c文件就不用引
  4. #include<stdlib.h>
  5. #include<time.h>
  6. //宏定义 符号的定义
  7. #define ROW 3
  8. #define COL 3 //column
  9. // 函数的声明--初始化棋盘
  10. void Initboard(char board[ROW] [COL],int row,int col);
  11. //打印棋盘的函数
  12. void DisplayBoard(char board[ROW][COL], int row, int col);
  13. //玩家下棋
  14. void PlayerMove(char board[ROW][COL], int row, int col);
  15. //电脑下棋
  16. void ComputerMove(char board[ROW][COL], int row, int col);
  17. //在游戏过程中:
  18. //1.玩家赢了-----*
  19. //2.电脑赢了-----#
  20. //3.平局-----Q
  21. //4.游戏继续-----C
  22. //只有返回C时游戏还要jixu
  23. //
  24. //IsWin 用来判断游戏的结果
  25. char IsWin(int board[ROW][COL], int row, int col);

game.c部分是三子棋游戏的具体函数实现,里面有许多巧妙的设计,我也尽我所能加了注释,值得好好琢磨

  1. #pragma once
  2. #include"game.h"
  3. 初始化棋盘-初始化为空格
  4. void Initboard(char board[ROW][COL], int row, int col)
  5. {
  6. int i,j;
  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 (int i = 0; i < row; i++)
  19. // {
  20. // printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
  21. // if (i<row-1)//为了使棋盘只有row-1行---|
  22. // {
  23. // printf("---|---|---\n");
  24. // }
  25. //
  26. // }
  27. //} 适用性不好
  28. void DisplayBoard(char board[ROW][COL], int row, int col)//写小写的单词是因为形参是实参的一份临时拷贝
  29. {
  30. int i = 0;
  31. for (int i = 0; i < row; i++)
  32. {
  33. int j = 0;
  34. for (j = 0; j < col; j++)
  35. {
  36. printf(" %c ", board[i][j]);
  37. if (j < col - 1)
  38. printf("|");
  39. }
  40. printf("\n");
  41. if (i < row - 1)//为了使棋盘只有row-1行---|
  42. {
  43. //printf("---|---|---\n");
  44. int j = 0;
  45. for (j = 0; j < col; j++)
  46. {
  47. printf("---");
  48. if (j < col - 1)
  49. printf("|");
  50. }
  51. printf("\n");
  52. }
  53. }
  54. }
  55. void PlayerMove(char board[ROW][COL], int row, int col)
  56. {
  57. int x = 0;
  58. int y = 0;
  59. printf("玩家走:>\n");
  60. while (1)
  61. {
  62. printf("请输入下棋的坐标:>");
  63. scanf_s("%d%d", &x, &y);
  64. //判断坐标合法性
  65. if (x >= 1 && x <= row && y >= 1 && y <= col)
  66. {
  67. //下棋
  68. //判断坐标是否被占用
  69. if (board[x - 1][y - 1] == ' ')
  70. {
  71. board[x - 1][y - 1] = '*';
  72. break;
  73. }
  74. else
  75. {
  76. printf("坐标被占用,请重新输入\n");
  77. }
  78. }
  79. else
  80. {
  81. printf("非法坐标, 请重新输入\n");
  82. }
  83. }
  84. }
  85. void ComputerMove(char board[ROW][COL], int row, int col)
  86. {
  87. printf("电脑走:>\n");
  88. while (1)
  89. {
  90. int x = rand() % row;//确保x在0到row-1之间
  91. int y = rand() % col;
  92. //判断占用
  93. if (board[x][y] == ' ')
  94. {
  95. board[x][y] = '#';
  96. break;
  97. }
  98. }
  99. }
  100. int IsFull(char board[ROW][COL], int row, int col)
  101. {
  102. int i = 0;
  103. int j = 0;
  104. for ( i = 0; i < row; i++)
  105. {
  106. for (j= 0; j < col; j++)
  107. {
  108. if (board[i][j]==' ')
  109. {
  110. return 0;
  111. }
  112. }
  113. }
  114. return 1;
  115. }
  116. char IsWin(char board[ROW][COL], int row, int col)
  117. {
  118. //判断三行
  119. int i = 0;
  120. for (i = 0; i < row; i++)
  121. {
  122. if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&& board[i][1] != ' ')
  123. return board[i][1];//设计非常巧妙
  124. }
  125. int j = 0;
  126. for ( j = 0; j < col; j++)
  127. {
  128. if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
  129. return board[0][j];
  130. }
  131. //判断两条对角线
  132. if (board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')
  133. {
  134. return board[1][1];
  135. }
  136. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  137. {
  138. return board[1][1];
  139. }
  140. //上面都没人赢,所以要判读平局
  141. //如果棋盘满了就平局了就返回1,不满就返回0
  142. int ret=IsFull(board, row, col);
  143. if ( ret == 1)
  144. return 'Q';
  145. return 'C';
  146. }

主要的逻辑就是先用do while将三子棋的框架搭好,然后想好大体的要点.如初始化棋盘---打印棋盘的内容---实现玩家与电脑的下棋功能---判断赢的条件,最后在game.c中细化函数步骤

三子棋实现过程中运用了许多好的编程思想,如宏的定义,利用循环来更好地实现初始化数组,while循环结束的控制,随机数值的获取,思维的严密性……

代码中有许多我个人认为十分巧妙的地方,如果读者有兴趣可以粘贴至编译器上运行测试,看看效果如何。欢迎大家纠错指教!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号