2016-08-22 25 views
0

我只是在练习Java,对此很新。我只是试图创建一个随机数生成器程序,用于跟踪玩家的胜率,损失,胜率和总奖金。该方案的逻辑是玩家每次获得3次机会,并且计算机产生一个随机数,玩家需要猜测或者应该匹配。计算赢/输,赢得比例和总奖金

我目前有三个类:游戏(拥有主逻辑),玩家(应该有赢/输等等,就是我猜测的)和RandomNumberGenerator(它会产生随机数)。

我已经开始使用该程序了,但是我是否需要在玩家类中声明gamesWon,gamesLost,totalWinnings,winPercent作为单独变量?任何帮助,将不胜感激。

这里的玩家类到目前为止:

public class Player { 
    private String name; 
    private int totalWinnings; 
    private int gamesWon; 
    private int gamesLost; 

    public Player() { 
     this.name = "default"; 
     this.totalWinnings = 0; 
     this.gamesWon = 0; 
     this.gamesLost = 0; 
    } 

    public Player(String name) { 
     this.name = "default"; 
     this.totalWinnings = 0; 
     this.gamesWon = 0; 
     this.gamesLost = 0; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getGamesWon() { 
     return gamesWon; 
    } 

    public void setGamesWon(int gamesWon) { 
     this.gamesWon += gamesWon; 
    } 

    public int getGamesLost() { 
     return gamesLost; 
    } 

    public void setGamesLost(int gamesLost) { 
     this.gamesLost += gamesLost; 
    } 

    public void setTotalWinnings(int totalWinnings) { 
     this.totalWinnings += totalWinnings; 
    } 

    public int getTotalWinnings() { 
     return totalWinnings; 
    } 
} 

游戏类:

public class Game { 

    private Player player; 
    private LuckyNumberGenerator lng; 

    public Game() { 
     player = new Player(); 
     lng = new LuckyNumberGenerator(); 
    } 

    private void eventLoop() { 
     Scanner scanner = new Scanner(System.in); 
     int choice = 0; 
     boolean exit = false; 
     while (!exit) { 
      System.out.println("Welcome to the Guessing Game"); 
      System.out.println("=============================="); 
      System.out.println("(1) Set Up New Player"); 
      System.out.println("(2) Play One Round"); 
      System.out.println("(3) Player Win Statistics"); 
      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; 
      } 

      switch (choice) { 
      case 1: 
       createNewPlayer(scanner); 
       break; 
      case 2: 
       guessNumber(scanner); 
       break; 
      case 3: 
       printStatistics(); 
       break; 
      case 4: 
       printHelp(); 
       break; 
      case 5: 
       exit = true; 
      } 
     } 
     scanner.close(); 
    } 
} 

回答

1

根据面向对象的设计,像gamesWon,gamesLost,totalWinnings和winPercent属性应该是在Player类只(正确)。

您有一个参数化构造函数,它与Default或Zero参数化构造函数相同。您不用传递名称(String)作为参数,因为您将名称设置为每个对象的“默认”相同字符串,而不考虑传递的值。

问1到100之间的用户(选择)是没有意义的,因为你只有5个开关中的情况。

您不应将扫描仪对象传递给其他方法,因为它只能用于扫描数据并在使用后立即关闭它。 您可以定义一个扫描仪对象,其中包含您需要的任何方法。

+0

感谢您的回答。 1-100是无意的,并且已经修复。 –

1

我修改了构造函数来接受名称。

public Player() { 
     Player("default"); 
    } 

    public Player(String name) { 
     this.name = name; 
     this.winPercent = 0; 
     this.totalWinnings = 0; 
     this.gamesWon = 0; 
     this.gamesLost = 0; 
    } 

玩家是消耗游戏的对象。所以最好在Game中编写逻辑并让玩家尽可能简单。

+0

谢谢!只是为了再次确认,所有的计算都可以在Game类中发生吗?我不需要在Player类中放置任何东西? –

+1

是的。请找到更新的答案。 – JavaUser

+0

JavaUser从默认构造函数中调用其他构造函数有什么用处。如果你想达到这个目的,只有一个构造函数足以将所有的默认值设置为一个类中的变量。 –