Mahjong - Ordnen Sie die Fliesen, um sicherzustellen, zumindest ein Pfad zum Sieg, unabhängig davon, layout

StackOverflow https://stackoverflow.com/questions/159547

  •  03-07-2019
  •  | 
  •  

Frage

Unabhängig von dem layout der Fliesen, ist es eine gute Möglichkeit, um divvy sich die Fliesen so, dass Sie können gewährleisten, dass der Benutzer, dass zu Beginn des Spiels, es gibt mindestens einen Weg, um die Vollendung des Puzzles und das Spiel zu gewinnen?

Offensichtlich, je nach dem Benutzer bewegt, können Sie sich abschotten, von gewinnen.Ich möchte nur in der Lage sein zu sagen immer die Benutzer, die puzzle ist gewinnbar, wenn Sie gut spielen.

Wenn Sie nach dem Zufallsprinzip statt Fliesen am Anfang des Spiels, es ist möglich, dass der Benutzer könnte ein paar Züge und nicht in der Lage zu tun mehr.Das wissen, das ein Rätsel ist zumindest lösbar, sollte es mehr Spaß zu spielen.

War es hilfreich?

Lösung

Ort alle Fliesen in umgekehrter Richtung (dh layout aus dem board beginnen Sie in der Mitte, arbeiten out)

Necken die Spieler weiter, die Sie tun könnten, ist es sichtbar, aber bei sehr hoher Geschwindigkeit.

Andere Tipps

Spielen Sie das Spiel in umgekehrter Richtung.

Randomly auslegen Stücke Paar für Paar, in Orten, wo man sie in den Haufen schieben konnte. Sie müssen einen Weg zu weiß , wo Sie Stücke zu platzieren, um mit einem Haufen am Ende erlaubt sind, die einige voreingestellte Muster paßt, aber Sie müssen die sowieso.

Ich weiß, das ist eine alte Frage, aber ich stieß auf dieses bei der Lösung des Problems selbst.Keine der Antworten hier sind ziemlich perfekt, und einige von Ihnen haben komplizierte Einschränkungen oder brechen auf pathologische layouts.Hier ist meine Lösung:

Lösen Sie die platine, vorwärts, nicht rückwärts) mit unmarkierten Fliesen.Entfernen Sie zwei freie Fliesen zu einem Zeitpunkt.Schieben Sie jedes paar, die Sie entfernen, auf ein "matched pair" - Stapel.Oft ist dies alles, was Sie tun müssen.

Wenn Sie laufen in eine Sackgasse (numFreeTiles == 1), nur setzen Sie Ihre generator :) die ich gefunden habe, die ich normalerweise nicht schlagen tot enden, und so weit haben eine max retry count 3 für den 10-oder-so-layouts, die ich ausprobiert habe.Einmal traf ich 8 Wiederholungen, ich aufgeben und einfach nach dem Zufallsprinzip den rest der Fliesen.Dies ermöglicht mir die Verwendung der gleichen generator für sowohl die Einrichtung der Bord, und die shuffle-Funktion, auch wenn der Spieler nach oben geschraubt und gemacht, 100% unlösbaren Zustand.

Eine andere Lösung, wenn Sie schlagen eine Sackgasse ist zurück aus der (pop-off-die-stack einbauen Fliesen auf dem Brett), bis Sie einen anderen Weg nehmen.Nehmen Sie einen anderen Pfad, indem Sie sicherstellen, dass Paare, die werden entfernen die original Sperrung Fliese.

Leider, je nach board, kann diese Schleife für immer.Wenn Sie am Ende entfernen ein paar, das ähnelt einem "kein Ausgang" Straße, wo alle nachfolgenden "Straßen" sind in einer Sackgasse, und es gibt mehrere Sackgassen, Ihr Algorithmus wird nicht abgeschlossen.Ich weiß nicht, ob es möglich ist, das design einer platine, wo dies der Fall sein würde, aber wenn es so ist, es gibt immer noch eine Lösung.

Zu lösen, dass ein größeres problem, behandeln, jede mögliche board-Staat als Knoten in einer DAG mit jeder ausgewählten pair wird ein Rand auf das Diagramm.Zufällig traversal, bis Sie ein Blatt-Knoten in der Tiefe 72.Behalten Sie Ihre traversal Geschichte, so dass Sie nie wieder eine Abfahrt.

Seit Ende tot sind seltener als Erster versuchen, Lösungen in den layouts die ich verwendet habe, was sofort in den Sinn kommt, ist eine hybrid-Lösung.Zuerst versuchen, es zu lösen, mit minimalem Speicher (speichern Sie ausgewählte Paare auf Ihrem stack).Sobald Sie getroffen haben nach dem ersten dead-end -, abbauen vollständige Kennzeichnung/edge-generation, wenn an jedem Knoten (lazy evaluation sofern möglich).

Ich habe sehr wenig getan Studium der Graphentheorie, obwohl, so vielleicht gibt es eine bessere Lösung für die DAG-random-traversal/search problem :)

Edit:Sie könnten tatsächlich einen meiner Lösungen w/ generiert das board in reverse, ala, Oct 13 2008 post.Sie haben immer noch die gleichen Vorbehalte, denn Sie können noch bis Ende mit Toten enden.Erzeugen eine Bord in umgekehrter hat kompliziertere Regeln, wenn.E. g, Sie sind garantiert zu scheitern Ihr setup, wenn Sie nicht beginnen, zumindest EINIGE Ihrer Zeilen w/ das erste Stück in der Mitte, wie in einem layout w/ 1 lange Reihe.Kommissionierung eine völlig zufällige (juristischen) ersten Schritt in eine vorwärts-Lösung des Generators ist, führen eher zu einem lösbar an Bord.

Das einzige, was ich in der Lage bin, mit zu kommen ist, die Fliesen zu platzieren unten paarweise als Art eines Reverse Mahjong Solitaire-Spiel passen. Also, an jedem Punkt während der Fliese Platzierung sollte das Board aussehen, wie es in der Mitte von einem realen Spiel ist (dh keine Kacheln schwebenden 3 Schichten bis über anderen Fliesen).

Wenn die Fliesen Ort sind paarweise in einem Reverse-Spiel passend, sollte es in mindestens einen Vorwärtspfad führt immer das Spiel zu lösen.

Ich würde gerne andere Ideen hören.

Ich glaube, die beste Antwort ist bereits geschoben bis: eine Reihe schaffen, indem es zu lösen „umgekehrt“ - also beginnend mit einem leeren Brett, dann ein Paar irgendwo hinzufügen, ein anderes Paar in einer lösbaren Position hinzufügen, und so weiter. ..

Wenn Sie einen „Big Bang“ -Ansatz bevorzugen (die ganze zufällig am Anfang gesetzt zu erzeugen), sind eine sehr Macho Entwickler oder einfach nur masochistisch heute fühlen, Sie alle Paare darstellen könnten Sie nehmen aus der gegebenen Menge und wie sie voneinander abhängen über einen gerichteten Graphen.

Von dort würde man nur den transitiven Abschluss dieses Satzes erhalten müssen und bestimmen, ob es mindestens einen Pfad von mindestens einer der ursprünglichen Rechts Paare ist, die (ohne Fliesenpaare links) zum gewünschten Ende führt.

Implementierung dieser Lösung bleibt als Übung für den Leser: D

Hier sind Regeln i in meiner Implementierung verwendet.

Wenn buildingheap, für die jeweils in einem Paar getrennt Bund, finden sie eine Zelle (Plätze), die da sind:

  • hat alle Zellen auf den unteren Ebenen bereits gefüllt
  • Platz für zweiten Bund nicht zuerst sperren, wenn man bedenkt, wenn die erste Bund bereits an Bord setzen
  • beiden Orte sind „an den Rand“ von bereits eingebauten Haufen:
    • ENTWEDER hat mindestens einen Nachbarn auf der linken oder rechten Seite
    • OR ist es ersten Bund in einer Reihe (alle Zellen auf der rechten und linken Seite sind rekursiv frei)

Diese Regeln hat einen Build nicht garantieren, wird immer erfolgreich - es manchmal letzte 2 freie Zellen Selbstblockierung verlassen und bauen sollen (oder zumindest letzte Bünde) erneut versucht werden In der Praxis „Schildkröte“ in nicht mehr als 6 Wiederholungen gebaut.

Die meisten bestanden Spiele scheint zunächst zu beschränken setzen ( „first in Zeile“) in einer Mitte irgendwo Bünde. Diese kommen mit bequemen Konfigurationen, wenn es keine Bünde an den Rand der sehr langer Reihen sind, bis zum letzten Spieler bewegt aufbleiben. Doch „Mitte“ ist für verschiedene Konfigurationen.

Viel Glück:)

P. S. Wenn Sie algo gefunden haben, die auflösbar Haufen in einem Zug bauen -. Bitte lassen Sie mich wissen

Sie haben 144 Kacheln im Spiel, jeder der 144 Fliesen hat eine block-Liste..(top-tile-stack hat einen leeren block list)

Alle gültigen Züge verlangen, dass Ihre "derzeitigen__vertical_Block_list" leer ist..dies kann eine Größe von 144 x 144 matrix so 20k Speicher plus einen LINKEN und einen RECHTEN block Liste, auch 20 k.

Generieren einer gültigen verschieben Sie die Tabelle aus (remaning_tiles) UND ((leeren AKTUELLE VERTIKALE BLOCK-LISTE) - und ((leeren AKTUELLE LINKS-BLOCK-LISTE) ODER (leeren AKTUELLE RECHTS-BLOCK-LISTE)))

Pick 2 random-Fliesen aus der gültigen bewegen, Tabelle, notieren Sie Sie Aktualisieren Sie die (aktuelle Tabellen Vert, Links und rechts), notieren Sie die Fliesen entfernt, um einen Stapel

Jetzt wir haben eine Liste von Dingen, die gelten-Spiel.Zuweisen von passenden Ziegel-Typen, um jede der 72 bewegt.

für anspruchsvolle Spiele, Spur, wenn jede Kachel verfügbar.finden die sets sind (früh früh früh spät) und (spät spät spät früh), da es leer ist, Sie finden 1 EE 1 LL und 2 LE blocks..2 LE block, finden FRÜH, dass Blöcke ALLE andere FRÜHE, die (mit Ausnahme rightblocking einem linken Seitenteil)
Sobald youve bekam ein gültiges Spiel zu spielen, um mit der Bestellung.

Solitaire? Nur eine Vermutung, aber ich würde davon ausgehen, dass der Computer das Spiel (oder nahe daran) schlagen müßte, dies zu bestimmen.

Eine weitere Option könnte sein, mehr vordefinierte Layouts haben (die erlauben zu gewinnen mit Ihrem aktuellen Niveau eingemischt.

Bis zu einem gewissen Grad kann man versuchen, dafür zu sorgen, dass eine der vier Kacheln nicht mehr als X Schichten unter einem anderen X.

Die meisten Spiele, die ich sehe, haben den Shuffle-Befehl für, wenn jemand stecken bleibt.

Ich würde eine Mischung aus Dingen versuchen und sehen, was am besten funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top