codeTdolphin 2023-10-09 18:23 采纳率: 0%
浏览 6

c语言三子棋问题,急

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void OriginBoard(char board[ROW][COL], int row, int col)//1st初始化棋盘函数
{

    int i = 0;
    int j = 0;
    for (i = 0;i < row;i++)
    {
        for (j = 0;j < col;j++)
        {
            board[i][j] = ' ';//初始化棋盘放空格
        }
    }
}

void PrintBoard(char board[ROW][COL], int row, int col)//2nd将棋盘打印出来
{
        int i = 0;
        int j = 0;
        for (i = 0;i < row;i++)
        {
            for (j = 0;j < col;j++)
            {
                printf(" %c ", board[i][j]);
                if (j < col)
                {
                    printf("|");    
                }

            }//打印数据
            printf("\n");//勿忘
            if (i < row - 1)
            {
                for (j = 0;j < col;j++)
                {
                    if (j < col)
                    {
                        printf("---");
                        printf("|");
                    }
                }
            }//打印分割行
            printf("\n");//一开始一直卡这里了卧槽,忘记打印完分割行也要换行了(要根据错误的形状来推错误的原因!!)
        }
}

void Player(char board[ROW][COL], int row, int col)//3rd玩家下棋
{
    printf("玩家下棋,请输入诸如1*1这样的坐标,你的棋子是*\n");
    int i = 0;
    int j = 0;
        scanf("%d*%d", &i, &j);
        while (1)
        {
            if (i >= 1 && j>=1&& i <= row && j <= col && board[i - 1][j - 1] == ' ')//你不加个循环万一输入错误就没了
            {
                board[i - 1][j - 1] = '*';
                break;//跳出去就好了
                //PrintBoard(board, row, col);写game里
            }
            else
            {
                printf("坐标非法,请重新输入\n");
            }
        }
}

void Computer(char board[ROW][COL], int row, int col)//4th电脑下棋
{
    printf("电脑下棋\n");
    row = ROW;
    col = COL;
    int i = rand() % row;
    int j = rand() % col;
        //scanf("%d*%d", &i, &j); 你md又忘了,scanf是手动输入,你要电脑自己下就不用scanf了
    while (1)
    {
        if (i>=1&&j>=1&&i < row && j < col && board[i][j] == ' ')
        {
            board[i][j] = '#';
            break;
            //PrintBoard(board, row, col);
        }
    }
}
//玩家赢返回*
//电脑赢返回#
//平局返回Q
//继续返回C
int Isfull(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;
}
char WOL(char board[ROW][COL], int row, int col)//5th判断输赢:分横竖斜
{
    int i = 0;
    for (i = 0;i < row;i++)
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2]&&board[i][1]!=' ')//写横的
            return board[i][1];
    }
    int j = 0;
    for (j = 0;j < col;j++)//写竖的
    {
        if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
            return board[1][j];
    }
    //两种斜的
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
        return board[1][1];
    if (board[1][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
        return board[1][1];
    //平局逻辑
    if (Isfull(board, row, col))
    {
        return 'Q';
    }
    return 'C';
}

void GAME()
{
    //初始化棋盘(就是个二维的数组)
    char board[ROW][COL];
    int row = ROW;
    int col = COL;
    int i = 0;
    int j = 0;
    OriginBoard(board,row,col);
    PrintBoard(board, row, col);
    char ret = 0;//char ret = WOL(board, row, col);//我懂了,难怪返回空格,因为你一开始就初始化它是空格了
    while (1)//只要棋盘没满就一直循环下
    {
        Player(board, row, col);
        PrintBoard(board, row, col);//(少了的)

        ret = WOL(board, row, col);//chatgpt发现的,你没有及时更新ret的值
        if (ret != 'C')
        {
            break;
        }
        //判断输赢(少了的)
        Computer(board, row, col);
        //你写这个干嘛WOL(board, row, col);
        PrintBoard(board, row, col);

        ret = WOL(board, row, col);//chatgpt发现的,你没有及时更新ret的值
        if (ret != 'C')
        {
            break;
        }
        //判断输赢(每次下完棋判断输赢)
    }
    if (ret=='*')
        printf("玩家赢\n");
    else if (ret=='#')
        printf("电脑赢\n");
    else
        printf("平局\n");
    PrintBoard(board, row, col);
}


为什么我的三子棋下到一半就电脑下棋就不会下了,目前只有玩家赢的情况可以正常运行,真看不出来问题了

  • 写回答

2条回答 默认 最新

  • 老僧& 2023-10-09 18:50
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define ROW 3
    #define COL 3
    
    void InitBoard(char board[ROW][COL]) {
        for (int i = 0; i < ROW; i++) {
            for (int j = 0; j < COL; j++) {
                board[i][j] = ' ';
            }
        }
    }
    
    void PrintBoard(char board[ROW][COL]) {
        for (int i = 0; i < ROW; i++) {
            for (int j = 0; j < COL; j++) {
                printf(" %c ", board[i][j]);
                if (j < COL - 1) {
                    printf("|");
                }
            }
            printf("\n");
            if (i < ROW - 1) {
                printf("---|---|---\n");
            }
        }
    }
    
    int IsFull(char board[ROW][COL]) {
        for (int i = 0; i < ROW; i++) {
            for (int j = 0; j < COL; j++) {
                if (board[i][j] == ' ') {
                    return 0;
                }
            }
        }
        return 1;
    }
    
    char CheckWin(char board[ROW][COL]) {
        for (int 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];
            }
            // 检查列
            if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][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];
        }
        return 'C'; // 游戏继续
    }
    
    void PlayerMove(char board[ROW][COL]) {
        int row, col;
        printf("玩家下棋,请输入行和列(例如:1 1): ");
        while (1) {
            scanf("%d %d", &row, &col);
            if (row >= 1 && row <= 3 && col >= 1 && col <= 3 && board[row - 1][col - 1] == ' ') {
                board[row - 1][col - 1] = 'X';
                break;
            } else {
                printf("坐标非法或位置已被占用,请重新输入: ");
            }
        }
    }
    
    void ComputerMove(char board[ROW][COL]) {
        int row, col;
        printf("电脑下棋:\n");
        while (1) {
            row = rand() % ROW;
            col = rand() % COL;
            if (board[row][col] == ' ') {
                board[row][col] = 'O';
                break;
            }
        }
    }
    
    int main() {
        char board[ROW][COL];
        char result;
        
        InitBoard(board);
        srand(time(NULL));
    
        printf("欢迎来玩三子棋游戏!\n");
        printf("玩家的棋子是 'X',电脑的棋子是 'O'\n");
    
        while (1) {
            PrintBoard(board);
            PlayerMove(board);
            result = CheckWin(board);
            if (result != 'C') {
                break;
            }
    
            PrintBoard(board);
            ComputerMove(board);
            result = CheckWin(board);
            if (result != 'C') {
                break;
            }
        }
    
        PrintBoard(board);
    
        if (result == 'X') {
            printf("恭喜,玩家赢了!\n");
        } else if (result == 'O') {
            printf("电脑赢了!\n");
        } else {
            printf("平局!\n");
        }
    
        return 0;
    }
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月9日

悬赏问题

  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 找一个QT页面+目标识别(行人检测)的开源项目
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码