【问题标题】:Problems with If-statement conditionIf 语句条件的问题
【发布时间】:2015-09-02 04:49:51
【问题描述】:

我正在学习 C,我的老师要求我的班级制作一个井字游戏。我设法充分利用了它,但我有点卡住了。我制作了一个函数,目的是逐行检查,如果发现所有行号都等于 1 或 2,则游戏循环接收胜利编号并停止。但是我在函数内部对if 设置的条件似乎有问题,我无法弄清楚它是什么。即使一行包含一个数字,它也不会将数字返回到游戏循环中。我尝试搜索if 条件,但找不到我的错误。

函数如下:

int checkLines (int mat [3][3])
        {

            int i;
            int victory;

            for (i=0; i<3; i++)
            {
                      if ((mat [i][0] ==1) && (mat [i][1] ==1) && (mat [i][2] ==1))
                      {
                                 victory = 1;

                      } else if ((mat [i][0]==2) && (mat [i][1]==2) && (mat [i][2]==2))
                      {
                                 victory = 2;

                      }else
                      {
                           victory = 0;
                      }

            }
        return victory;
        }

【问题讨论】:

  • 您可以简化行中所有元素相等的测试,然后返回行元素之一:if( mat[i][0] == mat[i][1] == mat[i][2] ) { victory = mat[i][0] },而不是测试每一行的 1,然后是 2。那么else ifblock 是多余的(也许可以用于列和对角线测试)。

标签: c loops if-statement conditional-statements


【解决方案1】:

这是因为一旦您设置了victory,您并没有将break 退出循环,这意味着循环将继续,然后在else 部分将victory 重置为零。

实际上,不是设置victory 并跳出循环,而是直接return,并且在循环之后你知道你没有“胜利”,所以你总是可以在那里返回0

【讨论】:

    【解决方案2】:

    在您的代码中,即使在满足 victory 条件后,for 循环也会执行 3 次,基本上将 victory 的值标记为 0结束。

    一旦您在任一if 语句中找到匹配项,您就需要停止循环。您可以在 ifelse if 块的末尾使用 break; 语句。

    【讨论】:

    • 是的,修好了!非常感谢! =D
    【解决方案3】:

    正如@JoachimPileborg 已经指出的那样,如果你找到胜利,你需要break 退出for 循环。

    变化:

    if ((mat [i][0] ==1) && (mat [i][1] ==1) && (mat [i][2] ==1))
    {
        victory = 1;
    } else if ((mat [i][0]==2) && (mat [i][1]==2) && (mat [i][2]==2))
    {
        victory = 2;
    }
    

    到:

    if ((mat [i][0] ==1) && (mat [i][1] ==1) && (mat [i][2] ==1))
    {
        victory = 1;
        break;  // found a victory - break out of loop
    } else if ((mat [i][0]==2) && (mat [i][1]==2) && (mat [i][2]==2))
    {
        victory = 2;
        break;  // found a victory - break out of loop
    }
    

    【讨论】:

      【解决方案4】:
      int checkLines (int mat [3][3])
              {
      
                  int i;
                  int victory; /* You get it then you are happy to leave */
      
                  for (i=0; i<3; i++)
                  {
                            if ((mat [i][0] ==1) && (mat [i][1] ==1) && (mat [i][2] ==1))
                            {
                                       victory = 1; break;
      
                            } else if ((mat [i][0]==2) && (mat [i][1]==2) && (mat [i][2]==2))
                            {
                                       victory = 2; continue;
      
                            }else
                            {
                                 victory = 0; continue; 
                            }
      
                  }
              return victory;
              }
      

      【讨论】:

        【解决方案5】:

        您的循环总是会遍历您的所有矩阵。当胜利为 != 0 时,你必须打破循环。用 while 而不是 for 你可以做到。

        int checkLines (int mat [3][3])
        {
           int i=0;
           int victory = 0;
           while ((victory == 0) && (i<3))
           {
              if ((mat [i][0] ==1) && (mat [i][1] ==1) && (mat [i][2] ==1))
              {
                 victory = 1;
              } 
              else if ((mat [i][0]==2) && (mat [i][1]==2) && (mat [i][2]==2))
              {
                 victory = 2;
              }
        
              i++;
            }
            return victory;
        }
        

        请注意,您的代码不关心对角线和垂直线的胜利。

        【讨论】:

        • 我修复了它=D,我为对角线和垂直线的胜利做了类似的功能,现在它们也可以工作了。非常感谢!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-19
        • 1970-01-01
        • 1970-01-01
        • 2020-09-11
        相关资源
        最近更新 更多