我刚刚开始自学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循环,然后在代码结尾处进入最终返回?我已经读过,通常你不希望任何一个函数返回多个,但我不确定这是多么真实。我希望这是可以理解的,如果有人有任何见解或帮助,他们可以给这个开始程序员非常感激。谢谢。附:空格用' - '字符表示。
答案 0 :(得分:1)
考虑双for
循环在到达2D数组末尾之前找到“空白”空间的情况。
如果在此空白区域后遇到非空格,则返回没有返回它将声明一个平局,除非它遇到另一个空格,然后重复该过程 - 如果发现另一个非空白结果改变等,直到到达数组的末尾。
换句话说,循环不会停止,除非它们的继续条件导致值false
或者循环内部有break
或return
。让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。