miaomiao328 2016-03-27 13:16 采纳率: 100%
浏览 4401
已采纳

写一个三子棋,棋盘游戏,用c语言

输出初始棋盘,分为电脑和玩家输入,输入一次打印一次棋盘,判断谁先三点一线完成谁赢最后输出结果

  • 写回答

2条回答 默认 最新

  • 小灸舞 2016-03-27 14:06
    关注
     #include<stdio.h>
    #include<stdlib.h>
    #include<time.h> 
    
    
    char arr[3][3] = { 0 };            //直接定义外部变量所有的函数可以直接使用    因为考虑到棋盘大小是固定的
    int size = 9;                   //棋盘大小固定  每下一个子都会使可以下子的容量-1
    void chessboard()                                    //打印棋盘
    {
        int i = 0, j = 0;
        printf("   |   |   \n");
        for (i = 0; i < 3; i++)
        {
            printf("_%c_|_%c_|_%c_\n", arr[i][0], arr[i][1], arr[i][2]);   //棋盘对应位置下棋
            if (i < 2)
                printf("   |   |   \n");
        }
    }
    void player()                                       //玩家下棋
    {
        int m = 0, n = 0;
        printf("player(@):");              //输入的是对应的坐标    
        scanf_s("%d%d", &m, &n);          //玩家输入的坐标必须在范围内并且不能是被下过的地方
        if (m<1 || m>3 || n<1 || n>3 || arr[m - 1][n - 1] != ' ')
        {
            printf("this place can not play!\n");    //如果不符合要求则继续调用这个函数
            player();
        }
        else
        {
            arr[m - 1][n - 1] = '@';   //将棋子放入相应的内容 棋盘容量-1
            size--;
        }
    }
    
    void computer()                                     //电脑下棋
    {
        printf("computer(#):\n");      
        int m = 0, n = 0;
        srand(time(NULL));          //电脑的坐标是随机产生的   以时间为种子
        m = rand() % 3;            //对3取余产生0-2的随机数赋给数组下标
        n = rand() % 3;
        while (arr[m][n] != ' ')     //如果产生的坐标不符合要求则循环产生      (效率比较低)
        {
            m = rand() % 3;
            n = rand() % 3;
        }
        arr[m][n] = '#';               //操作后容量-1
        size--;            
    }
    
    int winner()                                        //判断获胜者
    {                            //虽然代码多但是效率高  本来想采用函数比较考虑到效率太低就放弃了
        if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '@') ||
            (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '@') ||
            (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '@') ||
            (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '@') ||
            (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '@') ||
            (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '@') ||
            (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '@') ||
            (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '@'))
            return 1;                        //玩家获胜
        else if ((arr[0][0] == arr[0][1] && arr[0][1] == arr[0][2] && arr[0][2] == '#') ||
            (arr[1][0] == arr[1][1] && arr[1][1] == arr[1][2] && arr[1][2] == '#') ||
            (arr[2][0] == arr[2][1] && arr[2][1] == arr[2][2] && arr[2][2] == '#') ||
            (arr[0][0] == arr[1][0] && arr[1][0] == arr[2][0] && arr[2][0] == '#') ||
            (arr[0][1] == arr[1][1] && arr[1][1] == arr[2][1] && arr[2][1] == '#') ||
            (arr[0][2] == arr[1][2] && arr[1][2] == arr[2][2] && arr[2][2] == '#') ||
            (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[2][2] == '#') ||
            (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] == '#'))
            return 0;                     //电脑获胜
        else if (size == 0)
            return -1;                     //平局
        else
            return 2;           //只是为了消除编译的警告并无实际意义
    }
    
    int main()
    {
        int i = 0, j = 0;    //将数组初始化为空格
        for (i = 0; i < 3; i++)
        {
            for (j = 0; j < 3; j++)
            {
                arr[i][j] = ' ';
            }
        }
        while (1)        //循环对弈直到一方获胜或者平局
        {
            chessboard();          //循环每次开始都打印棋盘
            if (winner() == -1 || winner() == 0 || winner() == 1)   
            {
                break;
            }
            player();        //每下一个子后都打印棋盘 然后就判断又没有人获胜
            chessboard();
            if (winner() == -1 || winner() == 0 || winner() == 1)
            {
                break;
            }
            computer(); 
        }
        if (winner() == 1)
        {
            printf("player win!\n");
        }
        else if (winner() == 0)
        {
            printf("computer win!\n");
        }
        else
        {
            printf("no one win!\n");
        }
        system("pause");
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?