VS环境下实现一个简单的三子棋游戏

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 3
#define col 3
#define NULL 0
void initBoard(char arr[row][col])        //初始化棋盘
{
    int i = 0, j = 0;
    for (i = 0; i < 3; i++)
    {
        for (j = 0; j < 3; j++)
        {
            arr[i][j] = ' ';
        }
    }
}
void menu(void)                      //打印开始菜单
{
    printf("1.play   0.exit\n");
    printf("请选择:>");

}
void ChessBoard(char a[row][col])      //打印棋盘
{
    int i,j;
    for (i = 0; i < 4; i++)
    {
        printf(" --- --- --- \n");
        if (i <= 2)
        {
            for (j = 0; j <= 2; j++)
            {
                printf("| %c ", a[i][j]);
            }
            if (j == 3)
            {
                printf("|\n");
            }
        }
    }
}
void PlayerMove(char a[row][col])
{
    int x,y;
    while (1)
    {
        printf("请输入坐标(格式:1 2):>");
        scanf("%d %d", &x, &y);
        x--;
        y--;                       //使得坐标从(1.1)开始
        if (a[x][y] == ' ')            //落点必须为空
        {
            a[x][y] = 'X';
            break;                  //输入成功跳出循环,结束
        }
        else
        {
            printf("错误输入\n");     
            continue;                  //输入错误再次循环,重新输入  
        }
    }
}
void RobotPlay(char a[row][col])
{
    int x = 0;
    int y = 0;
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (a[i][j] == ' ')
            {
                a[i][j] = '0';
                if (((a[i][0] == a[i][1]) && (a[i][1] == a[i][2])) && (a[i][0] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                else if (((a[0][j] == a[1][j]) && (a[1][j] == a[2][j])) && (a[0][j] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                else if (((a[0][0] == a[1][1]) && (a[0][0] == a[2][2])) && (a[1][1] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                else if (((a[0][2] == a[1][1]) && (a[0][2] == a[2][0])) && (a[1][1] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                a[i][j] = ' ';           //从第一个点开始优先检验是否存在可以使己方三个子相连的落点
                                         //若存在则置0并结束函数,不能存在则执行下一条语句
            }
        }
    }
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            if (a[i][j] == ' ')
            {
                a[i][j] = 'X';
                if (((a[i][0] == a[i][1]) && (a[i][1] == a[i][2])) && (a[i][0] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                else if( ((a[0][j] == a[1][j]) && (a[1][j] == a[2][j])) && (a[0][j] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                else if (((a[0][0] == a[1][1]) && (a[0][0] == a[2][2])) && (a[1][1] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                else if (((a[0][2] == a[1][1]) && (a[0][2] == a[2][0]))&&(a[1][1] != ' '))
                {
                    a[i][j] = '0';
                    return;
                }
                a[i][j] = ' ';           //从第一点开始检验是否存在使对方三子相连的落点
            }                             //若存在置0并结束函数,不存在则继续
        }
    }
    while (1)                               //不存在使得己方或对方三子相连时随机下点
    {
        srand((unsigned)time(NULL));
        i = rand() % 3;
        srand((unsigned)time(NULL));
        j = rand() % 3;
        if (a[i][j] == ' ')
        {
            a[i][j] = '0';
            return;
        }
    }

}   
char CheckWin(char a[row][col])
{
    int i,j;
    for (i = 0; i < row; i++)
    {
        if ((a[i][0] == a[i][1]) && (a[i][1] == a[i][2]))
        {
            return a[i][0];
        }
    }
    for (j = 0; j < col; j++)
    {
        if ((a[0][j] == a[1][j]) && (a[1][j] == a[2][j]))
        {
            return a[0][j];
        }
    }
    if ((a[0][0] == a[1][1]) && (a[1][1] == a[2][2]))
    {
        return a[1][1];
    }
    else if ((a[0][2] == a[1][1]) && (a[1][1] == a[2][0]))
    {
        return a[1][1];
    }                               //检验是否有三子相连的点,存在则返回该点
    for (i = 0; i < row; i++)              //不存在三字相连点时棋盘是否下满
    {                                 
        for (j = 0; j < col; j++)
        {
            if (a[i][j] == ' ')
            {
                return ' ';              //未下满返回空格继续下
            }
        }
    }
    return 'e';                  //下满则平局,返回e
}


int main()
{
    char arr[row][col] = { 0 };                   //创建2维数组用于存放棋子
    int input = 0;
    char ret;
    do{
        menu();
        scanf("%d", &input);
        switch (input)
        {
        case 1:
            initBoard(arr);                      //初始化棋盘,数组内容全部置空格
            ChessBoard(arr);                     //打印棋盘
            do
            {
                PlayerMove(arr);                 //玩家下
                ChessBoard(arr);
                if ((ret = CheckWin(arr)) != ' ')
                {
                    break;
                }                                //检验胜负
                RobotPlay(arr);                  //电脑下
                ChessBoard(arr);
                ret = CheckWin(arr);
            } while (ret == ' ');               //检验胜负
            if (ret == 'X')
            {
                printf("玩家赢\n");
            }
            else if (ret == '0')
            {
                printf("电脑赢\n");
            }
            else
            {
                printf("平局\n");
            }
            break;
        case 0:
            break;
        default:
            printf("输入错误请重新输入:>\n");
            break;
        }
    } while (input);                            //保证可再次进行游戏
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值