我目前正在开展 TESTING 游戏项目。以下是我的项目的详细信息。
这是我的第一个Maven项目,我真的对它的工作方法知之甚少。请帮助我!
1] GameProject - 是Eclipse中的Maven项目。该项目的主要目标是为第一人称射击游戏创建一个游戏玩家(也称为 bot )。当您运行此Java应用程序时,它将使用新的播放器运行游戏,其操作将由我在此项目中编写的代码确定。
它有很多java文件和一个主类。有一个名为 PlayerInfo.Java 的类,其中包含用于决定玩家在玩游戏时应该做什么的代码。它就像玩家的大脑。让我们说它有大约40个变量,它们决定了玩家的行为。
示例 - 类中的一个变量可能类似于 Player_HEALTH_Level = 50 。这意味着玩家应该拥有至少50%的生命值才能与其他玩家战斗。如果它小于此值,那么他/她应该找到一个健康包并增加该值。同样,我还有其他39个参数。
2] 测试项目 - 这也是一个maven项目。这是为了在游戏中测试我的玩家(机器人)性能。比如,他赢了多少次比赛,他收集的武器数量等等。
设计此项目的方式是,它需要 GameProject 的JAR文件的路径作为主方法中的输入。然后,它运行给定JAR的bot / player并在单独的文件中打印出游戏结果。
示例 - 在主方法中,我指定类似这样的东西
String playerJAR_Path =" C:\ Users \ Player \ Netbeans \ GameProject-one-SNAPSHOT-jar.jar"
注意: - 以上是GameProject JAR文件夹的路径。基本上,我只是将GameProject构建为" Maven Install"它会为我创建一个JAR。然后使用第二个Project上的路径地址。
希望这可以让您了解我的项目结构。
问题
真正的问题是我必须基本上运行我的GameProject大约500次并捕获结果。我正在使用遗传算法来演化播放器参数并随着时间的推移改进它们。
目前,我可以在我的TestingProject中使用for循环来循环500次迭代,它会为我执行500次GameProject。
为了应用遗传算法,在EACH迭代结束后,我修改了Player / bot行为中的参数(特别是在文件 PlayerInfo.Java 中)。对于迭代2运行,我可以更改 Player_HEALTH_Level = 48 的值,然后在第三次运行时更改为56,依此类推。
为了做到这一点,我需要在我的FOR循环中实现我的测试项目。
也许可能是这样的
*For int i=1 to 500 do ;
String playerJAR_Path = "C:\\Users\\Player\\Netbeans\\GameProject-one-SNAPSHOT-jar.jar";
Run the Testing();
Modify the parameters in PlayerInfo.Java (Inside GameProject)
Change the values of 40 Variables in that class.
Build the GameProject Project so that, it creates a UPDATED JAR File
End FOR;*
我真的很困惑,比如如何自动构建第一个项目,以及如何更改类变量的值。
任何人都可以帮我提一些如何实现同样的建议。我不介意以什么方式做到这一点。能够自动完成整个测试过程。
其他详细信息: 1.系统 - Windows 7,Intel Xeon 12核心处理器,24GB RAM,3 TB闪存驱动器。 2.对于For-Loop上的每次迭代,它产生一百万条记录(在Eclipse的控制台窗口中,对于for循环中的每次迭代,将包含一条百万行)。我还需要知道,如何将其写入文件,而不是泛滥控制台。 当我最初测试时,Eclipse挂起了Out of Heap Memory Error。然后我在eclipse INI文件中将所有RAM值增加到2GB。这不知何故设法不会因为内存错误而崩溃。
编辑 - 向问题添加代码。
public class PlayerInfo {
public int minDistanceToFollowEnemy = 200; // This is in UT Units. If Bot sees an enemy over this distance
// He/she tries to follow him and attack.
public int probabilityToFollowEnemy = 50; // Distance between the bot and Enemy will be calculated in real time.
//If the distance is lower, chasing priority is Higher.
public int probabilityOfFlagHolderReturn = 50; // If the Bot holds the Enemy flag, what's the probability that he/she
//Runs to home base directly without being distracted to collect items, fight with enemies?
public int probabilityOfGettingEnemyFlag = 10; // If bot does not carries the enemy flag, it's probability to hunt for enemy flag.
public double maxDistanceToGetHealthPack = 1000 ; // If Bot finds a health pack within this distance && It needs a Health pack
// Then It searches one and grabs it.
public int minHealthLevel = 30; // Min Health level before bot starts looking for Health Pack
public int probabilityToGetHealthPack=80; // Probability that Bot will Pick one health pack if it sees on its path/view.
public int probabilityToSelectItem = 8 ; //Based on the current Bot's view, what's the probability that it will select to choose the item.
}
GameProject中的主类PlayerBot.java
public static void main(String args [])抛出PogamutException {
AddNativeBot addbot = new AddNativeBot();
//addbot.addNativeBots(4);
// starts 2 or 4 CTFBots at once
// note that this is the most easy way to get a bunch of bots running at the same time
new UT2004BotRunner<UT2004Bot, UT2004BotParameters>(CTFBot.class, "PlayerInfo").setMain(true)
.startAgents(
new CTFBotParams().setBotSkin("HumanMaleA.MercMaleC").setBotType(0).setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 1"))
//,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleA").setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 2"))
//,new CTFBotParams().setBotSkin("HumanMaleA.MercMaleA") .setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 3"))
//,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleB").setSkillLevel(5).setTeam(0).setAgentId(new AgentId("Attacker 4"))
//,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleB").setSkillLevel(5).setTeam(1).setAgentId(new AgentId("Attacker 5"))
//,new CTFBotParams().setBotSkin("HumanFemaleA.MercFemaleB").setSkillLevel(5).setTeam(1).setAgentId(new AgentId("Attacker 6"))
);
}
// Project 2
public static String[] getArgs_CTF_2v2v1() {
return new String[] {
"-y", // MATCH TYPE
"CTF", // CAPTURE THE FALG
// GENERIC CONFIG
"-u",
"C:\\UT",
"-h", // human-like-log
"-r",
"./results",
"-n",
"Test-CTF-2v2v1", // MATCH NAME
"-s",
"CTFServer",
// CUSTOM BOTS CONFIG
"-a",
"C:\\Users\\Project\\Downloads\\CTFbot\\target\\mavenproject1-1.0-SNAPSHOT.one-jar.jar;C:\\Users\\Project\\Downloads\\CTFbot\\target\\mavenproject1-1.0-SNAPSHOT.one-jar.jar",
"-b",
"CTFBot1;CTFBot2",
"-l",
"1;2",
"-k",
"HumanFemaleA.NightFemaleA;HumanFemaleA.NightFemaleA",
"-i",
"0;1",
// NATIVE BOTS CONFIG
"-c", // NATIVE BOT COUNT
"2",
"-d", // NATIVE BOT NAME
"Native1;Native2",
"-e", // NATIVE BOT SKILL
"5;6",
"-g", // NATIVE BOT TEAMS
"0;1",
// HUMANS CONFIG
"-x",
"1", // HUMAN COUNT
"-z",
"1",
// CAPTURE THE FLAG SPECIFIC CONFIG
"-m",
"CTF-LostFaith",
"-f",
"1", // SCORE LIMIT
"-t",
"5", // TIME LIMIT
};
}
//主类
public static void main(String[] args) throws JSAPException {
// -----------
// FOR TESTING
// -----------
//args = getArgs_DM_2v2v1();
//args = getArgs_TDM_2v2v1();
args = getArgs_CTF_2v2v1();
// --------------
// IMPLEMENTATION
// --------------
initJSAP();
header();
readConfig(args);
sanityChecks();
switch (matchType) {
case DM:
executeDeathMatch();
break;
case TDM:
executeTeamDeathMatch();
break;
case CTF:
executeCaptureTheFlag();
break;
case DD:
executeDoubleDomination();
break;
default:
fail("Unsupported match type specified " + matchTypeName + " recognized as " + matchType.shortName + "[" + matchType.name + "].");
}
}
}
答案 0 :(得分:1)
文本的圣墙。
好的,有几件事。仅仅因为Maven为你创造了一个罐子,并不意味着你必须使用罐子。你可以直接给这个班级打电话。
因此,您的测试将实例化该类,而不是尝试从命令行运行该类。
二。您不必直接修改变量的内部状态。我的建议是将更改保存到文件并让您的播放器读取文件。对于下一次迭代,您修改文件并再次运行播放器。
如果您有具体问题,请告诉我,我会改进答案。