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

来源:互联网 发布:清理后台的软件 编辑:程序博客网 时间:2024/05/21 00:18
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<time.h>#define row 3#define col 3#define NULL 0void 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;}
阅读全文
0 0