在这里猜猜数字游戏,我有两种方法可以做到。我可以创建一个名为Number的对象类,然后使用getter和setter(如number.setPlayerNumber
),然后在if语句中使用number.getPlayerNumber
来确定获胜者。
这意味着我不需要使用静态变量,它们只会保留在方法的范围内(以后会减少它的麻烦吗?(但是可以使主方法看起来很麻烦?...)
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!");
}
}
}
我也可以继续使用return方法。这意味着我需要将每个变量设置为静态,以便在将它们用于决策的方法中使用它们。
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!");
}
}
}
从良好的编程实践角度来看,效率更高?
答案 0 :(得分: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() {
...
答案 1 :(得分:1)
我说两个看起来都没有好看,恕我直言。此外,Number是您自己的类的错误名称,因为已经有一个名为java.lang.Number的类。克里斯蒂安是正确的,因为真的不需要所有这些静态方法。是的,它取决于主要方法的逻辑,因此它看起来并不“混乱”,但它不能解决您的问题,而且通常会产生意大利面条代码。此外,以这种方式将逻辑分离为单独的方法也会导致您编写笨拙的代码,允许这些方法在彼此之间传递信息(这是您创建这些静态变量的原因)。
创建一个只封装单个数字并提供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实例。这也可以扩展到包括可以生成的最小和最大范围,并且您可以添加构造函数来实现这一点。