我目前正在学习Java;我确实需要一些更有经验的程序员的帮助。
我怎么才能清理我的Tic-Tac-脚趾密码?我犯了什么错误?我可以使用更多的异常处理吗?我试图在isValidStepCheck和takenFieldCheck中使用异常处理,但我认为我没有有效地使用它。
public class TicTacToe {
public static String[] bpos = {" 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ", " 8 ", " 9 "};
public static int turn = 0;
public static int num;
public static String numS;
public static String winner = "n";
public static int r = 0;
public static void main(String[] args) {
System.out.println("Welcome to the Tic-Tac-Toe game.");
Board();
System.out.println("X has the first step, enter a number.");
try{TicTacToeGame();}
catch (Exception e){
System.out.println("Something went wrong. Are you sure you entered a number?");
}
}
static boolean isValidStepCheck() {
while (true) {
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
numToString();
if (num < 1 || num > 9) {
System.out.println("You have to enter a number between 1 and 9!");
} else {
return true;
}
}
}
static void isValidMove() {
while (true) {
if (isValidStepCheck() && !takenFieldCheck()) {
if (turn % 2 == 0) {
turn++;
bpos[num - 1] = " x ";
Board();
break;
} else if (turn % 2 == 1) {
turn++;
bpos[num - 1] = " o ";
Board();
break;
}
} else if (takenFieldCheck()) {
System.out.println("This field is already taken!");
}
}
}
static void Board() {
System.out.println(" ___________ ");
System.out.println("|" + bpos[0] + "|" + bpos[1] + "|" + bpos[2] + "|");
System.out.println("|-----------|");
System.out.println("|" + bpos[3] + "|" + bpos[4] + "|" + bpos[5] + "|");
System.out.println("|-----------|");
System.out.println("|" + bpos[6] + "|" + bpos[7] + "|" + bpos[8] + "|");
System.out.println(" ----------- ");
}
static boolean takenFieldCheck() {
if (bpos[num - 1].equals(numS)) {
return false;
} else {
return true;
}
}
static void numToString() {
switch (num) {
case 1:
numS = " 1 ";
break;
case 2:
numS = " 2 ";
break;
case 3:
numS = " 3 ";
break;
case 4:
numS = " 4 ";
break;
case 5:
numS = " 5 ";
break;
case 6:
numS = " 6 ";
break;
case 7:
numS = " 7 ";
break;
case 8:
numS = " 8 ";
break;
case 9:
numS = " 9 ";
break;
}
}
static void isWon() {
String line = null;
if (winner.equals("n")) {
for (int i = 0; i < 8; i++) {
switch (i) {
case 0:
line = bpos[0] + bpos[1] + bpos[2];
break;
case 1:
line = bpos[3] + bpos[4] + bpos[5];
break;
case 2:
line = bpos[6] + bpos[7] + bpos[8];
break;
case 3:
line = bpos[0] + bpos[3] + bpos[6];
break;
case 4:
line = bpos[1] + bpos[4] + bpos[7];
break;
case 5:
line = bpos[2] + bpos[5] + bpos[8];
break;
case 6:
line = bpos[0] + bpos[4] + bpos[8];
break;
case 7:
line = bpos[2] + bpos[4] + bpos[6];
break;
}
if (line.equals(" x x x ")) {
winner = "x";
} else if (line.equals(" o o o ")) {
winner = "o";
}
}
} else {
winner = "n";
}
}
static void TicTacToeGame() {
while (true) {
isValidMove();
isWon();
r++;
if (winner.equals("x")) {
System.out.println("Congrats to X, you won!");
break;
} else if (winner.equals("o")) {
System.out.println("Congrats to O, you won!");
break;
}
else {
if(r==9){
System.out.println("Its a draw!");
break;
}
}
}
}
}
```发布于 2020-06-24 22:35:15
当您在流程中编写代码时,您通常会记住所引用的变量,并且通常能够将整个代码上下文保存在脑海中,特别是在这样的相对较小的示例中。但是,随着代码变得更大/在您离开它一段时间之后,有了好的名称,代码就更容易理解了。bpos并不是一个真正有意义的名字。它看起来像是某种缩写/缩写,可能是boardPosition?从你使用它的方式来看,它看起来实际上是游戏的状态。也许gameBoard可能更具有描述性。r的描述性更差。一个字母变量,如果您想使用它们,实际上应该仅限于局部变量,在适合典型屏幕的代码中。这减少了失去的上下文的影响。在代码库中搜索类似roundNumber的内容也比搜索r容易得多。
当开发人员接近您的代码时,他们会带来他们之前见过的其他代码的期望。您显然可以介绍自己的方法,但请考虑它们是否确实添加了任何内容。当我看到以'is‘或'has’开头的方法时,我期望它们返回布尔值。当您阅读这样编写的代码时,它有助于提高可读性,因为它通常更接近于自然语言。所以你可能有这样的东西:
if(isValidMove(position)) {
makeMove(position);
} else {...}您的isValidMove和isWon方法打破了这种预期。正如@Tenfour04所指出的,您的另一个方法isValidStepCheck某种程度上满足了这一点,但是它总是返回true。
一般情况下,Java中的方法应该遵循camelCase并描述它们所做的事情,所以不要考虑Board,而是考虑printBoard。
You isWon方法包含:
if (winner.equals("n")) {
// ...
} else {
winner = "n";
}如果if失败,那是因为winner已经是"n",所以没有必要在else中分配它。在同一区域,考虑是否需要检查是否所有三个位置都是'x',还是所有三个位置都是'y‘。这是否就足以考虑这三种立场是否相同?
在isValidMove中也有类似的问题:
if (turn % 2 == 0) {
turn++;
bpos[num - 1] = " x ";
Board();
break;
} else if (turn % 2 == 1) {
turn++;
bpos[num - 1] = " o ";
Board();
break;
}有几个问题。两个if子句之间唯一的区别是,一个是分配“o”,另一个是“x”。如果先确定了谁是移动的,那么您可以简化代码。您也不需要第二个if条件。如果turn % 2不是'0',那么它必须是'1',您不需要检查它。
https://codereview.stackexchange.com/questions/244440
复制相似问题