为什么这只适用于返回语句?

时间:2017-03-02 03:41:53

标签: java

我刚刚开始自学java,没有任何编程经验,我刚刚完成了Udacity中的函数式编程课程。在制作Tic Tac Toe游戏作为最终项目时,我需要编写一个检查获胜者或领带的功能。游戏表示为2d阵列,其他所有内容都已经给出;我唯一的工作是编码checkGameWinner函数。我已经完成了代码并使其工作;但为了充分理解Java,我想问下列内容:

    public String checkGameWinner(char [][]grid){
    String result = "None";
    //Student code goes here ...

    if(grid[1][1]=='x' && grid[1][0]=='x'&& grid[1][2]=='x'){     
        result = "X wins";                                       
    }
    else if(grid[1][1]=='x' && grid[0][1]=='x'&& grid[2][1]=='x'){
        result = "X wins";
    }
    else if(grid[1][1]=='x' && grid[0][0]=='x' && grid[2][2]=='x'){
        result = "X wins";
    }
    else if(grid[1][1]=='x' && grid[0][2]=='x' && grid[2][0]=='x'){
        result = "X wins";
    }
    else if(grid[0][0]=='x' && grid[1][0]=='x' && grid[2][0]=='x'){
        result = "X wins";
    }
    else if(grid[2][0]=='x' && grid[2][1]=='x' && grid[2][2]=='x'){
        result = "X wins";
    }
    else if(grid[0][2]=='x' && grid[1][2]=='x' && grid[2][2]=='x'){
        result = "X wins";
    }
    else if(grid[0][0]=='x' && grid[0][1]=='x' && grid[0][2]=='x'){
        result = "X wins";
    }

    else if(grid[1][1]=='o' && grid[1][0]=='o'&& grid[1][2]=='o'){ 
        result = "O wins";                                       
    }
    else if(grid[1][1]=='o' && grid[0][1]=='o'&& grid[2][1]=='o'){
        result = "O wins";
    }
    else if(grid[1][1]=='o' && grid[0][0]=='o' && grid[2][2]=='o'){
        result = "O wins";
    }
    else if(grid[1][1]=='o' && grid[0][2]=='o' && grid[2][0]=='o'){
        result = "O wins";
    }
    else if(grid[0][0]=='o' && grid[1][0]=='o' && grid[2][0]=='o'){
        result = "O wins";
    }
    else if(grid[2][0]=='o' && grid[2][1]=='o' && grid[2][2]=='o'){
        result = "O wins";
    }
    else if(grid[0][2]=='o' && grid[1][2]=='o' && grid[2][2]=='o'){
        result = "O wins";
    }
    else if(grid[0][0]=='o' && grid[0][1]=='o' && grid[0][2]=='o'){
        result = "O wins";
    }

    else {
        for (int i = 0; i < 3; i++) {       
            for (int j = 0; j < 3; j++) {    
                if (grid[i][j] == '-') {
                    result = "None";
                    return result;        
                } else {
                    result = "Tie";
                }
            }
        }
    }




    return result;
}

我的逻辑是我首先检查所有16种不同的获胜组合,然后使用for循环检查数组中的任何单元格是否为空(如果它们是函数返回“无”并且游戏前进)。最后,如果没有获胜组合且没有空位,那么游戏就是平局,我将其作为最后一个声明。我发现为了使上面的代码按预期工作,我需要在double for循环中的if语句之后立即包含一个额外的return语句(检查空格的一个)。如果没有添加此返回,游戏将结束并在不正确的时刻被宣布为领带,即使空闲空间可用。我的问题是为什么这种回归是必要的?如果for循环下的if语句的布尔值为true(即,有任何空的空格),则不应将变量“result”更新为“none”并跳过以下else语句,因此退出for循环,然后在代码结尾处进入最终返回?我已经读过,通常你不希望任何一个函数返回多个,但我不确定这是多么真实。我希望这是可以理解的,如果有人有任何见解或帮助,他们可以给这个开始程序员非常感激。谢谢。附:空格用' - '字符表示。

3 个答案:

答案 0 :(得分:1)

考虑双for循环在到达2D数组末尾之前找到“空白”空间的情况。

如果在此空白区域后遇到非空格,则返回没有返回它将声明一个平局,除非它遇到另一个空格,然后重复该过程 - 如果发现另一个非空白结果改变等,直到到达数组的末尾。

换句话说,循环不会停止,除非它们的继续条件导致值false或者循环内部有breakreturn。让return不仅仅是循环,而是整个方法遇到空白区域时。

答案 1 :(得分:1)

在相同的学习课程中,我有一个非常相似的经历,试图弄清楚最终的位置&#39; if&#39;为了使程序正确地逐步执行该函数而评估一个平局的语句;我遇到了同样的问题,如果我没有最后的回报,那就不行了。在那里的声明。感谢所有关于更好地结束for循环的讨论。我终于想出了这种评估平局的方法。

public String checkGameWinner(char[][] grid) {
    String result = "None";
    char[] letter = {'x', 'o'};
    String[] otherResults = {"X Wins", "O Wins", "Tie"};
    int isTie = 0;

    //checks for win on both diagonals
    for (int i = 0; i < letter.length; i++) {
        if (grid[0][0] == letter[i] && grid[1][1] == letter[i] && grid[2][2] == letter[i]) {
            return otherResults[i];
        }
        if (grid[0][2] == letter[i] && grid[1][1] == letter[i] && grid[2][0] == letter[i]) {
            return otherResults[i];
        }
        for (int j = 0; j < grid.length; j++) {
            //Checks for win on rows
            if (grid[0][j] == letter[i] && grid[1][j] == letter[i] && grid[2][j] == letter[i]) {
                return otherResults[i];
            }
            //Checks for win on columns
            if (grid[j][0] == letter[i] && grid[j][1] == letter[i] && grid[j][2] == letter[i]) {
                return otherResults[i];
            }
        }
    }
    // checks for tie or draw
    for (int i = 0; i < grid.length; i++) {
        for (int j = 0; j < grid.length; j++) {
            if (grid[i][j] == 'x' || grid[i][j] == 'o') {
                isTie = isTie + 1;
            }
        }
    }
    if (isTie == 9){
        return otherResults [2];
    }
    return result;
}

答案 2 :(得分:0)

通过查看代码,您希望在得到结果时停止,然后返回。

如果您只想要一个return语句,以便在找到&#34; None&#34;之后立即返回结果。 使用break语句来切断循环。

旧代码

for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
            if (grid[i][j] == '-') { 
                result = "None";
                return result; 
            } 
           else { 
                result = "Tie"; 
           } 
      } 
  } 
 return result;

新代码 (校正的)

  result = "Tie";
  outeerloop:
  for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
            if (grid[i][j] == '-') { 
                result = "None";
                break outerloop;
            }
      } 
  } 
 return result;

现在无论将存储在结果中的是什么,即使你得到结果无,而且在if语句中没有return语句,它会再次迭代并将值更改为tie。