2013-04-20 96 views
0

我在C中創建了一個簡單的tictactoe遊戲。但是我一直在我的主函數中收到這個錯誤,我不知道在我的else語句之前它想要什麼樣的期望表達式。程序的工作原理是我從兩個玩家那裏得到符號,他們開始遊戲。Tictactoe c程序錯誤主要功能

錯誤:

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; 
} 

回答

0

如果if/else之後只有一行,則只能省略大括號。你的錯誤在這裏:

 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; 

這應該是相當於你9,如果在你的移動語句()函數。

3

你有兩類問題。

首先,您需要爲您的功能原型。下方的#include S,但你上面的int main(void),你要包括你的其他函數的聲明(而不是定義):

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

這是必要的,因爲下設計,使得它很容易編譯它在一次通過,通過文件。如果編譯器在使用之前不知道這些函數,那麼可能會遇到一些問題。

你的第二個問題是你在幾個地方失去了大括號。在這裏,例如:

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

如果if聲明(或forwhile或其他一些語句)需要有在它的身上多條語句,則必須圍繞主體用括號:

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); 

&hellip;是有隻有一個語句:致電printf。多個語句需要大括號。

0

你錯在這段代碼

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

當你寫在control flow (if,else-if..)iteration looping體的多行,你必須把{}定義的身體。

你的代碼必須

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

原型函數必須聲明爲printcheckmove。否則它會採用默認原型。