2013-04-20 46 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。否则它会采用默认原型。