2015-09-27 133 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