c语言实现三子棋

一、问题描述

用c语言实现三子棋。

二、实现基本流程

  1. 菜单选择界面;

  1. 创建并且初始化棋盘;

  1. 打印棋盘;

  1. 分别是玩家下棋和电脑下棋;

  1. 判断输赢;

实现流程大致就是这样。

三、具体实现

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

分别在编译其中创建test.c game.c 源文件和game.h头文件,这样会使代码更加简练,便于观察。

    • 创建一个菜单

void menu()
{
    printf("***********************\n");
    printf("******** 1.play *******\n");
    printf("******** 2.exit *******\n");
    printf("***********************\n");
}

3.创建数组也就是棋盘

#define ROW 3//行
#define COL 3//列
char board [ROW][COL];

使用宏定义的原因:

1.推高代码可读性,后续代码中遇到3,方便理解含义。

2.提高扩展性,如果将来要修改棋盘尺寸,代码修改会很方便。

4.初始化棋盘

void init_board(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            board[i][j] = ' ';
        }
    }
}

5.打印棋盘

void print(char board[ROW][COL], int row, int col)
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        int j = 0;
        for (j = 0; j < col; j++)
        {
            printf(" %c ", board[i][j]);
            if (j < col - 1)
                printf("|");
        }
        printf("\n");
        if(i<row-1)
        {
            for (j = 0; j < col; j++)
            {
                printf("---");
                if (j < row - 1)
                {
                    printf("|");
                }
            }
            printf("\n");
        }
    }
}

6.玩家下棋

注意:

1.玩家落子需要在棋盘范围内。

2.玩家要在棋盘上空的地方落子。

3.如果输入的坐标不满足要重新输入。

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

void player_move(char board[ROW][COL], int row, int col)
{
    printf("玩家下棋:");
    while (1)
    {
        int x = 0;
        int y = 0;
        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("此坐标已被占用");
        }
        else
        {
            printf("请输入正确坐标\n");
        }
    }
    
}

7.电脑下棋

注意:

1.要在主函数中使用srand((unsigned int)time(0))

将时间作为随机数种子,确保得到的行列坐标是真随机。

2.要在棋盘上空的地方下棋。

 void computer_move(char board[ROW][COL], int row, int col)
{
    printf("电脑下棋:\n");
    while (1)
    {
        
        int x = rand() % row;
        int y = rand() % col;
        if (board[x][y] == ' ')
        {
            board[x][y] = '#';
            break;
        }
    }
}

8.判断是否已满

1.判定是否和棋

(1)调用IsFull函数。

(2)如果数组中有元素为’ ‘,那么没满,返回0。如果全不为’ ',满了,返回1。

(3)如果棋盘满了未分出胜负,和棋。

static 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;
}

9.判断输赢

此处约定返回结果的含义:

(1)‘*’ 表示玩家获胜

(2)‘#’ 表示电脑获胜

(3)’ Q’ 表示胜负未分

(4) ‘C’ 表示和棋

2.判定电脑玩家胜利

(1)判定所有的行

(2)判定所有的列

(3)判定两条对角线

char is_win(char board[ROW][COL], int row, int col)
{
    int i = 0;
    //判断行
    for (i = 0; i < row; i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
        {
            return board[i][0];
        }
    }
    //判断lie
    for (i = 0; i < col; i++)
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
        {
            return board[0][i];
        }
    }
    //判断对角线
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
    {
        return board[0][0];
    }
    if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ')
    {
        return board[0][2];
    }
    //平局
    if (is_full(board,row,col) == 1)
    {
        return 'Q';
    }
    //继续
    return 'C';

}

主函数

int main()
{
    srand((unsigned int)time(NULL));
    int input = 0;
    do
    {
        menu();
        printf("请输入数字:");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            game();
            break;
        case 0:
            printf("结束游戏\n");
            break;
        default:
            printf("请输入正确的数字");
            break;
        }
    } while (input);
    return 0;
}

游戏设计函数

void game()
{
    char board [ROW][COL];
    init_board(board, ROW, COL);
    print(board, ROW, COL);
    char ret = 0;
    while (1)
    {
        player_move(board, ROW, COL);
        print(board, ROW, COL);
        ret=is_win(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
        computer_move(board, ROW, COL);
        print(board, ROW, COL);
        ret = is_win(board, ROW, COL);
        if (ret != 'C')
        {
            break;
        }
        
    }
    if (ret == '#')
        printf("电脑获胜\n");
    else if (ret == '*')
        printf("玩家获胜\n");
    else if (ret == 'Q')
        printf("平局\n");

}

这样就算完成一个三子棋了,里面有什么错误还请大佬们指出来。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值