我正在编写一个noughts并交叉代码,这些代码可以使用控制台参数来决定使用哪种策略(不同的AI类)。如果用户选择'ultimatecomputerplayer',那么这将被实现为p1 / p2,具体取决于他们输入的顺序和其他策略(可能是'humanplayer'等) 我的问题是最终的类需要知道它是哪个符号,目前游戏运行类只是将p1分配给X而p2分配给O但是我的终极类是在假定它是X的情况下编写的,所以这就产生了问题。
这是分配策略和符号的代码:
NCGridV3 theGrid = new NCGridV3(gridSize, gridSize);
GameRunnerV3 theGame = new GameRunnerV3();
Scanner sc = new Scanner(System.in);
ArrayList <NCPlayer> ret = new ArrayList <NCPlayer>();
for (int i = 1; i < args.length; i++)
{
switch (args[i])
{
case "RandomComputerPlayer":
ret.add(new RandomComputerPlayer());
break;
case "SimpleComputerPlayer":
ret.add(new SimpleComputerPlayer());
break;
case "UltimateComputerPlayer":
ret.add(new UltimateComputerPlayer());
break;
case "HumanPlayer":
ret.add(new HumanPlayer(sc, theGame));
break;
}
}
NCPlayer p1 = ret.get(0);
NCPlayer p2 = ret.get(1);
p1.setMySymbol(SquareStatus.CROSS);
p2.setMySymbol(SquareStatus.NOUGHT);
我试着像这样分配策略的符号:
public class UltimateComputerPlayer extends GenericPlayer implements NCPlayer
{
public UltimateComputerPlayer()
{
super();
}
@Override
public GridCoordinate getNextMove(NCGridV3 currentGrid)
{
SquareStatus symbol = GenericPlayer.getMySymbol();
但是eclipse告诉我,我无法对非静态方法进行静态引用。
我尝试的另一个选项是将一个整数传递给UltimateComputer类,它在游戏运行器类的循环中是'i',然后让符号赋值取决于调用类的位置,如下所示:
public UltimateComputerPlayer()
{
super();
SquareStatus mysymbol;
if (NC == 1)
mysymbol = NCGridV3.SquareStatus.CROSS;
if (NC == 2)
mysymbol = NCGridV3.SquareStatus.NOUGHT;
}
@Override
public GridCoordinate getNextMove(NCGridV3 currentGrid)
{
.......
但是这个变量没有在GridCoordinate类中分配,我也不知道如何制作它。
非常感谢任何帮助,谢谢。
答案 0 :(得分:0)
第二个选项不起作用,因为NC没有定义(至少我不知道它会在哪里),你也可以在构造函数中将符号赋值给局部变量SquareStatus mysymbol
,一旦你离开构造函数就会消失。首先必须使mysymbol成为一个实例变量(通过将其移到构造函数上方)。然后您可以选择在构造之后使用setter或将数字添加到构造函数
class UltimateComputerPlayer {
private SquareStatus mysymbol;
public UltimateComputerPlayer(int nc) {
super();
if (nc == 1)
mysymbol = NCGridV3.SquareStatus.CROSS;
if (nc == 2)
mysymbol = NCGridV3.SquareStatus.NOUGHT;
}
// [...]
}
然而,这似乎是一个通用概念,应该移到父类中。另外,我会避免在课堂上使用魔术数字。决定在类外使用什么符号,并使用符号作为参数调用构造函数,而不是数字。
正如@VictorSorokin所说,在您的第一个解决方案中,只需拨打getMySymbol()
而不是GenericPlayer.getMySymbol()