2016-09-30 175 views
0

好的,我提前很抱歉,我知道有一千个do-while循环如何工作以及如何退出它们的例子。我发誓我已经尝试过。对于我来说,当用户输入0时,我不能让它退出。必须有一些我看起来很重要的东西。我是如何在else if循环中工作的,但主要的是在我之外。我将不胜感激任何帮助或方向。do-while循环不会退出C

int main() 
{ 
    char connectBoard[6][7]; 
    int i , j; 
    char c; 
    int turn = 1; 
    char player1 = 'x'; 
    char player2 = 'o'; 
    int spot; 

    for(i = 0; i < 6; i++) //sets up 2D array board 
    { 
     for(j = 0; j < 7; j++) 
     { 
      c = '.'; 
      connectBoard[i][j] = c; 
     } 
    } 
    for(i = 0; i < 6; i++)// prints out 2D array board 
    { 
     for(j = 0; j < 7; j++) 
     { 
      printf("%c", connectBoard[i][j]); 
     } 
     printf("\n"); 
    } 
    printf("=======\n"); 
    printf("1234567\n"); 

    do{ 
     if(turn%2 != 0) //player1 turn 
     { 
      for(i = 5; i < 6; i++) 
      { 
       for(j = 0; j < 1; j++) 
       { 
        printf(" Player %c, drop your piece in which column (1-7 or 0 to quit): ", player1); 
        scanf("%d", &spot); 
        j = spot - 1; 
        if(connectBoard[i][j] == '.') 
        { 
         connectBoard[i][j] = 'x'; 
        } 
        else if(connectBoard[i][j] == 'x' || connectBoard[i][j] == 'o') 
        { 
         do 
         { 
          i--; 
         }while(connectBoard[i][j] == 'x' || connectBoard[i][j] == 'o'); 
         connectBoard[i][j] = 'x'; 
         if(i == -1) 
         { 
          printf("***Bad entry, try again: "); 
          scanf("%d", &spot); 
          j = spot - 1; 
          i = 5; 
          connectBoard[i][j] = 'x'; 
         } 
        } 
        turn++; 
       } 
       break; 
      } 
      printf("\n"); 
      for(i = 0; i < 6; i++)// prints out 2D array board 
      { 
       for(j = 0; j < 7; j++) 
       { 
        printf("%c", connectBoard[i][j]); 
       } 
       printf("\n"); 
      } 
      printf("=======\n"); 
      printf("1234567\n"); 
     } 
     if(turn%2 == 0) //player2 turn 
     { 
      for(i = 5; i < 6; i++) 
      { 
       for(j = 0; j < 1; j++) 
       { 
        printf(" Player %c, drop your piece in which column (1-7 or 0 to quit): ", player2); 
        scanf("%d", &spot); 
        j = spot - 1; 
        if(connectBoard[i][j] == '.') 
        { 
         connectBoard[i][j] = 'o'; 
        } 
        else if(connectBoard[i][j] == 'x' || connectBoard[i][j] == 'o') 
        { 
         do 
         { 
          i--; 
         }while(connectBoard[i][j] == 'x' || connectBoard[i][j] == 'o'); 
         connectBoard[i][j] = 'o'; 
         if(i == -1) 
         { 
          printf("***Bad entry, try again: "); 
          scanf("%d", &spot); 
          j = spot - 1; 
          i = 5; 
          connectBoard[i][j] = 'o'; 
         } 
        } 
        turn++; 
       } 
       break; 
      } 
      printf("\n"); 
      for(i = 0; i < 6; i++)// prints out 2D array board 
      { 
       for(j = 0; j < 7; j++) 
       { 
        printf("%c", connectBoard[i][j]); 
       } 
       printf("\n"); 
      } 
      printf("=======\n"); 
      printf("1234567\n"); 
     } 

    }while(spot != 0); 




    return 0; 
} 
+0

为什么要这样做? 使用一个简单而在一个函数中做一个返回或休息。 在我看来尽量避免尽量避免。 请停止使用这样的printf,这是awfull,缓冲等....阅读printf man :) – pix

+0

'j = spot-1;'当'spot'为'0'时,解决了矩阵越界的问题,所以[ UB](https://en.wikipedia.org/wiki/Undefined_behavior)。 – LPs

+0

顺便说一句,要求“0”退出的'printf'在一个double for循环中。您必须退出以杀死外部while循环。 – LPs

回答

1

阅读当场变量之后,您可以检查是否值是0,并打破:

printf(" Player %c, drop your piece in which column (1-7 or 0 to quit): ", player2); 
    scanf("%d", &spot); 
    if (spot == 0) 
    return 1; 
    j = spot - 1; 

,改变你做,而while循环,以避免混乱。

+0

啊是的,在这种情况下,我们可以退出。 – user5478656

0

仅对该循环使用变量。你在循环中使用spot来做其他事情,只用于while循环的目的。

然后,你知道do/while和while之间的区别吗?我不太了解你的程序,但是如果你正在读一个地方,你可以在开始时在循环之外读取它,然后用一个while循环来检查它。它是一样的,但也许它更容易为你。

+0

好的,所以我通过在while循环中使用一个不同的变量来查看你的意思,但那么用户如何选择0退出?如果我理解正确,我想我可能已经尝试过了。我创建了另一个名为end的变量,然后将其设置为与用户输入的spot相等,并使用一个while循环来查看end是否等于0,这对我也不起作用。它是一个连接4. – Nico

+0

然后为什么如果玩家输入0你不会结束进入退出条件? – AFR

0

你为什么使用spot作while循环。按照C语言,它存储垃圾值。

即使您使用,请不要为它设置值。请检查基本的C变量声明。

+0

主要是对的,但在这个特定的情况下,循环是一个'do-while',所以'spot'由内部循环引入。 – LPs