我为CS项目制作游戏,其中一个要求是只有一个扫描仪供人类输入。如果我做一个抽象的课程"播放器"它有一个扫描仪对象,并创建两个" human"扩展"播放器"的课程,他们每个人都有自己的扫描仪,或者他们共享"播放器"扫描器?另外,当我结束游戏时,如何关闭扫描仪呢?
答案 0 :(得分: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;
}
}
答案 1 :(得分:1)
根据您的评论和您的问题,我知道您创建了一个Player
抽象类和两个具体的Human
类。而你实际上只想拥有一台扫描仪。
在这种情况下,您应该在Scanner
班Player
中填写static
字段。这样,您只能拥有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
个对象来代表两个玩家。我看到很多人都犯了这个错误。初学者通常喜欢创建类而不是对象。继承意味着“是一种”。另一方面,创建对象可以解释为“是一个”。因此,在您的情况下,Human 是播放器,除非您希望计算机也可以播放。