2

在这里玩猜数字游戏,有两种方法可以做到。我可以创建一个名为 Number 的对象类,然后使用 getter 和 setter 等方法number.setPlayerNumber,然后number.getPlayerNumber在我的 if 语句中使用来确定获胜者。

这意味着我不需要使用静态变量,它们只会保留在方法的范围内(以后让它不那么麻烦?(但可以让 main 方法看起来很乱?...))

import java.util.Random;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class NumberGuess {

    static Number number = new Number();

    static boolean win;

    public static void main(String[] args) {

        int cpuNumber = generateNumber();
        int playerNumber = playerNumber();
        printResults();
        winCondition();

    }

    public static int generateNumber() {
        System.out.println("Generating a number");
        System.out.println("Done!");

        Random rand = new Random();
        int cpuNumber = rand.nextInt(10) + 1;
        number.setCpuNumber(cpuNumber);     

        return cpuNumber;
    }

    public static int playerNumber() {
        Scanner userInput = new Scanner(System.in);

        String playerNum = JOptionPane.showInputDialog(null, "Enter a number between 1 and 10",
                "Player Turn", JOptionPane.INFORMATION_MESSAGE);
        number.setPlayerNumber(Integer.parseInt(playerNum));

        return Integer.parseInt(playerNum);
    }

    public static void printResults(){
        System.out.println("The computers number was: " + number.getCpuNumber());
        System.out.println("Your number was: " +  number.getPlayerNumber());

    }

    public static void winCondition(){

        if(number.getCpuNumber() != number.getPlayerNumber()){
            if(number.getPlayerNumber() < number.getCpuNumber()){
                System.out.println("You lose!\n"
                        + "Guess too low!");
                }else{
                    System.out.println("You lose!\n"
                            + "Guess too high!");
                }
        }

        if(number.getPlayerNumber() == number.getCpuNumber()){
            System.out.println("You have guessed correct. You win!");
        }
    }

}

我也可以继续使用返回方法。这意味着我需要将每个变量设为静态,以便在使用它们进行决策的方法中使用它们。

import java.util.Random;
import java.util.Scanner;

import javax.swing.JOptionPane;

public class NumberGuess {

    static Number number = new Number();

    static int cpuNumber = generateNumber();
    static int playerNumber = playerNumber();
    static boolean win;

    public static void main(String[] args) {


        printResults();
        winCondition();

    }

    public static int generateNumber() {
        System.out.println("Generating a number");
        System.out.println("Done!");

        Random rand = new Random();
        int cpuNumber = rand.nextInt(10) + 1;   

        return cpuNumber;
    }

    public static int playerNumber() {
        Scanner userInput = new Scanner(System.in);

        String playerNum = JOptionPane.showInputDialog(null, "Enter a number between 1 and 10",
                "Player Turn", JOptionPane.INFORMATION_MESSAGE);
        return Integer.parseInt(playerNum);
    }

    public static void printResults(){
        System.out.println("The computers number was: " + number.getCpuNumber());
        System.out.println("Your number was: " +  number.getPlayerNumber());

    }

    public static void winCondition(){

        if(cpuNumber != playerNumber()){
            if(playerNumber() < cpuNumber){
                System.out.println("You lose!\n"
                        + "Guess too low!");
                }else{
                    System.out.println("You lose!\n"
                            + "Guess too high!");
                }
        }

        if(playerNumber == cpuNumber){
            System.out.println("You have guessed correct. You win!");
        }
    }

}

从良好的编程实践的角度来看,什么更有效?

4

2 回答 2

1

问:为什么不这样:

import java.util.Random;
...

public class NumberGuess {

   public static void main(String[] args) {
       NumberGuess numberGuess = new NumberGuess ();
       int playerNumber = numberGuess.playerNumber();
       numberGuess.printResults();
       ...

   public int playerNumber () {
      ...

   public static int generateNumber() {
      ...
于 2013-08-30T23:19:50.730 回答
1

恕我直言,我会说两者看起来都不会更好。此外,Number 对于您自己的类来说是个坏名字,因为已经有一个名为 java.lang.Number 的类。Christian 是对的,因为真的不需要所有这些静态方法。是的,它从 main 方法中去掉了逻辑,所以它看起来不那么“混乱”,但它不能解决你的问题,而且它通常会导致意大利面条式的代码。此外,以这种方式将逻辑分离到单独的方法中还会导致您编写笨拙的代码,从而允许这些方法在彼此之间传递信息(您创建这些静态变量的原因)。

创建一个只封装一个数字并提供 getter 和 setter 的整个类也几乎没有任何意义,如果你真的想的话,你可以用一个简单的整数来做到这一点。但我想说 OOP 的目的是将相关组件组织到一个容器中,该容器足够通用以供重用,但不够具体以至于不能在其他环境(即 GUI、控制台、网络)中使用。

如果我正在写它,我可能会做类似的事情:

import java.util.*;

class GuessingGame {
    private static final Random rng = new Random();
    private int number;

    public void generateNumber() {
        number = rng.nextInt(10);
    }

    public int guess(int guess) {
        return Integer.compare(guess, number);
    }

    public int getNumber() {
        return number;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        GuessingGame game = new GuessingGame();
        game.generateNumber();
        System.out.println("Guess a number:");
        int n = sc.nextInt();
        int result = game.guess(n);
        if (result < 0)
            System.out.println("You guessed too low!");
        else if (result > 0)
            System.out.println("You guessed too high!");
        else
            System.out.println("You win!");
        System.out.println("You guessed: " + n);
        System.out.println("The actual number was: " + game.getNumber());
    }
}

在您的 main 方法中包含代码并没有错,这就是它的用途。然而,这是一个很好的例子,使用静态变量会很有用,因此每次创建新数字时都不会创建新的 Random 实例。这也可以扩展为包括可以生成的最小和最大范围,您可以添加一个构造函数来获取它。

于 2013-08-30T23:35:44.783 回答