2016-01-23 52 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