2017-03-14 65 views
0

我有一個Enum類,一個Player類和一個名爲Lisa的類來擴展Player類。我試圖從Enum中隨機生成一個值(PAPER,ROCK或SCISSORS)。錯誤:「Roshambo的原始類型int沒有字段ROCK。」任何意見或指針將不勝感激。這可能很明顯,但這是我的拳頭Java類和谷歌和Stackoverflow搜索沒有幫助。這是我迄今編碼:從枚舉Java中調用隨機值

更新:感謝您的所有幫助。以下更新了我的整個程序。我想知道是否有人可以提出實現邏輯以確定遊戲的勝者/失敗者的最佳方式/地點?下面是完整的代碼:

主要

package gameOfRoshambo; 
import java.util.Scanner; 
public class RoshamboApp { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Scanner sc = new Scanner(System.in); 

    System.out.println("Welcome to Roshambo!"); 
    System.out.println("Enter your name:"); 

    //Create a new payer 
    Player1 player1 = new Player1(); 
    String name = sc.nextLine(); 
    player1.setName(name); 

    String choice = "y"; 
    while (choice.equalsIgnoreCase("y")) { 
     System.out.println("Hello " + name + ". " + "Would you like to play against Bart or Lisa? (B/L)"); 
     String opponent = sc.next(); 

      if(opponent.equalsIgnoreCase("B")){ 
       //Create a new Bart opponent 
       Bart bart = new Bart(); 
       System.out.println(player1.getName() + ": " + player1.getChoice()); 
       System.out.println("Bart: " + bart.getRoshambo()); 

      } 
      else if (opponent.equalsIgnoreCase("L")){ 
       //Create a new Lisa opponent 
       Lisa lisa = new Lisa(); 
       System.out.println(player1.getName() + ": " + player1.getChoice()); 
       System.out.println("Lisa: " + lisa.getRoshambo()); 

      } 

     // Ask user if they want to continue 
     System.out.print("Continue? (y/n): "); 
     choice = sc.next(); 
     System.out.println(); 
    } 

    //Close Scanner 
    System.out.println("Thanks for playing! Goodbye!"); 
    sc.close(); 
} 

} 

ENUM

package gameOfRoshambo; 
public enum Roshambo 

{ROCK, PAPER, SCISSORS; 

public String toString() { 
    switch(this) { 
     case ROCK: return "Rock"; 
     case PAPER: return "Paper"; 
     case SCISSORS: return "Scissors"; 
     default: throw new IllegalArgumentException(); 
    } 
    } 
} 

PLAYER

package gameOfRoshambo; 
abstract class Player { 
String name; 
Roshambo roshambo; 

abstract int generateRoshambo(); 

public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public Roshambo getRoshambo() { 
    return roshambo; 
} 
public void setRoshambo(Roshambo newRoshambo) { 
    roshambo = newRoshambo; 
} 
} 

PLAYER1

package gameOfRoshambo; 
import java.util.Scanner; 

public class Player1 extends Player{ 

String player1 = ""; 

public Player1(){ 
    super(); 
    } 

Scanner scan = new Scanner(System.in); 

public Roshambo getChoice(){ 
    System.out.println("Enter Choice: Paper, Rock, Scissors (r/p/s): "); 
    char playerChoice = scan.nextLine().toUpperCase().charAt(0); 

    switch (playerChoice){ 
     case 'R': 
      return Roshambo.ROCK; 
     case 'P': 
      return Roshambo.PAPER; 
     case 'S': 
      return Roshambo.SCISSORS; 
     } 
    System.out.println("Invalid input!"); 
return getChoice(); 
} 

public String getPlayer1() { 
    return player1; 
} 

public void setPlayer1(String player1) { 
    this.player1 = player1; 
} 

@Override 
int generateRoshambo() { 
    // TODO Auto-generated method stub 
    return 0; 
} 
} 

BART

package gameOfRoshambo; 
public class Bart extends Player { 

public Bart(){ 
    super(); 
} 

public Roshambo getRoshambo(){ 
    return Roshambo.ROCK; 
    } 

@Override 
int generateRoshambo() { 
    // TODO Auto-generated method stub 
    return 0; 
} 
} 

LISA

package gameOfRoshambo; 
import java.util.Random; 
public class Lisa extends Player { 
private Random rand; 

public Lisa(){ 
    super(); 
    rand = new Random(); 
} 

public Roshambo getRoshambo(){ 
    int shoot = rand.nextInt(3); 
    return Roshambo.values()[shoot]; 
    } 

@Override 
int generateRoshambo() { 
    return 0; 
} 
} 
+0

'Roshambo.values()[蘭特.nextInt(3)]' – Zefick

+3

構造函數應該是'this.rand = new Random();' –

+1

「我遇到了試圖做到這一點的問題」不是問題描述,它只是表明你有一個。請[編輯]你的問題,並描述它究竟如何[*不起作用*](http://importblogkit.com/2015/07/does-not-work/)。你看到任何錯誤/異常/意外輸出? – Pshemo

回答

1
  • 您應該將roshambo字段存儲爲Roshambo不是int和更新您的setter和相應的吸氣劑。這是因爲在Java中,枚舉不能被鑄造成int。請參見下面的堆棧溢出鏈接解釋:

Cast Int to enum in Java

  • 字段名應該開始以小寫
  • 使用Roshambo.values()[choice]
  • 得到1 + rand.nextInt(3);擺脫1 +因爲nextInt()方法有第一枚舉值在位置0。所以
Roshambo.values()[0] = ROCK 
Roshambo.values()[1] = PAPER 
Roshambo.values()[2] = SCISSORS 
  • 在麗莎的構造函數,改變的rand = new Random()代替​​避免分配給您失去一旦構造完成

看到的代碼片斷我是一個新的局部變量下面爲你附上

玩家分類

package gameOfRoshambo; 

abstract class Player { 
    String name; 
    Roshambo roshambo; 

    abstract int generateRoshambo(); 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public Roshambo getRoshambo() { 
     return roshambo; 
    } 
    public void setRoshambo(Roshambo newRoshambo) { 
     roshambo = newRoshambo; 
    } 
} 

麗莎類

package gameOfRoshambo; 

import java.util.Random; 

public class Lisa extends Player { 

    private Random rand; 

    public Lisa(){ 
     super(); 
     rand = new Random(); 
    } 

    public Roshambo getRoshambo(){ 
     int choice = rand.nextInt(3); 
     return Roshambo.values()[choice]; 
     } 

    @Override 
    int generateRoshambo() { 
     return 0; 
    } 

} 
你不使用 abstract int generateRoshambo()方法,以便考慮刪除它和它的麗莎實施新的執行上面還

...

0

你的領域Roshambo是int類型。我認爲你想宣佈它是更像這樣的東西:

Roshambo roshambo; 

這是不好的做法,大寫字段名稱。在這種情況下,它會讓你感到困惑,因爲你把字段名稱與類型混淆了。您需要在代碼的其他幾個位置替換intRoshambo