千家信息网

C语言如何实现简易版三子棋

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章给大家分享的是有关C语言如何实现简易版三子棋的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言test.c 放游戏的测试逻辑--调用game.c game.h游戏模
千家信息网最后更新 2026年11月02日C语言如何实现简易版三子棋

这篇文章给大家分享的是有关C语言如何实现简易版三子棋的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

test.c 放游戏的测试逻辑--调用game.c game.h

游戏模块:

game.c 放游戏的实现逻辑

game.h 放游戏实现函数的声明

step1.初始化棋盘内值为空格

思路

1.初始化棋盘内的值

2.棋盘中的数组内容应当全部是空格

3.为了可以方便的改变棋盘的大小,用一个宏定义,方便修改棋盘的大小;例如将3*3的棋盘改成5*5的棋盘只需要将宏定义后的数字改变即可

5*5棋盘:

#define ROW 5 //行#define COL 5 //列#include void InitBoard(char board[ROW][COL],int row, int col);

3*3棋盘:

#define ROW 3 //行#define COL 3 //列#include void InitBoard(char board[ROW][COL],int row, int col);
void InitBoard(char board[ROW][COL], int row, int col){        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                for (j = 0; j < col; ++j)                {                        board[i][j] = ' ';//初始化为一个空格                }        } }

step2.打印棋盘

思路

1.观察棋盘

2.每一行先打印 %c 和 |

printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);

3.然后打印 --- 和 |

printf("---|---|---\n");

4.得到普通版本:

void DisplayBoard(char board[ROW][COL], int row, int col){        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                //先打印数据                 printf(" %c | %c | %c\n", board[i][0], board[i][1], board[i][2]);                //打印分割行                if(i

·可是这样的棋盘打印的好吗?

·不好,只能打印3行3列的棋盘;如果要打印5*5棋盘需要重新写大量代码,不方便扩展!

·可扩展版

思路

1.我们发现每一个数据行: %c | 作为一个单元,最后一列 只打印%c

2. 打印分割行: ---| 作为1个单元 ,最后一列 只打印---

void DisplayBoard(char board[ROW][COL], int row, int col){        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                for (j = 0; j < col; ++j)//打印数据                {                        printf(" %c ", board[i][j]);                        if(j

step3.玩家下棋

思路

玩家下棋需要考虑3种情况-->(需要使用if语句)

1.棋盘位置没有值,即为空格 -->输入

2.棋盘位置有值-->该坐标被占用,请重新输入(需要使用循环语句)

3.输入坐标超过了棋盘大小-->坐标非法!请重新输入(需要使用循环语句)

void player_move(char board[ROW][COL], int row, int col){        printf("玩家下棋:>");        int x = 0;        int y = 0;        while (1)        {                scanf("%d %d", &x, &y);                if (x >= 1 && x <= row && y >= 1 && y <= col)                {                        if (board[x - 1][y - 1] == ' ')                        {                                board[x - 1][y - 1] = '*';                                break;                        }                        else                        {                                printf("该坐标被占用,请重新输入!\n");                        }                }                else                {                        printf("坐标非法!请重新输入!\n");                }        }}

step4.电脑下棋

思路

1.电脑随机下棋 需要使用一个产生随机值的库函数 rand()

使用rand前必须要先声明一个srand

void game(){        srand((unsigned int)time(NULL));     ....}

2.电脑下棋的范围是 行号0-2 列号0-2;为了将随机值限定在这个范围,我们需要%3

3.判断随机的坐标位置有没有被占用(if判断)-->如果占用,重新计算随机值(循环)

注意:这里为了丰富一下循环的种类,采用了goto语句!

void computer_move(char board[ROW][COL], int row, int col){        int x = 0;        int y = 0;        printf("电脑下棋\n");again:        x = rand() % ROW;//0-2        y = rand() % ROW;//0-2        //判断坐标有没有被占用        if (board[x][y] == ' ')        {                board[x][y] = '#';//生成的数字已经是0-2的范围了,不需要再减1        }        else        {                goto again;        }}

step5.判断棋盘是不是满了

思路

1.遍历二维数组(循环)

2.判断二维数组元素中的值有无' ',如果含有空格,说明棋盘没满-->return 0

3.如果遍历完没有空格' ' -->return1

int is_full(char board[ROW][COL], int row, int col)//判断函数是不是满了{        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                for (j = 0; j < col; ++j)                {                        if (board[i][j] == ' ')                        {                                return 0;                        }                }        }        return 1;}

step6.判断输赢

·普通版

思路

1.四种结局

  • 一行相同元素赢

  • 一列相同元素赢

  • 对角线相同元素赢

  • 平局--调用step5中的函数

2.函数的返回值设置

  • 玩家赢--return '*'

  • 电脑赢--return '#'

  • 平局--return 'Q'

  • 游戏继续--return 'C'

char is_win(char board[ROW][COL], int row, int col){        int i = 0;        for (i = 0; i < row; ++i)//3行的判断        {                if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')                {                        return board[i][0];                }        }        for (i = 0; i < col; ++i)//3列的判断        {                if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')                {                        return board[1][i];                }        }        //对角线的判断        if (board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')        {                return board[1][1];        }        if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')        {                return board[1][1];        }        //判断平局        if (is_full(board, row, col))//在函数内部传递的实参        {                return 'Q';        }         //游戏继续        return 'C';}

step7.最终测试三种情况

game.h

#define _CRT_SECURE_NO_WARNINGS 1#define ROW 3 //行#define COL 3 //列#include#include#include void InitBoard(char board[ROW][COL],int row, int col);//初始化棋盘void DisplayBoard(char board[ROW][COL], int row, int col);//打印棋盘void player_move(char board[ROW][COL], int row, int col);//玩家下棋void computer_move(char board[ROW][COL], int row, int col);//电脑下棋 //判断输赢的代码//玩家赢 ---- '*'//电脑赢 ---- '#'//平局 ---- 'Q'//继续 ---- 'C'char is_win(char board[ROW][COL], int row, int col);//还是要检测棋盘,传入棋盘值

game.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h" void InitBoard(char board[ROW][COL], int row, int col){        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                for (j = 0; j < col; ++j)                {                        board[i][j] = ' ';//初始化为一个空格                }        } } void DisplayBoard(char board[ROW][COL], int row, int col){        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                for (j = 0; j < col; ++j)//打印数据                {                        printf(" %c ", board[i][j]);                        if(j");        int x = 0;        int y = 0;        while (1)        {                scanf("%d %d", &x, &y);                if (x >= 1 && x <= row && y >= 1 && y <= col)                {                        if (board[x - 1][y - 1] == ' ')                        {                                board[x - 1][y - 1] = '*';                                break;                        }                        else                        {                                printf("该坐标被占用,请重新输入!\n");                        }                }                else                {                        printf("坐标非法!请重新输入!\n");                }        }} void computer_move(char board[ROW][COL], int row, int col){        int x = 0;        int y = 0;        printf("电脑下棋\n");again:        x = rand() % ROW;//0-2        y = rand() % ROW;//0-2        //判断坐标有没有被占用        if (board[x][y] == ' ')        {                board[x][y] = '#';//生成的数字已经是0-2的范围了,不需要再减1        }        else        {                goto again;        }} int is_full(char board[ROW][COL], int row, int col)//判断函数是不是满了{        int i = 0;        int j = 0;        for (i = 0; i < row; ++i)        {                for (j = 0; j < col; ++j)                {                        if (board[i][j] == ' ')                        {                                return 0;                        }                }        }        return 1;} char is_win(char board[ROW][COL], int row, int col){        int i = 0;        for (i = 0; i < row; ++i)//3行的判断        {                if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')                {                        return board[i][0];                }        }        for (i = 0; i < col; ++i)//3列的判断        {                if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')                {                        return board[1][i];                }        }        //对角线的判断        if (board[0][0]==board[1][1]&&board[1][1]==board[2][2]&&board[1][1]!=' ')        {                return board[1][1];        }        if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')        {                return board[1][1];        }        //判断平局        if (is_full(board, row, col))//在函数内部传递的实参        {                return 'Q';        }         //游戏继续        return 'C';}

test.c

#include"game.h"  void menu(){        printf("***************************\n");        printf("********* 1.play **********\n");        printf("********* 0.quit **********\n");        printf("***************************\n");} void game(){        srand((unsigned int)time(NULL));        //数据存储到一个二维数组中,玩家下棋是'*' ,电脑下棋是'#'        char board[ROW][COL] = { 0 };        InitBoard(board, ROW, COL);//初始化棋盘        //打印棋盘        DisplayBoard(board, ROW, COL);        //下棋        char ret='0';        while (1)        {                player_move(board,ROW,COL);//下到这个ROW COL的棋盘上去                DisplayBoard(board, ROW, COL);                ret = is_win(board, ROW, COL);                if (ret!='C')                {                        break;                }                computer_move(board, ROW, COL);                DisplayBoard(board, ROW, COL);                ret = is_win(board, ROW, COL);                if (ret != 'C')                {                        break;                }        }        if (ret == '*')        {                printf("玩家赢");        }        else if (ret == '#')        {                printf("电脑赢");        }        else        {                printf("平局");        }}    void test(){        int input = 0;        do        {                menu();                printf("请输入:");                scanf("%d", &input);                switch (input)                {                case 1:                        game();                        break;                case 0:                        printf("退出游戏\n");                        break;                default:                        printf("选择错误\n");                        break;                }         } while(input);} int main(){        test();        return 0;}

感谢各位的阅读!关于"C语言如何实现简易版三子棋"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

棋盘 坐标 电脑 输入 函数 玩家 思路 空格 平局 数据 循环 元素 数组 范围 语句 相同 位置 内容 大小 对角 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 互联网科技公司简介 哈尔滨大商圈互联网科技有限公司 互联网科技有限公司图片 科技与互联网发展 中国互联网科技发展 鑫亿盛互联网科技 百单互联网科技有限公司 互联网科技论坛 成都狮子座互联网科技 青岛中康互联网医疗科技有限公司 互联网大会黑科技排名 浙江互联网科技研学营 崇明区互联网教育科技诚信经营 厦门千工互联网科技有限公司 米聚互联网科技南京有限公司排面 云南省自由互联网科技有限公司 上海万顺科技互联网有限公司招聘 现代互联网科技公司 华人运通互联网科技公司 互联网科技公司经营范围 北京路客互联网科技有限公司 互联网是不是新科技 岳阳华臻互联网科技有限公司 江阴互联网智能科技产品进口 银川新华互联网科技学校联系电话 互联网新科技动漫ppt素材 富国互联网科技002692 中国新注册互联网科技 广西泛欧互联网科技有限公司
0