C语言三子棋Tick-Tck-Toe代码实现

三子棋游戏大家应该都玩过,游戏规则不做介绍,代码实现之前先一起过一遍思路!

1. 思维导图

在这里插入图片描述

2. 设计思路

结合上图,我们可以拆分为三个文件进行编写:

  1. test.c文件用于测试游戏的逻辑
    do…while函数,打印菜单并进行玩家输入判断
    如果玩家输入1,调用game函数
    如果玩家输入0, 直接break,跳出循环
    如果玩家输入其他值,直接break,跳出循环

    这里我们具体说一说game() function的逻辑,首先要对棋盘进行初始化,具体函数实现我们在game.c中会讲到,然后把初始化好的棋盘进行打印显示。其次无论是玩家还是电脑下的每一步棋,都需要对其状态进行检查:

    1. 玩家回合,下完一步棋后对棋盘进行打印
    2. 判断字符是否返回‘C’,否则游戏继续
    3. 电脑回合,下完一步棋后对棋盘进行打印
    4. 判断是否返回‘C’,否则游戏继续
    5. 如果不是字符‘C’
      1. 返回字符‘X’,表明玩家赢了
      2. 返回字符’O’,表面电脑赢了
      3. 返回字符’Q’,棋盘已满,平局
  2. game.c 用于相关函数实现

    1. 函数initBoard(),初始化棋盘的值都为空
    2. 函数DisplayBoard(),为了ROW和COL大小更通用
      1. 定义row行,row-1行不进行打印
      2. 定义col列,同理col-1列不进行打印,每行的内容先把棋盘的空值放进去后打印符号|,换行后对下边框进行打印---|,注意判断如果是col-1,符号|不进行打印。
      3. 棋盘展示好后,玩家开始进行下棋,结合用户习惯我们取值范围是在1~3之间,超过则表示非法越界或者棋盘的值不为空
    3. 函数ComputerMove(),这里电脑下棋的标准为:只判断棋盘里的值是否为空
    4. 函数isFull(),判断棋盘的是否已满,全满返回1,否则返回0
    5. 函数hasWinner(),判断是否有赢家:
      1. 对棋盘的每行进行判断是否值都相等且不为空
      2. 对棋盘的每列进行判断是否值都相等且不为空
      3. 对角的值判断是否都相等且不为空
  3. game.h 相关函数声明,引入必要头文件及各文件需要的函数进行声明,并初始化行和列是多大

3. 代码实现

test.c

#include "game.h"

void menu(){
   
    printf("****************************************\n");
    printf("*************  0. Exit   ***************\n");
    printf("*************  1. Play   ***************\n");
    printf("****************************************\n");
}

void game(){
   

    char board[ROW][COL];

    //init board
    initBoard(board, ROW, COL);
    
    //Show board
    DisplayBoard(board, ROW, COL);
    
    /*
     游戏状态检查:
     1. 玩家胜利, 返回X
     2. 电脑胜利, 返回O
     3. 平局, 返回Q
     4. 游戏继续, 返回C
     */
    char ret = 0; //get game status
    while(1)
    {
   
        //Player turn
        PlayerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        ret = hasWinner(board, ROW, COL);
        if(ret != 'C')
            break;
        
        //Computer turn
        ComputerMove(board, ROW, COL);
        DisplayBoard(board, ROW, COL);
        //Check whether got winner
        ret = hasWinner(board, ROW, COL);
        if(ret != 'C')
            break;
    }
    if(ret == 'X'){
   
        printf("Player winned \n");
    }else if(ret == 'O'){
   
        printf("Computer winned \n");
        
    }else{
   
        printf("Play Even \n"
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值