From 36fa7d5b9a3980f40bc8b95b1d6b024cc961b81b Mon Sep 17 00:00:00 2001 From: Jacob Schrum Date: Tue, 22 May 2018 01:17:43 -0500 Subject: [PATCH] Mario level viewer can also take 2D array And generate a larger level stitched together --- LevelClipped.jpg | Bin 9905 -> 27781 bytes LevelFull.jpg | Bin 15709 -> 34364 bytes README.md | 2 +- .../src/viewer/MarioLevelViewer.java | 48 ++++++++++++++++-- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/LevelClipped.jpg b/LevelClipped.jpg index 2fb38a0e079ea585c5e3804baa83719cce954675..bf1eb2331b82d32d0758c92fb4b74b409bf257fe 100644 GIT binary patch literal 27781 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 literal 9905 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 I17yAb2Q0VHIRF3v delta 985 zcmdnf!*sW5!cr#Y1sj*oWZS%e+l6^^1CtK(uhk5>7^Wr#_3va)4J~T5oj=AkA^=?wcHqpr$cMLcs&J~{jbn?sckF`A)yDR@V zP2^nYA#`#2xh;l#$|~zr7*aOyy>KoHbi5s5FSy{t-K{+ZFL!+@-##y4@=22|N*PUa z5C2WiNnTcbUU|nS#ojrqkJ+qMe{%nP{%ODGYppCw+o#@o_Hz5<_0NCI%XbwC-%vUE znaSPBXHC`W*T=r8)VhA-*Sl9&KC|SsneC+3p?SytTG=tH zbem7s{YnxyPwh!Qb*awx&$mBY-c?;*+#XRGyDo2boz=hk&Szf&U8~tARLM_1XeZ9} z$Zm3?g_P)-YyTN4R{xXyxBS?n{r6V=XK1Tmd2Di?kv4~$|K^|dFFoc=jx~_mTyL<1 dak79_&*XA>QC!&(n2lC2ZVF+OW0wDa695)RYaRdq diff --git a/README.md b/README.md index 191560f..d6252ee 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ to generate level images by sending several randomly generated latent vectors to If you want to see what level is generated for a specific vector of your choice, then you can use viewer.MarioLevelViewer, which takes a json array of length 32 as a command line parameter that represents a latent vector for the GAN. If you want to actually play these levels, then you should launch -viewer.MarioLevelPlayer in the same way. Additionally, if MarioLevelPlayer is sent a 2D json array, +viewer.MarioLevelPlayer in the same way. Additionally, if MarioLevelViewer or MarioLevelPlayer are sent a 2D json array, then each sub-array is interpreted as a separate latent vector for the GAN, and the segments are stitched together into a larger level. diff --git a/marioaiDagstuhl/src/viewer/MarioLevelViewer.java b/marioaiDagstuhl/src/viewer/MarioLevelViewer.java index 447803d..ad0a973 100644 --- a/marioaiDagstuhl/src/viewer/MarioLevelViewer.java +++ b/marioaiDagstuhl/src/viewer/MarioLevelViewer.java @@ -6,6 +6,8 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import javax.imageio.ImageIO; @@ -17,6 +19,7 @@ import ch.idsia.tools.CmdLineOptions; import ch.idsia.tools.EvaluationOptions; import cmatest.MarioEvalFunction; +import reader.JsonReader; /** * This file allows you to generate a level image for any latent vector @@ -80,9 +83,48 @@ public static void main(String[] args) throws IOException { builder.append(str); } strLatentVector = builder.toString(); - Settings.printInfoMsg("Passed vector: " + strLatentVector); - double[] latentVector = JsonToDoubleArray(strLatentVector); - level = eval.levelFromLatentVector(latentVector); + Settings.printInfoMsg("Passed vector(s): " + strLatentVector); + // If the input starts with two square brackets, then it must be an array of arrays, + // and hence a series of several latent vectors rather than just one. In this case, + // patch all of the levels together into one long level. + if(strLatentVector.subSequence(0, 2).equals("[[")) { + // remove opening/closing brackets + strLatentVector = strLatentVector.substring(1,strLatentVector.length()-1); + String levels = ""; + while(strLatentVector.length() > 0) { + int end = strLatentVector.indexOf("]")+1; + String oneVector = strLatentVector.substring(0,end); + System.out.println("ONE VECTOR: " + oneVector); + levels += eval.stringToFromGAN(oneVector); // Use the GAN + strLatentVector = strLatentVector.substring(end); // discard processed vector + if(strLatentVector.length() > 0) { + levels += ","; + strLatentVector = strLatentVector.substring(1); // discard leading comma + } + } + levels = "["+levels+"]"; // Put back in brackets + System.out.println(levels); + List>> allLevels = JsonReader.JsonToInt(levels); + // This list contains several separate levels. The following code + // merges the levels by appending adjacent rows + ArrayList> oneLevel = new ArrayList>(); + // Create the appropriate number of rows in the array + for(List row : allLevels.get(0)) { // Look at first level (assume all are same size) + oneLevel.add(new ArrayList()); // Empty row + } + // Now fill up the rows, one level at a time + for(List> aLevel : allLevels) { + int index = 0; + for(List row : aLevel) { // Loot at each row + oneLevel.get(index++).addAll(row); + } + } + // Now create the Mario level from the combined list representation + level = LevelParser.createLevelJson(oneLevel); + } else { // Otherwise, there must be a single latent vector, and thus a single level + double[] latentVector = JsonToDoubleArray(strLatentVector); + level = eval.levelFromLatentVector(latentVector); + } } else { System.out.println("Generating level with default vector"); level = eval.levelFromLatentVector(new double[] {0.9881835842209917, -0.9986077315374948, 0.9995512051242508, 0.9998643432807639, -0.9976165917284504, -0.9995247114230822, -0.9997001909358728, 0.9995694511739592, -0.9431036754879115, 0.9998155541290887, 0.9997863689962382, -0.8761392912669269, -0.999843833016589, 0.9993230720045649, 0.9995470247917402, -0.9998847606084427, -0.9998322053148382, 0.9997707200294411, -0.9998905141832997, -0.9999512510490688, -0.9533512808031753, 0.9997703088007039, -0.9992229823819915, 0.9953917828622341, 0.9973473366437476, 0.9943030781608361, 0.9995290290713732, -0.9994945079679955, 0.9997109900652238, -0.9988379572928884, 0.9995070647543864, 0.9994132207570211});