在以下程序输入中,格式应为:U-表示不占用,B-被黑色占用,W-被白色占用。该程序在初始化电路板后应询问用户配置,然后使用用户配置打印电路板。然后,它会相应打印“ W”和“ B”的可用移动。最后一步是要求从已使用过的棋子中获取棋子,如果它与已打印的棋子相匹配,则它会打印一条棋子有效的消息,然后使用有效棋子最后一次印制棋盘。
在打印配置好的板后,我在这里得到一些奇怪的输出。请在这里帮助,谢谢。
这是示例输入和预期输出:



#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
void boardInitialize(char board[26][26], int n);
void printBoard(char board[26][26], int n);
bool checkLegalMovesAvailable(char board[26][26], int N, char colour);
bool positionInBounds(int N, char row, char col);
void printMove(char board[26][26], int n);
bool checkLegalInDirection(char board[26][26],int N,char row,char col,char colour,int deltaRow,int deltaCol);
bool checkLegalInMove(char board[26][26], int N, char row, char col, char colour);

int main(void){
    int n;
    char board[26][26];
    printf("Enter the board dimension: ");
    scanf("%d",&n);
    boardInitialize(board,n);
    printBoard(board,n);
    if(checkLegalMovesAvailable(board,n,'W'))
        checkLegalMovesAvailable(board,n,'B');
    printMove(board,n);

    return (EXIT_SUCCESS);
}

//Function to initialize board
void boardInitialize(char board[26][26], int n){
    printf("  ");
    for(int i=0;i<n;i++){
        printf("%c",97+i);
    }
    printf("\n");
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            board[i][j]='U';
        }
    }
    board[(n/2)-1][(n/2)-1]='W';
    board[n/2][n/2]='W';
    board[(n/2)-1][n/2]='B';
    board[n/2][(n/2)-1]='B';
    for(int i=0;i<n;i++){
        printf("%c ",97+i);
        for(int j=0;j<n;j++){
            printf("%c",board[i][j]);
        }
        printf("\n");
    }
}

//Function to print board after configuration
void printBoard(char board[26][26], int n){
    printf("Enter board configuration:");
    printf("\n");
    char color,row,col;
    for(int i=0;(color!='!' && row!='!' && col!='!');i++){
        scanf(" %c%c%c",&color,&row,&col);
            board[row-'a'][col-'a']=color;
    }
    printf("  ");
    for(int i=0;i<n;i++){
        printf("%c",97+i);
    }
    printf("\n");
    for(int i=0;i<n;i++){
        printf("%c ",97+i);
        for(int j=0;j<n;j++){
            printf("%c",board[i][j]);
        }
        printf("\n");
    }
}

//function to print available moves after configuration
bool checkLegalMovesAvailable(char board[26][26], int N, char colour){
    int done=1;
    printf("Available moves for %c:\n",colour);
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(board[i][j]==colour){
                for(int deltaRow=-1;deltaRow<=1;deltaRow++){
                    for(int deltaCol=-1;deltaCol<=1 && done!=0;deltaCol++){
                        if((positionInBounds(N,('a'+deltaRow), ('a'+deltaCol))) && (checkLegalInDirection(board,N,('a'+deltaRow),('a'+deltaCol),colour,deltaRow,deltaCol)))
                            done++;
                    }
                }
            }
        }
    }
    return true;
}

//function to check if any move is legal in a specific direction
bool checkLegalInDirection(char board[26][26],int N,char row,char col,char colour,int deltaRow,int deltaCol){
    int r=row-'a', c=col-'a',count=2;
    if((board[r+deltaRow][c+deltaCol]!=colour) && (board[r+deltaRow][c+deltaCol]!='U')){
        for(int i=0;i<N;i++){
                if((board[r+(count*deltaRow)][c+(count*deltaCol)]!=colour) &&(board[r+(count*deltaRow)][c+(count*deltaCol)]!='U'))
                    count++;
                else
                    count--;
                printf("%c%c\n",(row+(count*deltaRow)),(col+(count*deltaCol)));
            }
            return true;
    }
    else
        if(board[r+deltaRow][c+deltaCol]==colour || board[r+deltaRow][c+deltaCol]=='U')
        return false;
    }

//function to check if the specified row,col lies within the board dimensions
bool positionInBounds(int N, char row, char col){
    int p=row-'a',q=col-'a';
    if(p>=0 && p<=N){
        if(q>=0 && q<=N)
            return true;
        else
            return false;
    }
    else
        return false;
}

//function to print board after a legal move
void printMove(char board[26][26], int n){
    char color,row,col;
    printf("Enter a move:\n");
    scanf(" %c%c%c",&color,&row,&col);
    board[row-'a'][col-'a']=color;
    if(checkLegalInMove(board,n,row,col,color)){
        printf("  ");
        for(int i=0;i<n;i++){
            printf("%c",97+i);
        }
        printf("\n");
        for(int i=0;i<n;i++){
            printf("%c ",97+i);
            for(int j=0;j<n;j++){
                printf("%c",board[i][j]);
            }
            printf("\n");
        }
    }
}

//function to check if any specific move is legal
bool checkLegalInMove(char board[26][26], int N, char row, char col, char colour){
    int r=row-'a',c=col-'a';
    for(int deltaRow=-1;deltaRow<=1;deltaRow++){
        for(int deltaCol=-1;deltaCol<=1;deltaCol++){
            if((positionInBounds(N,row,col)) && (checkLegalInDirection(board,N,('a'+r),('a'+c),colour,deltaRow,deltaCol))){
                printf("Valid move.\n");
                return true;
            }
            else{
                printf("Invalid move.\n");
                return true;
            }
        }
    }
}

最佳答案

这里有很多问题。这里有一些:

(1)在您的一个scanf调用中,您忘记了要存储结果的变量的地址。gcc对此发出警告:

scanf(" %c%c%c",color,row,col);


尝试将其更改为:

scanf(" %c%c%c",&color,&row,&col);


(2)在checkLegalInDirection中,当打印移动时,您要减去'a',这当然是错误的,因为您要打印字符而不是偏移量。所以改变:

printf("%c%c\n",(row+(count*deltaRow)-'a'),(col+(count*deltaCol)-'a'));


至:

printf("%c%c\n",(row+(count*deltaRow)),(col+(count*deltaCol)));


(3)checkLegalMovesAvailable应该返回一个bool,但是函数中的任何地方都没有return语句。这意味着,如果调用方尝试检查返回值,它将选择一些随机值。将return语句添加到该函数,并使其返回bool值。

我不认为这些是唯一的问题,但是我真的认为您需要花一些时间来解决这个问题,因此我将重新开始。希望这会有所帮助。

07-24 09:38
查看更多