如何在两个类之间传递局部变量?

时间:2016-04-28 15:59:21

标签: java class

我正在编写一个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类中分配,我也不知道如何制作它。

非常感谢任何帮助,谢谢。

1 个答案:

答案 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()