当前位置:   article > 正文

C语言实现三子棋(超详解版本)_c语言三子棋代码

c语言三子棋代码

前言:在通往未来的路上,每个人都是孤独的旅行者。你的人生不会辜负你的。那些转错的弯,那些流下的泪水,那些滴下的汗水,全都让你成为独一无二的自己。今天小编带大家来制作一个简易的三子棋小游戏。

目录

一.问题描述

二.基本流程

三.具体步骤

1.创建test.c game.h 源文件和game.h头文件

2.创建菜单

3.创建棋盘

4.初始化棋盘

5.打印棋盘

6.玩家下棋

7.电脑下棋

8.判断是否已满

9.判断输赢

四.玩法演示

1.电脑胜利

 2.玩家赢

五.原代码

1.头文件

2.game.c

3.test.c

六.小伙伴们制作不易记得点赞哦




一.问题描述

用C语言实现小游戏三子棋

二.基本流程

1.菜单界面选择开始或者退出游戏。
2.创建棋盘并初始化。
3.打印棋盘。
4.玩家落子(玩家输入行列坐标的方式来落子),'*’表示玩家落子。
5.判定胜负关系(输,赢,和棋),'Q’表示和棋。
6.电脑落子(随机位置落子) ,'#’表示电脑落子。
7.判定胜负关系。

三.具体步骤

1.创建test.c game.h 源文件和game.h头文件

分别在编译其中创建test.c test.h 原文件和game.h头文件,这样会是代码更加简练,便于观察,方便初学者理解。

2.创建菜单

首先在test.c源文件中创建菜单函数

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

3.创建棋盘

首先创建棋盘

  1. char board[ROW][COL] = { 0 };
  2. #define ROW 3
  3. #define COL 3

使用宏定义的原因:
1.推高代码可读性,后续代码中遇到3,方便理解含义。
2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

4.初始化棋盘

其次初始化棋盘

  1. void InitBoard(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. board[i][j]=' ';
  10. }
  11. }
  12. }

注意:形参中的row和col主要是与宏定义中的ROW和COL做区分

5.打印棋盘

  1. void DispalyBoard(char board[ROW][COL], int row, int col)
  2. {
  3. int i = 0;
  4. for (i = 0; i < row; i++)
  5. {
  6. //打印数据
  7. int j = 0;
  8. for (j = 0; j < col; j++)
  9. {
  10. //%c前后必须要有空格
  11. printf(" %c ", board[i][j]);
  12. if (j < col - 1)
  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. }

6.玩家下棋

注意:

1.玩家落子需要在棋盘范围内。
2.玩家要在棋盘上空的地方落子。
3.如果输入的坐标不满足要重新输入。

4.这里之所以x,y要从1开始循环是因为这样更符合生活场景

  1. void PlayerMove(char board[ROW][COL], int row, int col)
  2. {
  3. int x = 0;
  4. int y = 0;
  5. printf("玩家下棋");
  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. //这里的x,y之所以要从一开始计算是因为这样更符合生活场景
  18. }
  19. else
  20. {
  21. printf("坐标已被占用,不能下棋,请选择其他位置\n");
  22. }
  23. }
  24. else
  25. {
  26. printf("坐标违法,请重新输入\n");
  27. }
  28. }
  29. }

注意:这里之所以x,y要从1开始循环是因为这样更符合生活场景

7.电脑下棋

注意:
1.要在主函数中使用srand((unsigned int)time(0))
将时间作为随机数种子,确保得到的行列坐标是真随机。
2.要在棋盘上空的地方下棋。

  1. void ComputerMove(char board[ROW][COL],int row, int col)
  2. {
  3. printf("电脑下棋");
  4. int x = 0;
  5. int y = 0;
  6. while (1)
  7. {
  8. //电脑随机生成
  9. x = rand() % row;//0-2
  10. y = rand() % col;
  11. if (board[x][y] == ' ')
  12. {
  13. board[x][y] = '#';
  14. break;
  15. }
  16. }
  17. }

8.判断是否已满

1.判定是否和棋
(1)调用IsFull函数。
(2)如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。
(3)如果棋盘满了未分出胜负,和棋。

  1. //满了就返回1
  2. //不满 返回0
  3. int IsFull(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. if (board[i][j] == ' ')
  12. {
  13. return 0;
  14. }
  15. }
  16. }
  17. return 1;
  18. }

9.判断输赢

此处约定返回结果的含义:
(1)‘*’ 表示玩家获胜
(2)‘#’ 表示电脑获胜
(3)’ Q’ 表示胜负未分
(4) ‘C’ 表示和棋


2.判定电脑玩家胜利
(1)判定所有的行
(2)判定所有的列
(3)判定两条对角线

 

  1. char 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][1] != ' ')
  8. {
  9. return board[i][1];//
  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[1][j] != ' ')
  17. {
  18. return board[1][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.电脑胜利

 2.玩家赢

五.原代码

1.头文件

  1. #pragma once
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<time.h>
  5. #define ROW 3
  6. #define COL 3
  7. void InitBoard(char board[ROW][COL], int row, int col);
  8. void DispalyBoard(char board[ROW][COL], int row, int col);
  9. void PlayerMove(char board[ROW][COL], int row, int col);
  10. void ComputerMove(char board[ROW][COL], int row, int col);
  11. int IsFull(char board[ROW][COL], int row, int col);
  12. char IsWin(char board[ROW][COL], int row, int col);

2.game.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"game.h"
  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 (j = 0; j < col; j++)
  10. {
  11. board[i][j]=' ';
  12. }
  13. }
  14. }
  15. void DispalyBoard(char board[ROW][COL], int row, int col)
  16. {
  17. int i = 0;
  18. for (i = 0; i < row; i++)
  19. {
  20. //打印数据
  21. int j = 0;
  22. for (j = 0; j < col; j++)
  23. {
  24. printf(" %c ", board[i][j]);
  25. if (j < col - 1)
  26. printf("|");
  27. }
  28. printf("\n");
  29. if (i < row - 1)
  30. {
  31. int j = 0;
  32. for (j = 0; j < col; j++)
  33. {
  34. printf("---");
  35. if (j < col - 1)
  36. printf("|");
  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("请输入坐标");
  50. scanf("%d %d", &x, &y);
  51. //坐标的合法判断
  52. if (x >= 1 && x <= row && y >= 1 && y <= col)
  53. {
  54. if (board[x - 1][y - 1] == ' ')
  55. {
  56. board[x - 1][y - 1] = '*';
  57. break;
  58. //这里的x,y之所以要从一开始计算是因为这样更符合生活场景
  59. }
  60. else
  61. {
  62. printf("坐标已被占用,不能下棋,请选择其他位置\n");
  63. }
  64. }
  65. else
  66. {
  67. printf("坐标违法,请重新输入\n");
  68. }
  69. }
  70. }
  71. void ComputerMove(char board[ROW][COL],int row, int col)
  72. {
  73. printf("电脑下棋\n");
  74. int x = 0;
  75. int y = 0;
  76. while (1)
  77. {
  78. //电脑随机生成
  79. x = rand() % row;//0-2
  80. y = rand() % col;
  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. char IsWin(char board[ROW][COL], int row, int col)
  105. {
  106. //
  107. int i = 0;
  108. for (i = 0; i < row; i++)
  109. {
  110. if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
  111. {
  112. return board[i][1];//
  113. }
  114. }
  115. //
  116. int j = 0;
  117. for (j = 0; j < col; j++)
  118. {
  119. if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
  120. {
  121. return board[1][j];
  122. }
  123. }
  124. //对角线
  125. if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  126. {
  127. return board[1][1];
  128. }
  129. if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  130. {
  131. return board[1][1];
  132. }
  133. //没有人赢,就要平局
  134. if (IsFull(board, row, col))
  135. {
  136. return 'Q';
  137. }
  138. //游戏继续
  139. return 'C';
  140. }

3.test.c

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include"game.h"
  3. void menu()
  4. {
  5. printf("******************************\n");
  6. printf("*********1.play 0.exit********\n");
  7. printf("******************************\n");
  8. }
  9. void game()
  10. {
  11. char ret = 0;
  12. char board[ROW][COL] = { 0 };
  13. //初始化棋盘的函数
  14. InitBoard(board, ROW, COL);
  15. DispalyBoard(board, ROW, COL);
  16. //下棋
  17. while (1)
  18. {
  19. PlayerMove(board, ROW, COL);
  20. //判断输赢
  21. ret = IsWin(board, ROW, COL);
  22. if (ret != 'C')
  23. {
  24. break;
  25. }
  26. DispalyBoard(board, ROW, COL);
  27. ComputerMove(board, ROW, COL);
  28. //判断输赢
  29. ret = IsWin(board, ROW, COL);
  30. if (ret != 'C')
  31. {
  32. break;
  33. }
  34. DispalyBoard(board, ROW, COL);
  35. }
  36. if (ret == '*')
  37. {
  38. printf("玩家赢\n");
  39. }
  40. else if (ret == '#')
  41. {
  42. printf("电脑赢\n");
  43. }
  44. else
  45. {
  46. printf("平局\n");
  47. }
  48. DispalyBoard(board, ROW, COL);
  49. }
  50. int main()
  51. {
  52. srand((unsigned int)time(NULL));//设置随机生成起点
  53. int input = 0;
  54. do
  55. {
  56. menu();
  57. printf("请选择>");
  58. scanf("%d", &input);
  59. switch (input)
  60. {
  61. case 1:
  62. game();
  63. break;
  64. case 0:
  65. printf("退出游戏\n");
  66. default:
  67. printf("退出游戏\n");
  68. break;
  69. }
  70. } while (input);
  71. return 0;
  72. }

六.小伙伴们制作不易记得点赞哦

结语:

每个人的成长都是能力和想要得到的东西,不断匹配的过程,当你的才华和欲望不匹配时,你就该静下心来学习了,如果小编的总结能对你有所帮助,希望小伙伴们三连加关注哦,你的支持是小编创作的最大动力。

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

闽ICP备14008679号