2015-09-27 186 views
1

我正在做一個CS項目的遊戲,其中一個要求是隻有一個掃描儀用於人類輸入。如果我創建一個具有掃描器對象的抽象類「播放器」,並創建兩個擴展「播放器」的「人類」類,他們每個人都有自己的掃描器還是共享「播放器」掃描器?另外,我在結束遊戲時如何關閉掃描儀?抽象類與掃描儀

+0

如果您想共享播放器掃描儀,請將其標記爲靜態。 – user2953113

回答

1

根據您的意見和你的問題,我知道您創建了一個Player抽象類和兩個具體Human類。而你實際上只想要一臺掃描儀。

在這種情況下,您應該在Playerstatic中設置Scanner字段。這樣你只有一個實例的Scanner。你應該添加一個吸氣劑。讓我告訴你的代碼:

public abstract class Player { 
    private static Scanner scanner = new Scanner (System.in); 

    public static Scanner getScanner() { 
     return scanner; 
    } 
} 

如果你想關閉掃描儀,只需調用close

Player.getScanner().close(); 

是不是很簡單?

另一件我不明白的事情是,你爲什麼要創建一個抽象類?這裏是我的建議:使Player成爲一個具體的課程,並創建兩個Player對象來表示這兩個玩家。我看到很多人犯這個錯誤。初學者經常喜歡創建類而不是對象。繼承意味着「是一種」。另一方面創建對象可以被解釋爲「是一個」。所以在你的情況下,人類是一個播放器,除非你想讓電腦播放。

+0

我有玩家階級,因爲我也必須實現不同的AI控制玩家。我有具體的方法「canmakemove」和抽象方法「getplayertype」和「getmove」。有沒有比抽象類更好的做這件事? – xSpartanCx

1

做他們每個人都有自己的掃描儀或

如果只有Player類有Scanner,孩子並不會自動擁有該Scanner除了它是爲孩子/其它類訪問。

他們共享「播放器」掃描儀嗎?

不能直接到你允許他們訪問掃描儀,通過static訪問或通過getter或任何方法手段。

我在結束遊戲時如何關閉掃描儀?

您可以在Player中聲明方法,它可以爲您做到這一點。我想你只想關閉掃描儀一旦人類贏得

此外,值得注意的是,如果您正在使用多線程的東西,Scanner不是線程安全的。所以,我建議你應該更好地爲個人創建單獨的Scanner,並在人類放鬆遊戲後關閉它。

如果您取出由System.in輸入,你應該有共同的Scanner,否則關閉一個Scanner將阻止所有其他Scanner期從閱讀。

您可以有單個Scanner實例,因爲您可以使用Singleton設計模式。

abstract class Player { 
    private static final Scanner scanner = new Scanner(System.in); 

    public Scanner getScannerInstance() { 
     return scanner; 
    } 
} 
+0

我的教授希望我們在整個程序中只有一臺掃描儀,所以如果有兩個人在玩遊戲,我就無法做到,因此每個人都有自己的掃描儀(這是合乎邏輯的事情)。要創建掃描儀,我使用'掃描儀掃描=新掃描儀(System.in);',每個玩家只使用'scan.next();' – xSpartanCx

+0

但是如果我這樣做,將不會有兩個掃描儀,因爲我必須使用'oPlayer.closeScanner()'和'xPlayer.closeScanner();'來關閉每個玩家。 – xSpartanCx