繁体   English   中英

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

[英]How do I transfer a local variable between two classes?

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

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

第二个选项不起作用,因为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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM