2017-03-13 28 views
1

我無法完成此問題。我無法讓控制檯在問題中打印名稱。這是一個創建roshambo遊戲的程序。如何獲取正確的名稱在控制檯中顯示? Java

這是我的代碼。

public enum Roshambo { 

    rock { 
     public String toString() { 
      return "rock"; 
     } 
    }, 
    paper { 
     public String toString() { 
      return "paper"; 
     } 
    }, 
    scissors { 
     public String toString() { 
      return "scissors"; 
     } 
    } 
} 

public abstract class Player { 

    String name; 
    Roshambo value; 

    abstract Roshambo generateRoshambo(); 

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

    void setRoshambo(Roshambo value) { 
     this.value = value; 
    } 

    String getName() { 
     return name; 
    } 

    Roshambo getRoshambo() { 
     return value; 
    } 
} 

class Bart extends Player { 
    public Roshambo generateRoshambo() { 
     super.name = "Bart"; 
     return Roshambo.rock; 
    } 
} 


public class Lisa extends Player { 
    public Roshambo generateRoshambo() { 
     super.name = "Lisa"; 
     Random r = new Random(); 
     int ch = r.nextInt(3); 
     if (ch == 0) return Roshambo.rock; 
     else if (ch == 1) return Roshambo.paper; 
     else return Roshambo.scissors; 
    } 
} 

public class Player1 extends Player { 

    char value; 

    Player1(char value) { 
     this.value = value; 
    } 

    public Roshambo generateRoshambo() { 
     if (value == 'r') 
      return Roshambo.rock; 
     else if (value == 's') 
      return Roshambo.scissors; 
     else 
      return Roshambo.paper; 
    } 
} 

import java.util.Scanner; 

public class RoshamboApp { 
    public static void main(String args[]) { 

     char choice = 'y'; 
     char player; 

     Scanner s = new Scanner(System.in); 
     System.out.println("Welcome to the game of Roshambo"); 

     Bart b = new Bart(); 
     Lisa l = new Lisa(); 
     Player p = null; 

     String name; 
     System.out.println("Enter your name : "); 
     name = s.next(); 

     System.out.println("Would you like to play Bart or Lisa?(B/L):"); 
     player = s.next().charAt(0); 

     if (player == 'b') 
      p = b; 

     else if (player == 'l') 
      p = l; 

     while (choice != 'n') { 
      System.out.println("Rock, paper or scissors?(R/P/S)"); 
      char ch = s.next().charAt(0); 
      Player1 p1 = new Player1(ch); 
      System.out.println(name + ":" + p1.generateRoshambo()); 
      System.out.println(player + ":" + p.generateRoshambo()); 

      if (p1.generateRoshambo() == p.generateRoshambo()) 
       System.out.println("Draw!"); 

      else if (p1.generateRoshambo() == Roshambo.paper && p.generateRoshambo() == Roshambo.rock) 
       System.out.println(p1.getName() + "Wins"); 

      else if (p1.generateRoshambo() == Roshambo.paper && p.generateRoshambo() == Roshambo.scissors) 
       System.out.println(p.getName() + "Wins!"); 

      else if (p1.generateRoshambo() == Roshambo.scissors && p.generateRoshambo() == Roshambo.rock) 
       System.out.println(p.getName() + "Wins"); 

      System.out.println("Play again?(y/n):"); 
      choice = s.next().charAt(0); 
     } 
    } 
} 

控制檯打印出這樣的:

歡迎Roshambo的遊戲 輸入您的姓名: 肖恩 你喜歡玩巴特和麗莎(B/L): b 搖滾,紙張或剪刀(R/P/S) 紙 肖恩:紙 b:再次 玩搖滾 nullWins(Y/N):

我試圖讓b:搖滾樂成爲巴特:搖滾樂和無效樂贏得成功。

回答

1

首先,有過於複雜的代碼周圍,喜歡這裏:

public enum Roshambo { 
ROCK("rock"), ... other constants ; 

private final String stringRepresentation; 
private Roshambo(String stringRepresentation) { 
    this.stringRepresentation = stringRepresentation; 
} 

@Override 
public String toString() { return stringRepresentation; } 

例如。

關於你在main中的實際問題:你的Player1類再次比需要的複雜10倍。只需詢問用戶:「你想玩什麼」;並根據他的意見,選擇一個Roshambo。

換句話說:我會建議你

  1. 更改播放器類ComputerPlayer,表明這個人是莫名其妙計算Roshambo值
  2. 更改PLAYER1類爲UserPlayer什麼的一致好評。

長話短說:您的主要問題是您的操作太複雜。所以你不能專注於你試圖解決的問題。另一個例子;你可以改變電腦玩家的喜歡

char playerSelection = ... coming from user 
if (playerSelection == 'b') { 
    player = new Bart(); 
} else { 
    player = new Lisa(); 
} 

這些單字符命名變量不出聲的選擇;他們只是有助於混淆你打算做的事情。

0

你的問題是要打印的球員,這就是他們想要玩遊戲者的角色:

player = s.next().charAt(0); 
... 

System.out.println(name + ":" + p1.generateRoshambo()); 
System.out.println(player + ":" + p.generateRoshambo()); 

應打印的球員的名字:

System.out.println(p.getName() + ":" + p.generateRoshambo()); 

注意

此代碼過於複雜,可以用更少的代碼行完成相同的任務,並且更清晰。研究重構。

相關問題