C语言小游戏:三字棋(增强版本)

    上一篇博客发表了关于用C语言来实现小游戏三字棋的代码,但是这个代码中的电脑难度可谓是极低,我通过改变电脑落子的算法,增强了电脑的难度。

具体思路为:
一、让电脑优先判断自己是否有可能赢。
二、判断自己可能赢的前提是,让自己能够知道自己在行、列、两条对角线中是否有两个相同的棋子,并且第三个地方为空,也就是‘ ’。
三、如果电脑没有任何赢的可能,那么判断玩家在有行、列、两条对角线中是否有两个相同的棋子,并且第三个地方为空,进行对玩家的堵截。
四、若电脑跟玩家都没有可能赢的情况那么让电脑自己随机产生一个坐标进行落子。

以下为增强后的电脑下棋代码:
void RobotMove(char board[ROW][COL], int row, int col)//电脑走
{
    int i = 0;
    int j = 0;

    int a = 0;//a 用于限制一旦有一种判断成功,就不再进行其他判断
    int b = 0;//b 用于对电脑即将赢的时候,不同判断产生后,进入不同的case
    int c = 0;//c 用于对玩家即将赢的时候,不同判断产生后,进入不同的case

    //电脑有两个连成线
    if (a == 0)
    {
        for (i = 0; i < ROW; i++)//判断行
        {
            if ((board[i][0] == board[i][1] && board[i][0] == 'O'&&board[i][2] != 'X')
                || (board[i][1] == board[i][2] && board[i][1] == 'O'&&board[i][0] != 'X')
                || (board[i][0] == board[i][2] && board[i][0] == 'O'&&board[i][1] != 'X'))
            {
                a = 1;
                b = 1;
                break;
            }
        }
    }


    if (a == 0)
    {
        for (j = 0; j < ROW; j++)//判断列
        {
            if ((board[0][j] == board[1][j] && board[0][j] == 'O'&&board[2][j] != 'X')
                || (board[1][j] == board[2][j] && board[1][j] == 'O'&&board[0][j] != 'X')
                || (board[0][j] == board[2][j] && board[0][j] == 'O'&&board[1][j] != 'X'))
            {
                b = 2;
                a = 1;
                break;
            }
        }
    }


    if ((board[0][0] == board[1][1] && board[0][0] == 'O'&&board[2][2] != 'X')//第一条斜对角
        || (board[1][1] == board[2][2] && board[1][1] == 'O'&&board[0][0] != 'X')
        || (board[0][0] == board[2][2] && board[0][0] == 'O'&&board[1][1] != 'X')
        && (a == 0))
    {
        b = 3;
        a = 1;
    }

    if ((board[0][2] == board[1][1] && board[0][2] == 'O'&&board[2][0] != 'X')//第二条斜对角
        || (board[1][1] == board[2][0] && board[1][1] == 'O'&&board[0][2] != 'X')
        || (board[0][2] == board[2][0] && board[0][2] == 'O'&&board[1][1] != 'X')
        && (a == 0))
    {
        b = 4;
        a = 1;
    }

    switch (b)
    {
    case 1:
        do
        {
            j = rand() % 3;//固定行不变,改变列,让棋子进入空白处
            if (board[i][j] == ' ')
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;

    case 2:
        do
        {//rand()%3 产生0 1 2 之间的随机数
            i = rand() % 3;//固定列不变,改变行,让棋子进入空白处
            if (board[i][j] == ' ')
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;

    case 3:
        do
        {//第一条对角线
            i = rand() % 3;
            j = rand() % 3;
            if ((i == j) && (board[i][j] == ' '))
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;

    case 4:
        do
        {//第二条对角线
            i = rand() % 3;
            j = rand() % 3;
            if ((i == j) && (board[i][j] == ' ') && (i == 1) ||
                (i == j + 2) && (board[i][j] == ' ') ||
                (j == i + 2) && (board[i][j] == ' '))
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;
    }

    //玩家有两个连起来的时候
    if (a == 0)
    {
        for (i = 0; i < ROW; i++)
        {
            if ((board[i][0] == board[i][1] && board[i][0] == 'X'&&board[i][2] != 'O')
                || (board[i][1] == board[i][2] && board[i][1] == 'X'&&board[i][0] != 'O')
                || (board[i][0] == board[i][2] && board[i][0] == 'X'&&board[i][1] != 'O'))
            {
                c = 1;
                a = 1;
                break;
            }
        }
    }


    if (a == 0)
    {
        for (j = 0; j < ROW; j++)
        {
            if ((board[0][j] == board[1][j] && board[0][j] == 'X'&&board[2][j] != 'O')
                || (board[1][j] == board[2][j] && board[1][j] == 'X'&&board[0][j] != 'O')
                || (board[0][j] == board[2][j] && board[0][j] == 'X'&&board[1][j] != 'O'))
            {
                c = 2;
                a = 1;
                break;
            }
        }
    }



    if ((board[0][0] == board[1][1] && board[0][0] == 'X'&&board[2][2] != 'O')
        || (board[1][1] == board[2][2] && board[1][1] == 'X'&&board[0][0] != 'O')
        || (board[0][0] == board[2][2] && board[0][0] == 'X'&&board[1][1] != 'O')
        && (a == 0))
    {
        c = 3;
        a = 1;
    }

    if ((board[0][2] == board[1][1] && board[0][2] == 'X'&&board[2][0] != 'O')
        || (board[1][1] == board[2][0] && board[1][1] == 'X'&&board[0][2] != 'O')
        || (board[0][2] == board[2][0] && board[0][2] == 'X'&&board[1][1] != 'O')
        && (a == 0))
    {
        c = 4;
        a = 1;
    }

    switch (c)
    {
    case 1:
        do
        {
            j = rand() % 3;
            if (board[i][j] == ' ')
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;

    case 2:
        do
        {
            i = rand() % 3;
            if (board[i][j] == ' ')
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;

    case 3:
        do
        {
            i = rand() % 3;
            j = rand() % 3;
            if ((i == j) && (board[i][j] == ' '))
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;

    case 4:
        do
        {
            i = rand() % 3;
            j = rand() % 3;
            if ((i == j) && (board[i][j] == ' ') && (i == 1) ||
                (i == j + 2) && (board[i][j] == ' ') ||
                (j == i + 2) && (board[i][j] == ' '))
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
        break;
    }

    //若没有任何两个连线,则随机产生一个坐标
    if (a == 0)
    {
        do
        {
            i = rand() % 3;
            j = rand() % 3;

            if (board[i][j] == ' ')
            {
                board[i][j] = 'O';
                break;
            }
        } while (1);
    }
}
如有问题,请及时联系博主,便于及时更改错误,谢谢大家!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值