0

C で単純な tictactoe ゲームを作成しています。ただし、メイン関数でこのエラーが引き続き発生します。else ステートメントの前に必要な式がわかりません。プログラムの仕組みは、両方のプレイヤーからシンボルを取得し、ゲームを開始することです。

エラー:

tictac.c: In function ‘main’:
tictac.c:31: error: expected expression before ‘else’
tictac.c: At top level:
tictac.c:49: warning: conflicting types for ‘print’
tictac.c:30: warning: previous implicit declaration of ‘print’ was here
tictac.c:63: error: conflicting types for ‘check’
tictac.c:63: note: an argument type that has a default promotion can’t match an empty parameter name list declaration
tictac.c:29: error: previous implicit declaration of ‘check’ was here
tictac.c:89: warning: conflicting types for ‘move’
tictac.c:28: warning: previous implicit declaration of ‘move’ was here

コード:

char board[3][3];

int main(void)
{
    int first;
    char player1, player2;

    printf("Player 1: Choose your symbol: \n");
    player1 = getchar();

    printf("Player 2: Choose your symbol: \n");
    player2 = getchar();

    int i=0;
    int win;
    char turn;
    while(win == 0)
    {
        if((i%2) == 0)
            turn = player1;
        move(player1);
        win = check(player1);
        print();
        else
            turn = player2;
        move(player2);
        i++;
    }

    if (i == 8)
        printf("its a tie");
    else
        printf("the winner is %c", turn);

    return 0;
}

/*printing the board that takes in a placement int*/
void print(void)
{
    int r;
    printf("\n");
    for (r = 0; r < 3; r++){
        printf(" %c | %c | %c \n" , board[r][0], board[r][2], board[r][3]);
        if (r != 2)
            printf("___________\n");
    }
    printf("\n");
    return;
}

/*check to see if someone won*/
int check(char player)
{
    int r, c;

    for ( r = 0 ; r <3 ; r++)
    {
        if ((board[r][0] == player) && (board[r][1] == player) && (board[r][2] == player))
            return 1;
    }

    for ( c = 0 ; c <3 ; c++)
    {
        if ((board[0][c] == player) && (board[1][c] == player) && (board[2][c] == player))
            return 1;
    }

    if((board[0][0] == player) && (board[1][1] == player) && (board[2][2] == player))
        return 1;

    if((board[0][2] == player) && (board[1][1] == player) && (board[2][0] == player))
        return 1;

    return 0;
}

void move(char player)
{
    int place;
    printf("player1, enter placement: \n");
    scanf("%d", &place);

    if (place == 1)
        board[0][0] = player;
    else if (place == 2)
        board[0][1] = player;
    else if (place == 3)
        board[0][2] = player;

    else if (place == 4)
        board[1][0] = player;
    else if (place == 5)
        board[1][1] = player;
    else if (place == 6)
        board[1][2] = player;

    else if (place == 7)
        board[2][0] = player;
    else if (place == 8)
        board[2][1] = player;
    else if (place == 9)
        board[2][2] = player;
}
4

3 に答える 3

3

問題には 2 つのカテゴリがあります。

まず、関数のプロトタイプが必要です。のすぐ下#include、ただし の上にint main(void)、他の関数の宣言 (定義ではなく) を含める必要があります。

void print(void);
int check(char player);
void move(char player);

これが必要になるのは、C が、ファイルを通過する 1 回のパスで簡単にコンパイルできるように設計されているためです。コンパイラがこれらの関数を使用する前に認識していない場合、問題が発生する可能性があります。

2 番目の問題は、いくつかの場所でブレースが欠落していることです。たとえば、次のようになります。

if((i%2) == 0)
    turn = player1;
    move(player1);
    win = check(player1);
    print();
else
    turn = player2;
    move(player2);

ifステートメント (または 1forつまたは複数のステートメント) の本文に複数のステートメントが必要な場合whileは、本文を中かっこで囲む必要があります。

if((i%2) == 0)
{
    turn = player1;
    move(player1);
    win = check(player1);
    print();
}
else
{
    turn = player2;
    move(player2);
}

ここのように、他の場所で機能した唯一の理由は次のとおりです。

if (i == 8)
    printf("its a tie");
else
    printf("the winner is %c", turn);

…の呼び出しという 1 つのステートメントしかないということprintfです。複数のステートメントには中かっこが必要です。

于 2013-04-20T04:58:14.717 に答える
0

このコードに間違いがあります

        if((i%2) == 0)
                turn = player1;
                move(player1);
                win = check(player1);
                print();
        else
                turn = player2;
                move(player2);        
        i++;

control flow (if,else-if..)またはに複数行の body を記述する場合は、bodyを定義するためiteration loopingに putする必要があります。{}

あなたのコードは

 if((i%2) == 0){
                turn = player1;
                move(player1);
                win = check(player1);
                print();
       }
        else{
                turn = player2;
                move(player2); 
        }       
        i++;

printcheck、のプロトタイプ関数を宣言する必要がありますmove。それ以外の場合は、デフォルトのプロトタイプが使用されます。

于 2013-04-20T05:00:07.883 に答える
0

if/else の後に 1 行しかない場合は、中括弧のみを省略できます。あなたのエラーはここにあります:

        if((i%2) == 0)
            turn = player1;
            move(player1);
            win = check(player1);
            print();
    else
            turn = player2;
            move(player2);      

中括弧が必要です。また、9 つの if ステートメントの代わりに、下部にあるヒントとして、次のようにすることもできます。

board[(place-1)/3][(place+2) % 3] = player;

これは、move() 関数の 9 つの if ステートメントと同等である必要があります。

于 2013-04-20T05:07:38.627 に答える