首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的脚趾

Java中的脚趾
EN

Code Review用户
提问于 2020-06-24 11:11:21
回答 1查看 268关注 0票数 3

我目前正在学习Java;我确实需要一些更有经验的程序员的帮助。

我怎么才能清理我的Tic-Tac-脚趾密码?我犯了什么错误?我可以使用更多的异常处理吗?我试图在isValidStepChecktakenFieldCheck中使用异常处理,但我认为我没有有效地使用它。

代码语言:javascript
复制
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;
                }
            }
        }
    }
} 
```
代码语言:javascript
复制
EN

回答 1

Code Review用户

发布于 2020-06-24 22:35:15

命名是重要的

当您在流程中编写代码时,您通常会记住所引用的变量,并且通常能够将整个代码上下文保存在脑海中,特别是在这样的相对较小的示例中。但是,随着代码变得更大/在您离开它一段时间之后,有了好的名称,代码就更容易理解了。bpos并不是一个真正有意义的名字。它看起来像是某种缩写/缩写,可能是boardPosition?从你使用它的方式来看,它看起来实际上是游戏的状态。也许gameBoard可能更具有描述性。r的描述性更差。一个字母变量,如果您想使用它们,实际上应该仅限于局部变量,在适合典型屏幕的代码中。这减少了失去的上下文的影响。在代码库中搜索类似roundNumber的内容也比搜索r容易得多。

不,真的,命名很重要.

当开发人员接近您的代码时,他们会带来他们之前见过的其他代码的期望。您显然可以介绍自己的方法,但请考虑它们是否确实添加了任何内容。当我看到以'is‘或'has’开头的方法时,我期望它们返回布尔值。当您阅读这样编写的代码时,它有助于提高可读性,因为它通常更接近于自然语言。所以你可能有这样的东西:

代码语言:javascript
复制
if(isValidMove(position)) {
    makeMove(position);
} else {...}

您的isValidMoveisWon方法打破了这种预期。正如@Tenfour04所指出的,您的另一个方法isValidStepCheck某种程度上满足了这一点,但是它总是返回true

一般情况下,Java中的方法应该遵循camelCase并描述它们所做的事情,所以不要考虑Board,而是考虑printBoard

密切关注冗余

You isWon方法包含:

代码语言:javascript
复制
if (winner.equals("n")) {
  // ...
} else {
    winner = "n";
}

如果if失败,那是因为winner已经是"n",所以没有必要在else中分配它。在同一区域,考虑是否需要检查是否所有三个位置都是'x',还是所有三个位置都是'y‘。这是否就足以考虑这三种立场是否相同?

isValidMove中也有类似的问题:

代码语言:javascript
复制
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',您不需要检查它。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/244440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档