如何正确使用Java标签替代goto语句实现井字棋控制逻辑
Java实现goto对应跳转逻辑的方案
Java并未实现通用goto语法,标签仅可配合break/continue用于循环/代码块的跳出、重试操作,完全可以覆盖你需要的跳转需求,以下是两种可行实现:
方案1:带标签的continue(改动最小)
你需要的goto label逻辑是回到读取输入的起点重试,直接给原有代码块外层加循环标签,将goto label替换为continue 标签名即可,修改后代码如下:
try { out.append(m + "\n"); // 定义重试标签 inputRetry: while (true) { out.append("Enter a move for " + m.getTurn().toString() + ":\n"); String element1 = scan.next(); if (quitGameHelper(element1, m)) { return; } String regex = "[-+]?\\d+"; while (!Pattern.matches(regex, element1)) { if (quitGameHelper(element1, m)) { return; } out.append("Not a valid number: " + element1 + "\n"); // 替换原有goto,回到标签位置重试 continue inputRetry; } String element2 = scan.next(); if (quitGameHelper(element2, m)) { return; } while (!Pattern.matches(regex, element2)) { if (quitGameHelper(element2, m)) { return; } out.append("Not a valid number: " + element2 + "\n"); continue inputRetry; } int element1Int = Integer.parseInt(element1) - 1; int element2Int = Integer.parseInt(element2) - 1; try { m.move(element1Int, element2Int); out.append(m + "\n"); } catch (IllegalArgumentException e) { out.append("Not a valid move: " + (element1Int + 1) + ", " + (element2Int + 1) + "\n"); // 落子无效也可加continue重试 continue inputRetry; } final boolean gameOver = m.isGameOver(); if (gameOver) { final Player winner = m.getWinner(); if (winner == null) { out.append("Game is over! Tie game."); } else { out.append("Game is over! " + winner + " wins."); } return; } } } catch (IOException e) { // 原有异常处理逻辑 }
方案2:抽取输入逻辑为单独方法(更推荐)
把输入校验、落子的逻辑抽成独立方法,用方法返回值控制是否需要重试,完全不需要显式跳转,代码可读性和可维护性更高:
第一步:抽取处理方法
// 返回true代表输入有效、落子成功;返回false代表需要重新输入 private boolean tryProcessMove(Model m, Scanner scan, Appendable out) throws IOException { String regex = "[-+]?\\d+"; String element1 = scan.next(); if (quitGameHelper(element1, m)) { System.exit(0); // 也可返回特殊标记通知上层直接退出 } if (!Pattern.matches(regex, element1)) { out.append("Not a valid number: " + element1 + "\n"); return false; } String element2 = scan.next(); if (quitGameHelper(element2, m)) { System.exit(0); } if (!Pattern.matches(regex, element2)) { out.append("Not a valid number: " + element2 + "\n"); return false; } int element1Int = Integer.parseInt(element1) - 1; int element2Int = Integer.parseInt(element2) - 1; try { m.move(element1Int, element2Int); out.append(m + "\n"); } catch (IllegalArgumentException e) { out.append("Not a valid move: " + (element1Int + 1) + ", " + (element2Int + 1) + "\n"); return false; } return true; }
第二步:替换原有逻辑
try { out.append(m + "\n"); while (true) { out.append("Enter a move for " + m.getTurn().toString() + ":\n"); // 输入失败就循环重试 if (!tryProcessMove(m, scan, out)) { continue; } // 落子成功后判断游戏是否结束 final boolean gameOver = m.isGameOver(); if (gameOver) { final Player winner = m.getWinner(); if (winner == null) { out.append("Game is over! Tie game."); } else { out.append("Game is over! " + winner + " wins."); } return; } } } catch (IOException e) { // 原有异常处理逻辑 }
内容的提问来源于stack exchange,提问作者chill_life_123
相关产品推荐
相关产品推荐

