Exemple #1
0
 public static Knot generateInvalidKnot()
 {
     Edge[] edgeList = new Edge[] {
         Edge.Up, Edge.Up, Edge.Up, Edge.Up
     };
     KnotMetaData metaData = new KnotMetaData ("Invalid", edgeList.Count<Edge>, null, null);
     Knot invalidKnot = new Knot (metaData, edgeList);
     return invalidKnot;
 }
Exemple #2
0
 public static Knot generateComplexKnot(string name)
 {
     Edge[] edgeList = new Edge[] {
         Edge.Up, Edge.Backward, Edge.Right, Edge.Forward, Edge.Down, Edge.Left
     };
     KnotMetaData metaData = new KnotMetaData (name, edgeList.Count<Edge>, null, null);
     Knot complexKnot = new Knot (metaData, edgeList);
     return complexKnot;
 }
Exemple #3
0
        public static Knot coloredKnot(string name)
        {
            string content = "\nY#FF0000FF#\nZ#FF0000FF#\ny#FF0000FF#\nz#FF0000FF#";
            content = name + content;

            KnotStringIO stringIO = new KnotStringIO (content);

            KnotMetaData metaData = new KnotMetaData (name, stringIO.Edges.ToList ().Count<Edge>, null, null);
            Knot coloredKnot = new Knot (metaData, stringIO.Edges.ToList ());
            return coloredKnot;
        }
        /// <summary>
        /// Erstellt ein Challenge-Metadaten-Objekt mit einem gegebenen Namen und den Metadaten des Ausgangs- und Referenzknotens.
        /// </summary>
        public ChallengeMetaData(string name, KnotMetaData start, KnotMetaData target,
                                  string filename, IChallengeIO format,
                                  IEnumerable<KeyValuePair<string, int>> highscore)
        {
            Name = name;
            Start = start;
            Target = target;
            Format = format ?? Format;
            Filename = filename ?? Filename;

            this.highscore = new List<KeyValuePair<string, int>> ();
            if (highscore != null) {
                foreach (KeyValuePair<string, int> entry in highscore) {
                    this.highscore.Add (entry);
                }
            }
        }
Exemple #5
0
        // TODO (jemand): Wir brauchen hier noch eine bessere Lösung / Überladungen / Umgang mit "FakeKnots"
        public static Knot generateSquareKnot(int EdgeLength, string name)
        {
            Edge[] edgeList = new Edge [EdgeLength * 4];

            for (int i = 0; i < EdgeLength; i++) {
                edgeList [i] = Edge.Up;
            }
            for (int i = EdgeLength; i < EdgeLength*2; i++) {
                edgeList [i] = Edge.Right;
            }
            for (int i = EdgeLength *2; i < EdgeLength*3; i++) {
                edgeList [i] = Edge.Down;
            }
            for (int i = EdgeLength *3; i < EdgeLength*4; i++) {
                edgeList [i] = Edge.Left;
            }
            KnotMetaData metaData = new KnotMetaData (name, edgeList.Count<Edge>, null, null);
            Knot squareKnot = new Knot (metaData, edgeList);

            return squareKnot;
        }
 private void AddSavegameToList(string filename, KnotMetaData meta)
 {
     Log.Debug ("SavegameLoader_Tests: filename: ", filename, ", meta:", meta);
 }
        /// <summary>
        /// Diese Methode wird für jede gefundene Spielstanddatei aufgerufen
        /// </summary>
        private void AddSavegameToList(string filename, KnotMetaData meta)
        {
            // Finde den Namen des Knotens
            string name = meta.Name.Length > 0 ? meta.Name : filename;

            // Erstelle eine Lamdafunktion, die beim Auswählen des Menüeintrags ausgeführt wird
            Action<GameTime> preview = (time) => {
                if (previewKnotMetaData != meta) {
                    RemoveGameComponents (time, knotInfo);
                    knotInfo.Clear ();

                    previewRenderer.RenderKnot (loader.FileFormat.Load (filename));
                    previewWorld.Camera.ResetCamera ();
                    previewKnotMetaData = meta;
                    startButton.IsVisible = true;

                    MenuEntry countEntry = new MenuEntry (
                        screen: this,
                        drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem,
                        name: Localizer.Localize ("Edge Count: ") + previewKnotMetaData.CountEdges,
                    onClick: (t) => {}
                    );

                    countEntry.Enabled = false;
                    knotInfo.Add (countEntry);

                    if (filename.Contains (SystemInfo.SavegameDirectory)) {
                        MenuEntry deleteEntry = new MenuEntry (
                            screen: this,
                            drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem,
                            name: "Delete",
                            onClick: (t) => deleteSavegame (filename, t)
                        );
                        deleteEntry.AddKey (Keys.Delete);

                        knotInfo.Add (deleteEntry);
                    }

                    AddGameComponents (time, knotInfo);
                }
            };

            // Erstelle den Menüeintrag
            MenuEntry button = new MenuEntry (
                screen: this,
                drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem,
                name: name,
                onClick: preview
            );
            button.IsSelectable = true;
            button.IsLocalized = false;

            savegameMenu.Add (button);
        }
        /// <summary>
        /// Diese Methode wird für jede gefundene Spielstanddatei aufgerufen
        /// </summary>
        private void AddSavegameToList(string filename, KnotMetaData meta)
        {
            // Finde den Namen des Knotens
            string name = meta.Name.Length > 0 ? meta.Name : filename;

            // Erstelle die Lamdafunktionen, die beim Auswählen des Menüeintrags ausgeführt werden
            Action<GameTime> SelectStartKnot = (time) => {
                selectedStartKnot = loader.FileFormat.Load (filename);

                TryConstructChallenge ();
            };

            // Erstelle die Lamdafunktionen, die beim Auswählen des Menüeintrags ausgeführt werden
            Action<GameTime> SelectTargetKnot = (time) => {
                selectedTargetKnot = loader.FileFormat.Load (filename);

                TryConstructChallenge ();
            };

            // Erstelle die Menüeinträge
            MenuEntry buttonStart = new MenuEntry (
                screen: this,
                drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem,
                name: name,
                onClick: SelectStartKnot
            );
            MenuEntry buttonTarget = new MenuEntry (
                screen: this,
                drawOrder: DisplayLayer.ScreenUI + DisplayLayer.MenuItem,
                name: name,
                onClick: SelectTargetKnot
            );
            buttonStart.IsSelectable = true;
            buttonTarget.IsSelectable = true;
            buttonStart.IsLocalized = false;
            buttonTarget.IsLocalized = false;

            startKnotMenu.Add (buttonStart);
            targetKnotMenu.Add (buttonTarget);
        }
Exemple #9
0
 /// <summary>
 /// Lädt die Metadaten eines Knotens aus einer angegebenen Datei.
 /// </summary>
 public KnotMetaData LoadMetaData(string filename)
 {
     if (KnotMetaDataCache.ContainsKey (filename)) {
         return KnotMetaDataCache [filename];
     }
     else {
         KnotStringIO parser = new KnotStringIO (content: string.Join ("\n", FileUtility.ReadFrom (filename)));
         return KnotMetaDataCache [filename] = new KnotMetaData (
             name: parser.Name,
             countEdges: () => parser.CountEdges,
             format: this,
             filename: filename
         );
     }
 }
Exemple #10
0
        /// <summary>
        /// Lädt die Metadaten einer Challenge aus einer angegebenen Datei.
        /// </summary>
        public ChallengeMetaData LoadMetaData(string filename)
        {
            string name = null;
            KnotMetaData start = null;
            KnotMetaData target = null;
            IEnumerable<KeyValuePair<string, int>> highscore = null;
            using (ZipFile zip = ZipFile.Read (filename)) {
                foreach (ZipEntry entry in zip) {
                    string content = entry.ReadContent ();

                    // für die Datei mit dem Startknoten
                    if (entry.FileName.ToLower ().Contains ("start")) {
                        KnotStringIO parser = new KnotStringIO (content: content);
                        start = new KnotMetaData (parser.Name, () => parser.CountEdges, null, null);
                    }

                    // für die Datei mit dem Zielknoten
                    else if (entry.FileName.ToLower ().Contains ("target")) {
                        KnotStringIO parser = new KnotStringIO (content: content);
                        target = new KnotMetaData (parser.Name, () => parser.CountEdges, null, null);
                    }

                    // für die Datei mit dem Namen
                    else if (entry.FileName.ToLower ().Contains ("name")) {
                        name = content.Trim ();
                    }

                    // für die Datei mit den Highscores
                    else if (entry.FileName.ToLower ().Contains ("highscore")) {
                        highscore = parseHighscore (content.Split (new char[] {'\r','\n'}, StringSplitOptions.RemoveEmptyEntries));
                    }
                }
            }
            if (name != null && start != null && target != null) {
                Log.Debug ("Load challenge file: ", filename, " (name=", name, ",start=", start, ",target=", target, ",highscore=", highscore);
                return new ChallengeMetaData (
                           name: name,
                           start: start,
                           target: target,
                           filename: filename,
                           format: this,
                           highscore: highscore
                       );
            }
            else {
                throw new IOException (
                    "Error! Invalid challenge file: " + filename
                    + " (name=" + name + ",start=" + start + ",target=" + target + ",highscore=" + highscore + ")"
                );
            }
        }
Exemple #11
0
        public void Knot_Construct_Test()
        {
            Edge[] edges = new Edge[] {
                Edge.Up, Edge.Left, Edge.Down, Edge.Right
            };
            string name = "test";

            KnotMetaData metaData = new KnotMetaData (name: name, countEdges: () => edges.Length);
            Knot knot = new Knot (metaData, edges);

            Assert.AreEqual (knot.Count (), edges.Length, "Knotenlänge #1");
            Assert.AreEqual (knot.MetaData.CountEdges, edges.Length, "Knotenlänge #2");

            Assert.AreEqual (knot.Name, name, "Knotenname #1");
            Assert.AreEqual (knot.MetaData.Name, name, "Knotenname #2");

            Assert.Catch (() => {
                KnotGenerator.generateInvalidKnot ();
            }, "invalid Knot construction");
        }
Exemple #12
0
        public void Knot_Move_Test()
        {
            Edge[] edges = new Edge[] {
                Edge.Up, Edge.Left, Edge.Down, Edge.Right
            };
            string name = "test";

            KnotMetaData metaData = new KnotMetaData (name: name, countEdges: () => edges.Length);
            Knot knot = new Knot (metaData, edges);

            knot.AddToSelection (edges [1]); // Edge.Left

            Log.Debug ("Selected: ", knot.SelectedEdges);

            bool success;

            success = knot.IsValidDirection (direction: Direction.Left);
            Assert.IsFalse (success);
            success = knot.IsValidDirection (direction: Direction.Right);
            Assert.IsFalse (success);
            success = knot.IsValidDirection (direction: Direction.Up);
            Assert.IsTrue (success);
            success = knot.IsValidDirection (direction: Direction.Down);
            Assert.IsTrue (success);
            success = knot.IsValidDirection (direction: Direction.Forward);
            Assert.IsTrue (success);
            success = knot.IsValidDirection (direction: Direction.Backward);
            Assert.IsTrue (success);

            success = knot.Move (direction: Direction.Down, distance: 1);
            Assert.IsFalse (success, "Nicht möglich! Knoten würde zu zwei Kanten zusammenfallen!");

            success = knot.Move (direction: Direction.Left, distance: 1);
            Assert.IsFalse (success, "Ungültige Richtung!");

            success = knot.Move (direction: Direction.Right, distance: 1);
            Assert.IsFalse (success, "Ungültige Richtung!");

            // nach oben schieben (1x)
            success = knot.Move (direction: Direction.Up, distance: 1);
            Assert.IsTrue (success, "Gültige Richtung!");

            Assert.AreEqual (knot.Count (), edges.Length + 2, "Knotenlänge nach Verschiebung #1");

            // noch mal nach oben schieben (2x)
            success = knot.Move (direction: Direction.Up, distance: 2);

            Assert.AreEqual (knot.Count (), edges.Length + 2 * 3, "Knotenlänge nach Verschiebung #2");

            // wieder nach unten schieben (3x)
            success = knot.Move (direction: Direction.Down, distance: 3);
            Assert.IsTrue (success, "Gültige Richtung!");

            Assert.AreEqual (knot.Count (), edges.Length, "Knotenlänge nach Verschiebung #3");

            success = knot.Move (direction: Direction.Zero, distance: 3);
            Assert.AreEqual (knot.Count (), edges.Length, "Null-Move");
            success = knot.Move (direction: Direction.Left, distance: 0);
            Assert.AreEqual (knot.Count (), edges.Length, "Null-Move");
            success = knot.Move (direction: Direction.Zero, distance: 0);
            Assert.AreEqual (knot.Count (), edges.Length, "Null-Move");
        }
Exemple #13
0
 public void Knot_Equals_Test()
 {
     CircleEntry<Edge> start = new CircleEntry<Edge> (new Edge[] {
         Edge.Up,
         Edge.Left,
         Edge.Backward,
         Edge.Down,
         Edge.Right,
         Edge.Forward
     }
                                                     );
     KnotMetaData metaData = new KnotMetaData (name: "test", countEdges: () => start.Count ());
     Knot knot = new Knot (metaData, start);
     for (int i = 0; i < 6; i++) {
         Assert.IsTrue (knot.Equals (new Knot (metaData, start)));
         start = start.Previous;
     }
     start.InsertBefore (Edge.Forward);
     start.InsertAfter (Edge.Backward);
     for (int i = 0; i < 6; i++) {
         Assert.IsFalse (knot.Equals (new Knot (metaData, start)));
         start = start.Previous;
     }
 }