Basic FitnessEvaluator tries 10x to generate a level containing between 8 and 16 level components.

This commit is contained in:
Woody Folsom
2012-03-18 11:33:18 -04:00
parent d6516388ad
commit 7b6baaa538
3 changed files with 33 additions and 3 deletions

View File

@@ -0,0 +1,14 @@
package dk.itu.mario.level;
import java.util.List;
import dk.itu.mario.level.grammar.LevelParseTree;
public class FitnessEvaluator {
public static boolean isFit(LevelParseTree parseTree, PlayerProfile playerProfile, LevelArchetype levelArchetype) {
System.out.println("Evaluating LevelParseTree for fitness");
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
//a good level has 8-16 components, plus some additional complexity depending on the player's skill level
return levelTemplate.size() > 7 && levelTemplate.size() < 17;
}
}

View File

@@ -82,6 +82,9 @@ public class PCGLevel extends Level {
String grammarFileName = "grammars/overland.grm"; String grammarFileName = "grammars/overland.grm";
grammar = LevelGrammarFactory.createGrammar(new File(grammarFileName)); grammar = LevelGrammarFactory.createGrammar(new File(grammarFileName));
System.out.println("Read grammar from file: " + grammarFileName); System.out.println("Read grammar from file: " + grammarFileName);
System.out.println("==== LEVEL GRAMMAR ====");
System.out.println(grammar);
System.out.println("=======================");
} catch (Exception ex) { } catch (Exception ex) {
System.out.println("Failed to parse grammar file due to exception: " + ex.getMessage()); System.out.println("Failed to parse grammar file due to exception: " + ex.getMessage());
System.out.println("Defaulting to basic overland grammar."); System.out.println("Defaulting to basic overland grammar.");
@@ -185,6 +188,19 @@ public class PCGLevel extends Level {
else { else {
System.out.println("Generating level for component list: "); System.out.println("Generating level for component list: ");
LevelParseTree parseTree = grammar.generateRandomTree(seed, width); LevelParseTree parseTree = grammar.generateRandomTree(seed, width);
int MAX_REGENS = 10;
int nRegens = 0;
while (!FitnessEvaluator.isFit(parseTree,profile,archetype) && nRegens < MAX_REGENS) {
System.out.println("Generated level is NOT fit. Regenerating...");
parseTree = grammar.generateRandomTree(seed, width);
nRegens++;
}
if (nRegens == MAX_REGENS) {
System.out.println("Failed to generate a fit level after " + nRegens + " attempts. Proceeding with unfit level.");
}
List<LevelComponent> levelTemplate = parseTree.getLevelTemplate(); List<LevelComponent> levelTemplate = parseTree.getLevelTemplate();
for (LevelComponent lcomp : levelTemplate) { for (LevelComponent lcomp : levelTemplate) {

View File

@@ -24,7 +24,7 @@ public class LevelGrammarFactory {
if (line.length() == 0 || line.startsWith("#")) { if (line.length() == 0 || line.startsWith("#")) {
continue; continue;
} }
System.out.println("Read: " + line); //System.out.println("Read: " + line);
//split on whitespace //split on whitespace
String[] fields; String[] fields;
if (line.startsWith("VAR")) { if (line.startsWith("VAR")) {
@@ -37,7 +37,7 @@ public class LevelGrammarFactory {
} else if (line.startsWith("RULE")) { } else if (line.startsWith("RULE")) {
fields = line.split("->"); fields = line.split("->");
String ruleName = fields[0].split("\\s")[1]; String ruleName = fields[0].split("\\s")[1];
System.out.println("Rule name: " + ruleName); //System.out.println("Rule name: " + ruleName);
Variable lhs = levelGrammar.getVariable(ruleName); Variable lhs = levelGrammar.getVariable(ruleName);
if (lhs == null) { if (lhs == null) {
throw new RuntimeException("LHS variable not found: " + ruleName); throw new RuntimeException("LHS variable not found: " + ruleName);
@@ -74,7 +74,7 @@ public class LevelGrammarFactory {
if (lBraceIndex != -1) { if (lBraceIndex != -1) {
isOrClause = true; isOrClause = true;
rBraceIndex = clause.indexOf("}"); rBraceIndex = clause.indexOf("}");
System.out.println("Read OR-clause probabilities from: " + lBraceIndex + " to " + rBraceIndex); //System.out.println("Read OR-clause probabilities from: " + lBraceIndex + " to " + rBraceIndex);
String[] doubleFields = clause.substring(lBraceIndex+1,rBraceIndex).split(","); String[] doubleFields = clause.substring(lBraceIndex+1,rBraceIndex).split(",");
chances = new double[doubleFields.length]; chances = new double[doubleFields.length];
for (int i = 0; i < doubleFields.length; i++) { for (int i = 0; i < doubleFields.length; i++) {