【问题标题】:C While Loops - Checking Against FunctionsC While 循环 - 检查函数
【发布时间】:2015-04-22 17:00:28
【问题描述】:

我正在尝试用 C 语言编写井字游戏程序,并有一个 while 循环来检查游戏板是否已填满。如果是这样,循环将中断,结果将是一场猫的游戏。

我还有一个函数boardFull,它将我的 2D 游戏板作为参数,并检查每个单元格中的 -1,这表示空间是空的。

由于某种原因,我在程序运行时进入了循环,但是在填满一个空间后,循环中断,我的程序结束了。我是否正确使用了while

代码段:

    while(boardFull(board) != -1)
    {
       if((turn % 2) == 0)
       {
        printf("Player One's turn.\n");
        marker = 1;
       }
       else
       {
        printf("Player Two's turn.\n");
        marker = 0;
       }   

       printf("Which row? ");
       scanf("%i", &row);

       printf("Which column? ");
       scanf("%i", &column);

       if(board[row][column] != -1)
       {
           while(board[row][column] != -1)
           {
            printf("Space already taken. Try again.\n");

            printf("Which row? ");
            scanf("%i", &row);

            printf("Which column? ");
            scanf("%i", &column);

            printf("\n");
           }
       }
       else
        board[row][column] = marker;

       drawBoard(board);

       turn++;
     }

这是我的boardFull 方法...

int boardFull(int board[3][3])
{
   int i, j;

   for(i = 0; i < 3; i++)
   {
       for(j = 0; j < 3; j++)
       {
           if(board[i][j] != -1)
               return 0;
       }
   }

   return -1;
}

【问题讨论】:

  • 你忽略了scanf()的返回值,也没有检查扫描的值。假设row &gt;= 3,问题!假设用户输入asdas,又是个问题!
  • 您的boardFull() 不是检查整个板子是否已满,而是检查任何方块是否已满。只要它遇到任何不是 -1 的方格,它就会返回。
  • 我可能建议不要在你的板子完整函数中使用两个返回值,而是只使用一个带有 and 运算符的 bool 值,假设板子为真并执行 value = value&&board[i][j] ! = 1,但我认为这不是导致您的问题的原因
  • @TomHunt 如果 9 个方格中的任何一个不是 -1,则返回 0,即免费。如果它们都不是-1,它将返回-1,它已满。这在程序的逻辑中是正确的。
  • @EugeneSh。如果 -1 表示一个方格为空,则boardFull() 在找到任何 空方格后立即返回 0。如果条件是board[i][j] == -1,那将是正确的(假设 0 表示“未满”)。

标签: c while-loop boolean


【解决方案1】:
  1. 您应该使用来自boardFull 函数的boolean 返回值(请参阅this post)。它更具可读性和可理解性。
  2. boardFull 函数在找到第一个非空单元格时返回 0(假设该值代表 false)。这是错误的。如果任何单元格为空,则应返回 0。
  3. 您的while 循环条件对我来说看起来不错。但是如果你使用boolean 返回值,它看起来更好while (!boardFull(...))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2015-12-15
    • 2017-09-17
    • 2021-12-03
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多