鱼C论坛

 找回密码
 立即注册
查看: 2160|回复: 2

[技术交流] 【C语言练习项目】三子棋

[复制链接]
发表于 2021-8-25 18:45:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 超过光速c 于 2021-8-25 18:47 编辑

三子棋游戏!!
三个文件,先直接贴上来。

test_.c  文件的内容
  1. /**
  2. * @file test_.c
  3. * @date 2021-08-24
  4. *
  5. * 三子棋
  6. *
  7. */

  8. #include "game_3.h"
  9. #include "game_3.c"

  10. void menu(){
  11.     printf("****************************************************************\n");
  12.     printf("**************** 1.Play    0.exit  ******************\n");
  13.     printf("****************************************************************\n");

  14. }

  15. // 游戏的整个算法实现
  16. void game_3(){
  17.     char ret;
  18.     // 数组-存放走出的棋盘信息
  19.     char board[ROW][COL] = {0};  // 全部空格,初始化一下棋盘,即初始化数组
  20.     // 初始化棋盘
  21.     InitBoard(board, ROW, COL);

  22.     // 打印棋盘
  23.     DisplayBoard(board, ROW, COL);

  24.     //下棋
  25.     while(1){
  26.         // 玩家下棋
  27.         PlayerMove(board, ROW, COL);
  28.         DisplayBoard(board, ROW, COL);
  29.         // 判断玩家是否赢
  30.         ret = IsWin(board, ROW, COL);
  31.         if(ret != 'C') {
  32.             break;
  33.         }
  34.         // 电脑下棋
  35.         ComputerMove(board, ROW, COL);
  36.         DisplayBoard(board, ROW, COL);
  37.         // 判断电脑是否赢
  38.         ret = IsWin(board, ROW, COL);
  39.         if(ret != 'C') {
  40.             break;
  41.         }
  42.     }
  43.     if (ret == '*')
  44.     {
  45.         printf("玩家赢了\n");
  46.     }
  47.     else if (ret == '#')
  48.     {
  49.         printf("电脑赢了\n");
  50.     }
  51.     else
  52.     {
  53.         printf("平局!\n");
  54.     }


  55. }


  56. void test_(){
  57.     int input=0;
  58.     // 随机存储生成器
  59.     srand((unsigned int)time(NULL));

  60.     do{
  61.         menu();
  62.         printf("请选择 : >> ");
  63.         scanf("%d",&input);
  64.         switch(input){
  65.             case 1:
  66.                 game_3();
  67.                 // printf("开始游戏!\n");
  68.                 break;
  69.             case 0:
  70.                 printf("退出游戏!\n");
  71.                 break;
  72.             default:
  73.                 printf("输入错误,请重新输入:");
  74.                 break;
  75.         }
  76.     }while(input);
  77. }

  78. int main(){

  79.     test_();

  80.     printf("\n");
  81.     return 0;
  82. }
复制代码



game_3.c 文件内容
  1. #include "game_3.h"


  2. // 实现初始化
  3. void InitBoard(char board[ROW][COL], int row, int col){
  4.     int i=0;
  5.     int j=0;
  6.     for(i=0;i<row;i++){
  7.         for(j=0;j<col;j++){
  8.             board[i][j] = ' ';
  9.         }
  10.     }

  11. }

  12. // 实现打印棋盘
  13. void DisplayBoard(char board[ROW][COL], int row, int col){
  14.     int i = 0;
  15.     int j = 0;
  16.     for(i=0;i<row;i++){
  17.         // 1.打印第一行数据
  18.         for(j=0;j<col;j++){
  19.             printf(" %c ",board[i][j]);
  20.             if(j < col-1) printf("|");
  21.         }
  22.         printf("\n");
  23.         // printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
  24.         // 2.打印分割行

  25.         if(i < row-1){
  26.             for(j=0;j<col;j++){
  27.             printf("---");
  28.             if(j < col-1) printf("|");
  29.             }

  30.             printf("\n");
  31.         }
  32.             // printf("---|---|---\n");
  33.     }
  34. }

  35. // 实现玩家下棋
  36. void PlayerMove(char board[ROW][COL], int row, int col){
  37.     int x=0, y=0;

  38.     printf("玩家走:> \n");
  39.     while(1){
  40.         printf("请输入要下的坐标:>");
  41.         scanf("%d%d",&x,&y);
  42.         getchar();

  43.         // 判断x和y输入的合法性
  44.         if(x>=1 && x<=ROW && y>=1 && y<=COL){
  45.             if(board[x-1][y-1] == ' '){
  46.                 board[x-1][y-1] = '*';
  47.                 break;
  48.             }
  49.             else{
  50.                 printf("坐标被占用\n");
  51.             }
  52.         }
  53.         else
  54.         {
  55.             printf("坐标非法,请重新输入!");
  56.         }
  57.     }

  58. }

  59. // 实现电脑下棋
  60. void ComputerMove(char board[ROW][COL], int row, int col){
  61.     int x=0;
  62.     int y=0;
  63.     printf("电脑走!\n");

  64.     while(1){
  65.         x = rand() % row;
  66.         y = rand() % col;
  67.         
  68.         if(board[x][y] == ' '){
  69.             board[x][y] = '#';
  70.             break;
  71.         }
  72.     }
  73. }


  74. // 满了返回1,没满返回0
  75. int IsFull(char board[ROW][COL], int row, int col)
  76. {
  77.     for(int j=0;j<row;j++)
  78.     {
  79.         for(int i=0;i<col;i++)
  80.         {
  81.             if(board[i][j] == ' ')
  82.             {
  83.                 return 0; // 没满
  84.             }
  85.         }
  86.     }
  87.     return 1; // 满了
  88. }

  89. // 实现判断输赢
  90. char IsWin(char board[ROW][COL], int row, int col){
  91.     // 判断行
  92.     for(int i = 0; i < row; i++){
  93.         if(board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
  94.         {
  95.             return board[i][1];
  96.         }
  97.     }

  98.     // 判断列
  99.     for(int i = 0; i < col; i++){
  100.         if(board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
  101.         {
  102.             return board[1][i];
  103.         }
  104.     }

  105.     // 判断交叉
  106.     if(board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
  107.     {
  108.         return board[1][1];
  109.     }
  110.     if(board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
  111.     {
  112.         return board[1][1];
  113.     }

  114.     // 判断平局
  115.     if(1 == IsFull(board, ROW, COL))
  116.     {
  117.         return 'Q';
  118.     }
  119.     return 'C';
  120. }
复制代码



game_3.h 文件内容
  1. #define ROW 3
  2. #define COL 3

  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <time.h>

  6. // #include "game_3.c"

  7. // 声明
  8. void InitBoard(char board[ROW][COL], int row, int col);
  9. void DisplayBoard(char board[ROW][COL], int row, int col);
  10. void PlayerMove(char board[ROW][COL], int row, int col);
  11. void ComputerMove(char board[ROW][COL], int row, int col);


  12. // 告诉我门四种游戏状态,玩家赢 * 、电脑赢 #、平局 Q、继续 C
  13. char IsWin(char board[ROW][COL], int row, int col);


  14. /**
  15. * 整体逻辑回顾
  16. *
  17. * 1、游戏便于循环玩,所以将所有操作包含在一个 do while 循环内
  18. *  -- 先打印选择目录,用户选择输入 1开始游戏,0退出游戏(退出循环)
  19. *  -- 对输入有一个检验,若输入错误则提示用户重新输入
  20. * 2、游戏的操作
  21. *  -- 用一个二维数组来存储棋盘
  22. *  -- 初始化棋盘,再将棋盘打印出来。利用for循环将棋盘拆分成每一个单独的元素进行遍历打印,更加的灵活
  23. *  -- 用户下棋:提示用户输入坐标,检验输入的坐标有效性,1、是否输入错误数值;2、输入坐标是否被占用。将坐标数组添加*号
  24. *  -- 电脑下棋:使用随机数值,检验坐标是否被占用。将坐标数组添加#号       随机存储生成器不理解?
  25. *  -- 每次走一步后将棋盘打印输出,观察走棋后的结果
  26. * 3、判断输赢
  27. *  -- 横、纵、交叉的坐标数组内相等,且任意一个坐标不等于‘ ’值(棋盘初始化为' '空值),就返回此前坐标数组内的符号,返回*则玩家赢,返回#则电脑赢
  28. *  -- 检验棋盘空格数。循环遍历检验每一个坐标数组,若满则返回为平局,若未满则继续游戏
  29. *
  30. *
  31. * 学得:
  32. * C语言,随机存储生成器,随机数的使用
  33. * rand() 函数包含于 <stdlib.h> 头文件中【random() 函数不是一个标准函数,无法再VC/VS等编译器通过。】
  34. * rand() 会随机产生一个位于 0~RAND_MAX(至少是32767)之间的整数
  35. * 伪随机数,根据电脑启动时而定,则不再变化。随机存储生成器:srand((unsigned)time(NULL)),根据时间进行随机产生新的数值
  36. * 随机数的范围设定:
  37. * rand() % 10 即 0~9
  38. * rand() % 51 + 13 即 13~63。rand()%51 即0~50,+13则是 0+13~50+13 即 13~63
  39. *
  40. * 连续随机数的产生
  41. * 用for循环产生的都是一样的随机数
  42. * for(int i=0; i<10; i++)
  43. * {
  44. *      srand((unsigned)time(NULL));
  45. *      a[i] = rand() % 100;
  46. *      printf("%d", a[i]);
  47. * }
  48. *
  49. *
  50. * 关于头文件 #include "" 和 <> 的区别用法,调取其他文件的函数
  51. * <> : 到库里面寻找头文件
  52. * "" : 优先到当前目录下寻找,找不到再到库里面取找。尽量优先使用,减少寻找所占用的资源。
  53. */
复制代码


效果是这样的:
Screen Shot 2021-08-25 at 6.47.28 PM.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-26 10:15:37 | 显示全部楼层
学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-26 21:13:15 | 显示全部楼层

回帖奖励 +1 鱼币

学习
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 20:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表