2017-03-02 58 views
2

我刚刚开始自学java,没有任何编程经验,我刚刚完成了Udacity的函数编程课程。在将Tic Tac Toe游戏作为最终项目时,我需要编写一个函数来检查赢家或领带。游戏被表示为一个二维数组,其他所有内容都已经给出;我唯一的工作是编码checkGameWinner函数。我已经完成了代码并使其运行。但在充分了解Java的利益,我想问下:为什么这只适用于这里的return语句?

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循环为空(如果它们是函数返回“None”并且游戏继续)。最后,如果没有获胜组合并且没有空白空间,那么这场比赛是平局,我把它作为最后一个陈述。我发现为了让上面的代码按预期工作,我需要在double for循环(检查空白空间)中的if语句之后立即包含一个额外的return语句。如果没有添加这个回报,游戏将结束并在不正确的时刻被宣布为Tie,即使空的空间可用。我的问题是为什么这个回报是必要的?如果for循环中的if语句的布尔值为true(即有任何空格),则不应将变量“result”更新为“none”,并且会跳过后面的else语句,因此退出for循环,然后在代码的最后返回最后的回报?我已经读过,通常你不想在任何一个函数中返回多于一个返回值,但我不确定这是多么真实。我希望这是可以理解的,如果任何人有任何见解或帮助,他们可以给这个开始的程序员会非常感激。谢谢。附:空格由' - '字符表示。

+0

@JoPeyper我看到两个。 – shmosel

+0

你是对的,显然在Mac上的代码段滚动和铬喜欢隐藏滚动条。 –

+0

你的逻辑不正确。事实上,一个特定的项目不是空的不会使它成为一条平行线。它只能工作,因为返回语句一找到空的空间就会使循环短路返回“无”。 – shmosel

回答

1

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

没有回报,如果遇到非空白这个空格之后,除非遇到另一个空白区域,然后重复该过程将宣告平局 - 如果其他非空白发现结果的变化,等等直到达到数组的末尾。

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

+0

,我写了改进的使用break的答案:) – minigeek

+0

非常感谢,非常感谢。这正是我正在寻找的答案。我曾假设一旦结果变化得到更新,就会出现循环。 – Maisy

+0

@Maisy欢迎来到stackoverflow :)如果任何答案在这里解决您的问题。选择√标记并将其设为绿色以接受该答案。这个线程将被视为解决 – minigeek

0

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

如果您只想要一个返回语句,以便在找到“无”后立即返回结果 使用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; 

现在一切都将存储在结果将是returned.earlier即使你得到结果无和没有如果return语句它用来再次迭代的语句并将值更改为tie。

1

在同一个udacity课程上工作我有一个非常相似的经历,试图找出最终的'if'语句评估结果的位置,以便程序正确地逐步完成功能;我遇到了同样的问题,它不工作,如果我没有在那里最后的'返回'声明。感谢所有关于更好地结束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; 
} 
相关问题