【问题标题】:Confused about calling a method from another class对从另一个类调用方法感到困惑
【发布时间】:2016-04-20 19:51:46
【问题描述】:

我正在尝试实现一个运行良好的 DiceThrowingGame。我目前有 2 个类,分别是 "Player""Game"。 Game类的代码如下:

包 dice.throwing.game; 导入 java.util.Scanner;

public class Game {
    private int winningPoints;
    private Player player1, player2;
    private boolean gameSetup;

    private final String defaultWinningScore = "200";

    public Game() {
        this.setWinningPoints(200);
        this.gameSetup = false;
    }

    private int readScore(Scanner scanner) {
        String score = "";
        try {
            score = scanner.nextLine();
            if (score.isEmpty()) {
                score = this.defaultWinningScore;
            }
        } catch (Exception e) {
        }
        return Integer.parseInt(score);
    }

    private Player createPlayer(Scanner scanner) {
        String name = null;
        do {
            try {
                name = scanner.nextLine();
                if (name.isEmpty()) {
                    System.err.println("Name cannot be empty. Try again: ");
                }
            } catch (Exception e) {
            }
        } while (name.isEmpty());

        return new Player(name);
    }

    private void startGame(Scanner scanner) {
        System.out.println("Enter first player's name: ");
        player1 = createPlayer(scanner);
        System.out.println("Enter second player's name: ");
        player2 = createPlayer(scanner);
        System.out.println("Maximum score to win (<Enter> to use default 200): ");
        this.setWinningPoints(this.readScore(scanner));
        this.gameSetup = true;
    }

    private void playOneRound() {
        int p1r1, p1r2, p2r1, p2r2;
        p1r1 = (int) (1 + ((Math.random() * 10) % 6));
        p1r2 = (int) (1 + ((Math.random() * 10) % 6));
        p2r1 = (int) (1 + ((Math.random() * 10) % 6));
        p2r2 = (int) (1 + ((Math.random() * 10) % 6));

        int p1Points, p2Points;
        boolean p1Bonus = false, p2Bonus = false;
        p1Points = p1r1 + p1r2;
        p2Points = p2r1 + p2r2;
        if (p1r1 == p1r2) {
            p1Points *= 2;
            p1Bonus = true;
        }
        if (p2r1 == p2r2) {
            p2Points *= 2;
            p2Bonus = true;
        }

        player1.setTotalPoints(player1.getTotalPoints() + p1Points);
        player2.setTotalPoints(player2.getTotalPoints() + p2Points);
        System.out.print(player1.getName() + " rolled " + p1r1 + " + " + p1r2 + ", and scored " + p1Points + " points");
        if (p1Bonus)
            System.out.println(" (BONUS!)");
        else
            System.out.println();
        System.out.print(player2.getName() + " rolled " + p2r1 + " + " + p2r2 + ", and scored " + p2Points + " points");
        if (p2Bonus)
            System.out.println(" (BONUS!)");
        else
            System.out.println();
    }

    private void leaderBoard() {
        int p1Points = player1.getTotalPoints();
        int p2Points = player2.getTotalPoints();

        if (p1Points == p2Points)
            System.out.println("Both players have the same score (" + p1Points + ") at the moment");
        else {
            System.out.print(player1.getName() + "'s current score is " + p1Points);
            if (p1Points > p2Points)
                System.out.println(" <--- CURRENT LEADER!");
            else
                System.out.println();
            System.out.print(player2.getName() + "'s current score is " + p2Points);
            if (p1Points < p2Points)
                System.out.println(" <--- CURRENT LEADER!");
            else
                System.out.println();
        }
    }

    private void gameHelp() {
        System.out.println("<ENTER SOME HELP TEXT HERE>");
    }

    private boolean isGameOver() {
        int player1Points = player1.getTotalPoints();
        int player2Points = player2.getTotalPoints();

        if(player1Points == player2Points &&
                player1Points > this.winningPoints) {
            System.out.println("Game Over! It's a draw!");
            return true;
        } else if(player1Points > this.winningPoints && player1Points > player2Points) {
            System.out.println("Game Over! " + player1.getName() + " is the winner!");
            return true;
        } else if(player2Points > this.winningPoints && player2Points > player1Points) {
            System.out.println("Game Over! " + player2.getName() + " is the winner!");
            return true;
        }
        return false;
    }

    private void eventLoop() {
        Scanner scanner = new Scanner(System.in);
        int choice = 0;
        boolean exit = false;
        while (!exit) {
            System.out.println("Welcome to my Dice-and-Roll Game!");
            System.out.println("==============================");
            System.out.println("(1) Start a new game");
            System.out.println("(2) Play one round");
            System.out.println("(3) Who is leading now?");
            System.out.println("(4) Display Game Help");
            System.out.println("(5) Exit Game");
            System.out.println("Choose an option: ");

            try {
                choice = Integer.parseInt(scanner.nextLine());
                if (choice < 1 || choice > 5) {
                    System.err.println("Error : Choose an option between 1 and 5");
                    choice = 0;
                }
            } catch (NumberFormatException e) {
                System.err.println("Error : Choose an option between 1 and 5");
                choice = 0;
            }

            if (!this.gameSetup && (choice == 2 || choice == 3)) {
                System.err.println("Error : Players have not been setup");
                choice = 0;
            }

            switch (choice) {
            case 1:
                this.startGame(scanner);
                break;
            case 2:
                this.playOneRound();
                break;
            case 3:
                this.leaderBoard();
                break;
            case 4:
                this.gameHelp();
                break;
            case 5:
                exit = true;
            }

            if(this.gameSetup && this.isGameOver()) {
                System.out.println("Exiting now.. See you later!");
                exit = true;
            }
        }
        scanner.close();
    }

    public static void main(String[] args) {
        Game game = new Game();
        game.eventLoop();

    }

    public int getWinningPoints() {
        return winningPoints;
    }

    public void setWinningPoints(int winningPoints) {
        this.winningPoints = winningPoints;
    }

}

但我想将代码的 DiceThrowing 部分移动到另一个名为“Dice”的类,这就是这部分:

 private void playOneRound() {
        int p1r1, p1r2, p2r1, p2r2;
        p1r1 = (int) (1 + ((Math.random() * 10) % 6));
        p1r2 = (int) (1 + ((Math.random() * 10) % 6));
        p2r1 = (int) (1 + ((Math.random() * 10) % 6));
        p2r2 = (int) (1 + ((Math.random() * 10) % 6));

不知道是放整个 playOneRound() 方法还是只放 Math.Random 行?

【问题讨论】:

    标签: java bluej


    【解决方案1】:

    为了将职责和抽象分开: 我会有一个方法Dice.getNumber(),它会返回结果 (int) (1 + ((Math.random() * 10) % 6)); 你也可以有第二个方法,它会返回一个带有 nbOfThrows 参数的掷骰子数组。

    那么 playOneRound() 将涉及游戏规则允许的多次掷骰子。

    【讨论】:

    • 感谢您的意见。我创建了一个名为 DiceThrow 的新类,代码为:public class DiceThrow { public int generate() { Random random = new Random(); return (int) (1 + ((Math.random() * 10) % 6)); } } 将游戏类中的原始代码替换为 generate() 方法。现在工作正常。
    • 您还应该将 Random 变量设为 Dice 的实例变量,然后在 generate() 中重用它
    猜你喜欢
    • 2014-06-06
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2017-03-20
    • 2013-07-19
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    相关资源
    最近更新 更多