2016-01-23 96 views
0

我試圖從GAMUT java庫中生成Polymatrix遊戲。從GAMUT生成Polymatrix遊戲

try { 
     PolymatrixGame polyGame = new PolymatrixGame(); 

     polyGame.setParameter("players", nbOfPlayers); //nbOfPlayers = 3L; 
     polyGame.setParameter("actions", nbOfActions); //nbOfActions is a Vector<String> with three entries: each equal "2". 
     polyGame.setParameter("graph", "RandomGraph"); 

     polyGame.setParameter("graph_params", new ParamParser(new String[] {"-nodes", "" + nbOfPlayers, "-edges", "" + 3, "-sym_edges", "1", "-reflex_ok", "0"})); 
     polyGame.setParameter("subgame", "Chicken"); 
     polyGame.setParameter("subgame_params", new ParamParser()); 

     polyGame.initialize(); 

     polyGame.doGenerate(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

我得到以下錯誤:

FATAL ERROR: Unable to generate polymatrix game (subgame Chicken)

java.lang.NullPointerException

我經歷過的源代碼,但挖我無法找到錯誤的根源。錯誤信息本身也不是很有用。

最終,我試圖用給定數量的玩家生成一個隨機Polymatrix遊戲,並給出每個玩家的動作次數。

+0

使用命令行有沒有成功? –

+0

是的。 _java -jar gamut.jar -g PolymatrixGame -players 3 -actions 2 -graphics RandomGraph -graph_params [-nodes 3 -geges 3 -sym_edges 1 -reflex_ok 0] -subgame Chicken -subgame_params [] _成功生成一個遊戲。上面的java代碼似乎完全代表這個命令,但似乎並不工作。 – Auberon

+0

k,我問,因爲我也使用GAMUT來產生隨機遊戲。經過與API的長期鬥爭之後,我簡單地編寫了一個適配器,以便從命令行調用jar。我通過使用'Runetime.getRuntime()。exec(「java -jar ....」)調用jar來將它集成到我的應用程序中。 –

回答

0

經過一些更深入的源代碼挖掘和調試, 我發現是什麼導致NullPointerException

GAMUT假定您要求使用命令行生成遊戲。它將該命令的參數存儲在Global類中的名爲gArgsString數組變量中。

// -- Original command line 
    public static String[] gArgs; 

當產生PolyMatrix遊戲,從GameOutput類的方法被稱爲該gArgs陣列的String S發生變化成正常String然後將其存儲在相關PolyMatrix對象。所提到的方法如下。

public static String arrayToString(String[] args, String sep) 
{ 
StringBuffer buff=new StringBuffer(); 
for(int i=0; i<args.length; i++) { 
    buff.append(args[i]); 
    if (i!=args.length-1) 
    buff.append(sep); 
} 

return buff.toString(); 
} 

Game類中調用如下。 GameOutput.arrayToString(Global.gArgs, " ")

如果Global.gArgsnull,那麼將會拋出NullPointerException,原因很明顯。這正是原始文章中的代碼示例中發生的情況,因爲Global.args從不設置。

快速解決:設置Global.gArgsGlobal.gArgs = new String[]{""};

一些無意義的最佳解決方案:其實設置Global.gArgs到的包含參數String是你想給數組如果你要生成命令遊戲線。 喜歡的東西Global.gArgs = new String[]{"-players", "3", "-actions", "2", "-graph", "RandomGraph", "-graph_params", "[-nodes 3 - edges 3 - sym_edges 1 -reflex_ok 0]", "-subgame", "Chicken", "-subgame_params", "[]"}

(對於「最佳」溶液給出的例子可以或可以不從略微的Global.gArgs實際值,如果遊戲是從命令行實際產生不同)。

然而,奇怪的是,像囚徒困境和雞這樣的簡單遊戲並不需要設置gArgs變量。

+0

指向您的「用戶友好的GAMUT API」的鏈接已死亡。那個項目還活着嗎? –

+0

不是。我刪除了回購,並決定我應該深入瞭解GAMUT是如何運作的。我很想看看其他人如何與GAMUT合作,但還沒有機會。 – Auberon