2016-04-28 80 views
1

我正在寫一個可以採用控制檯參數來決定使用哪種策略的不相關代碼(不同的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

嘗試'getMySymbol()',而不是'GenericPlayer.getMySymbol()':) –

+0

AAAAH非常感謝你不敢相信我沒有嘗試過 – liamw

回答

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

相關問題