WPF Schiebepuzzle

    • Beta
    • Open Source

    Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

      WPF Schiebepuzzle

      Hallo liebes Forum,

      inspiriert durch den User @flori2212 wollte ich mich mal an einem kleinen "Spiel" versuchen. Spiele sind ja ansich nciht mein Ding, wollte aber einfach mal probieren ob das MVVM Pattern auch sowas "hergeben" würde.
      Die Antwort lautet JA. Wenn auch nicht in einzelne Projekte aufgeteil ist es im MVVM Stil gebaut.

      OK, weg vom technischen. Das Spiel ist ein klassisches Schiebepuzzle. Das kennt jeder. Man hat Zahlen (in der Regel 1-15) und muss diese in die richtige Reihenfolge bringen.
      Viel gibt es also nicht zu erklären. Man kann die größe des "Spielfeldes" ändern sowie die Schwierigkeitsstufe.



      Der User kann umschalten zwischen der Nummernvariante und einer mit Bildern.

      Name:
      Schiebepuzzle

      Beschreibung:
      Ein klassisches Schiebepuzzle siehe Wikipedia

      Screenshot(s):



      Verwendete Programmiersprache(n) und IDE(s):
      Vusial Basic.Net - Visual Studio 2017

      Systemanforderungen:
      Habs nun mal unter .Net 4.7 erstellt - auf Wunsch kann ich auf .Net 4.5 runter gehen.

      Systemveränderungen:
      Keine

      Download(s):
      Download Release
      Source: github.com/NoFear23m/Schiebepuzzle

      Lizenz/Weitergabe:
      github.com/NoFear23m/Schiebepuzzle

      Gerne nehme ich Vorschläge und Kritik an. Wir könnten das Spiel ja cooler gestallten und/oder noch weitere Spielarten und Spielfelder implementieren. *gg*

      Schöne Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nofear23m“ ()

      Ganz nett gemacht. Ein paar mal probiert, funktioniert wie es soll, nur der Misch-Algorythmus sollte(finde ich) bei Gottheit und 8x8 spielfeld noch härter mischen, hab oft sehr viele zusammenhängede Teile(siehe Anhang), sehr oft zu einfach zu lösen. Toll das man bei dem kompilat auch direkt eigene bilder nutzen kann, war faul und hab das fertige genommen. :whistling: Also abgesehen vom Mischverhalten, ganz nett. :thumbup:


      Weitere Spielarten:
      Ich selbst hab es ja nicht so mit WPF, aber so ein Teil als 3d Rubikwürfel, mit verschiedenen Grössen, 3x3, 4x4 etc. wäre auch geil, wenn man dann noch Bilder auf den Rubikwürfel machen kann, mit Spielstandsicherung(kann ja dauern das zu lösen), wäre auch ein richtig nettes Spiel für zwischendurch.
      Bilder
      • Unbenannt.jpg

        180,28 kB, 1.412×811, 233 mal angesehen
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „NoIde“ ()

      Hallo @NoIde

      NoIde schrieb:

      Gottheit und 8x8 spielfeld noch härter mischen, hab oft sehr viele zusammenhängede Teile(siehe Anhang), sehr oft zu einfach zu lösen.

      Wirklich? Ich mein - ich muss sagen das ich nicht wirklich Zeit in die "Mischprozedur" investiert habe aber ICH konnte Gottheit bisher nicht lösen :/ . Bin zu doof.
      Das mischen habe ich relativ einfach gelöst.

      VB.NET-Quellcode

      1. Dim r As New Random()
      2. For i As Integer = 0 To (GameSettings.SelectedLevel + 3) * (5 * (GameSettings.SelectedLevel + 1))
      3. Dim wasMoved As Boolean = False
      4. Do Until wasMoved
      5. Dim currButtonIndex = r.Next(AllButtons.Where(Function(x) x.StoneType = PlayStoneType.NormalButton).Count - 1)
      6. Dim placeholderindex = AllButtons.IndexOf(AllButtons.Where(Function(x) x.StoneType = PlayStoneType.Placeholder).Single)
      7. If IsStoneNeerPlaceholder(currButtonIndex, placeholderindex) Then
      8. DoMoveButton(currButtonIndex, placeholderindex, False)
      9. wasMoved = True
      10. End If
      11. Loop
      12. Next

      Es wird einfach so oft ein Stein bewegt (nur welche die bewegt werden dürften) bis die Anzahl erreicht ist. Bei Gottheit ist das mit 8x8 Spielfeld (7 + 3) * (5 * (7 + 1)) = 280
      280 bewegungen zu lösen ist schon heftig. Klar, es kann sein das einige male eine Bewegung dabei ist welche quasi wieder "zurück" geht so das es eben nicht ganz so viele sind aber dennoch ist das schon heftig.

      Wenn jemand eine bessere Idee für das verschieben der Steine hat nur her damit. Ich bin in sowas echt nicht gut.

      NoIde schrieb:

      Ich selbst hab es ja nicht so mit WPF, aber so ein Teil als 3d Rubikwürfel,

      Wäre auch eine coole Idee. In 3D damit der Würfel drehbar ist. Wäre cool. 8o

      NoIde schrieb:

      mit Spielstandsicherung

      Das ist eine tolle Idee. Spielstandsicherung werde ich glaube ich noch einbauen. Danke für den Input.

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Nofear23m schrieb:

      Bin zu doof.


      Moin, @Nofear23m
      Das kann ich nicht glauben. Hast nur noch keine Strategie dafür entwickelt, spielt man das einige male wird es einfacher. Schwieriger wird's durch grösse m.M.n. nicht wirklich, dauert nur länger.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin
      Werde mir das mit dem "Mischen" mal genauer überleen, vieleicht komme ich ja noch auf eine gute Idee.

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      OK, ich habe was getan.

      @NoIde - Ich habe das Mischverhalten optimiert und auch performance rausgeholt. Nun sollte besser gemischt werden. Die Anzahl der zu bewegenden Steine habe ich erstmal so belassen jedoch wird nun verhindert das ein und der selbe Stein zweimal hintereinander bewegt werden kann. Somit sollte schon mal ein besseres Verhalten erzielt werden.

      Ist im nächsten Release dann drinnen. Sowie einige Bugfixes und ein AboutDialog. Möchte aber die Spielstandsicherung auch noch reinmachen.

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Jou, ohne das ein Feld wieder zurück bewegt wird sollte es besser sein, da bestand ja 1/4 wahrscheinlichkeit, das es passiert. Vllt. wäre es auch eine Idee, die einzelnen Felder alle via Zufall zu setzen anstatt zufälige Verschiebungen. Mein ich etwa so, via Random ein Feld(Spielstein sag ich mal) auswählen und diesen via Random einem Feld zuweisen. Kann mir vorstellen das sich so richtges "Chaos" erstellen lässt, somit hätte man deutlich länger zu tun.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      NoIde schrieb:

      Vllt. wäre es auch eine Idee, die einzelnen Felder alle via Zufall zu setzen anstatt zufälige Verschiebungen

      Das geht leider nicht da das Puzzle dann unlösbar werden kann. Leider

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Echt? Kann ich mir fast nicht vorstellen. Das probier ich morgen mal mit einer Quick'n'Dirty Version in WinForms aus.

      Edit @Nofear23m
      Ich werde alle möglichen Kombinationen auf einem 3x3 Feld probieren, wenn die alle lösbar sind, ist das auch bei allen anderen grössen der Fall.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

      Genau, ein Randstein ist nämlich das Problem. Ich hatte das mit dem zufälligen Platzieren von Steinen probiert. Wäre ja auch viel performanter und einfacher aber es was dann wirklich unlösbar, auch bei einem ganz kleinen Spielfeld. Aber wenn du eine Lösung findest wäre das Toll.

      PS: Du kannst eigendlich das Repository klonen und einfach nur die Methode MixStonesCommand_Execute aus der GamePlay.vb umschreiben.
      Dann brauchst du nicht alles erstellen. Alles was das Mischen betrifft ist in dieser Methode drinnen.

      Einfacher oder?

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Ja wäre es. Habe gerade mal Permutiert, sind doch einige zu viele Varianten um von Hand zu testen. Macht aber nix, probier ich dann automatisiert, also einen Solver.

      Falls jemand auch spass an sowas hat probiert euch mal hier aus:
      hacker.org/
      Hab dort schon den einen oder anderen guten Highscore erreicht, mein besten hab ich in Runaway Robot gemacht.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin
      Hallöle

      @NoIde bist du bereits weiter gekommen? Wäre interessant ob ich mich da geirrt hatte oder ob es denn wirklich so ist das ein zufälliges platzieren der Steine nicht funktioniert.

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Moin,

      @Nofear23m weitergekommen, schon ein wenig, planung steht für den Sover, muss meine Theorie aber noch in Code giessen, hab bisher alles nur auf Papier. Habe auch ein paar zufällige Spiele gemacht, da war aber schon eins dabei welches sich nicht lösen lies. Den Solver werde ich kommende Woche machen, bin mal bespannt, wie viele unlösbar sind auf 3x3, von den 362879(+1 Zielstellung) Möglickeiten.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

      Sehr cool
      Gibst dir richtig mühe ;)

      Aber rein von der Logik her kann es meiner Meinung nach nicht klappen. Die Steine können ich "echt" ja nur begrenzt bewegt werden. Aber wie gesagt - vieleicht ein denkfehler von meiner Seite.

      Schöne Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Ja, Planung ist immer wichtig, auch wenn die Aufgabe nicht sehr gross ist. Aber du kennst das ja mit der Zeit, da ich mich aktuell auch in die Digitale Elektronik einarbeite, kommt vieles zu kurz. Da ich jetzt aber ein Kapitel abschliesse nehm ich mir Zeit dafür, hatte ein paar experimente mit ICs gemacht (CD4011, CD4511, CD4027, CD4029, NE555) Hab erfolgreich einen Countdown-Timer aufgebaut, welcher auch aufwärts ticken kann und ganz nett LEDs blinken lassen kann. Da ist der erste Grundstein nun gelegt. Meine eigene USB-Soundkarte scheint nicht mehr so weit entfernt zu sein, auch wenn's noch viel zu lernen gibt.
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „NoIde“ ()

      Moin,

      so habe mir heute ein wenig Zeit genommen und mal ermittelt, wie viele und welche der 362879(+1 Zielstellung)(auf 3x3) Möglickeiten denn lösbar sind. Da es einen(vllt. auch mehr) Weg(e) gibt, vorher zu testen ob so ein Puzzle lösbar ist, dachte ich mir, mach ich das erstmal vor so einem Solver, macht Sinn, nicht lösbare braucht man ja garnicht erst anfangen versuchen zu lösen. Das Ergebniss finde ich überraschend, denn wenn man die Zielstellung mit einrechnet, sind exakt 50% der Varianten lösbar, ohne diese einzurechnen sind es 49,9998622130242%.

      Ich werde den Algo noch ein wenig verbessern(funktioniert gerade nur bei 3x3, soll aber jede grösse gehen), dann mach ich den Solver, vllt. dieses Wochenende sonst im Laufe der nächsten Woche.

      Im Anhang eine Textdatei, wo sichtbar ist, welche der Varianten(3x3) lösbar sind.(Zielstellung nicht inkludiert)

      Die Zahlenreihen sind in einer Zeile, bedeutet 123460578 ist auf dem Spielfeld
      123
      460
      578
      wobei die 0 das freie Feld darstellt.


      Dateien
      • result.zip

        (874,37 kB, 189 mal heruntergeladen, zuletzt: )
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „NoIde“ ()

      Also genau 50% ist schon witzig. Aber ich denke das der Wert steigen wird mit der größe des Spielfelds da ja die Ränder das problem sind.
      Aber fakt ist, beim "wahllosen" mischen kann es unlösbar werden.

      @NoIde hast du schon das "verbesserte" mischen ausprobiert? Ist es nun besser?

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Hi,

      @Nofear23m hab jetzt eben kompiliert, das Kompilat auf Github scheint noch das alte zu sein. Kommt leider immer noch vor das mehr als das halbe Rätsel schon fertig ist. Hier gleich 2 mal hintereinander.

      Vllt. einfach noch eine Bedingung rein machen, so das N%,(je nach Schwierigkeitsgrad ) der Steine auf falschen Platz sein müssen, solange Quote nicht erreicht weiter mixen.
      Bilder
      • Unbenannt.png

        107,17 kB, 1.258×639, 194 mal angesehen
      • Unbenannt1.png

        108,42 kB, 1.262×657, 209 mal angesehen
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin
      Hallo

      Das passt schon, das ist die aktuelle version.
      Das mit der Quote ist aber eine gute Idee. Warum hab ich nicht an sowas gedacht.
      Dann regelt man einfach mit der Quote den Schwierigkeitsgrad.

      Gute idee, werd ich am Wochenende probieren.

      Grüße
      Sascha
      If _work = worktype.hard Then Me.Drink(Coffee)
      Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

      ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

      Nofear23m schrieb:

      Das passt schon, das ist die aktuelle version.


      Ok, war ein wenig iritiert, wegen der unterschiedlichen Footer. Beim Release 1.0.0.0 steht "Powered by Sascha Patschka", in der Projektmappe "Powered by Sascha Patschka - Idea by flori2212".
      Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
      „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
      Benjamin Franklin