Detaillierte Erklärung des digitalen Puzzles CocosCreator Huarongdao

Detaillierte Erklärung des digitalen Puzzles CocosCreator Huarongdao

Vorwort

Was ist die Huarong Road?

Ich glaube, jeder hat diese Art von Zahlenrätselspiel schon einmal gespielt. Es ist ein typisches Beispiel für Huarong Road.

Huarongdao ist ein altes chinesisches Puzzlespiel. Mit seinen vielen Variationen und nie langweiligen Funktionen wird es von ausländischen Geheimdienstexperten zusammen mit dem Zauberwürfel und dem Independent Diamond Chess als „drei Wunder in der Welt der Denkspiele“ bezeichnet.

Heute erfahren wir etwas über die Huarong Road.

Text

Heute werden wir hauptsächlich ein 3*3-Layout verwenden. Ein Anfänger hat mit Cocos Creator eine einfache Demo geschrieben. Lassen Sie uns Schritt für Schritt darüber sprechen.

1. Panel

Zunächst generieren wir zufällig eine Panelanordnung

2. Huarongdao-Lösung

Ideen:

Erschöpfende Methode: Jeder weiß, wie man dieses Spiel spielt. Verschieben Sie die verschiebbaren Quadrate und ordnen Sie die gemischten Quadrate entsprechend den darauf angezeigten Zahlen von klein nach groß an, um das Level zu bestehen. Dabei wendet der Laie die erschöpfende Methode an, um in jeder möglichen Situation die optimale Lösung zu finden.

Bei der erschöpfenden Methode sehen wir oft:

  • Breitensuche: Bei der Breitensuche wird zuerst der erste Schritt in alle Richtungen durchsucht, dann der zweite Schritt in jede mögliche Richtung und so weiter.
  • Tiefensuche: Bei der Tiefensuche wird in eine Richtung weiter gesucht, bis dieser Weg versperrt ist, und dann wird die zweite Richtung in Betracht gezogen.

Hier verwenden wir die Breitensuche und müssen nur die optimale Lösung finden, also die mit der geringsten Anzahl von Schritten.
Die konkrete Vorgehensweise ist in der Abbildung dargestellt:

Nehmen wir die ersten drei Schritte als Beispiel.

  • Uns stehen im ersten Schritt drei Möglichkeiten zur Verfügung.
  • Im zweiten Schritt müssen wir die Blöcke basierend auf dem ersten Schritt erneut verschieben, und jede Verschiebung führt zu weiteren Möglichkeiten.
  • Wir müssen alle Möglichkeiten speichern.
  • Der nächste Schritt basiert auf allen Möglichkeiten des vorherigen Schritts.
  • Im dritten Schritt werden wir feststellen, dass es zu Doppelungen kommt. Daher müssen wir die Ausgaben senken und uns zeitnah um die doppelten Zweige kümmern.
  • Obwohl doppelte Zweige verarbeitet werden, steigt auch die Anzahl der Zweige exponentiell an. Nehmen wir die Anordnung im Beispiel. Mit zunehmender Anzahl der Schritte steigt die Anzahl der Zweige wie in der Abbildung dargestellt

  • Sobald ein Zweig erkennt, dass er gelöscht wurde, wird die Breitensuche beendet.
  • Schließlich erhalten wir für jeden Schritt einen Bewegungsablauf.

Nachdem wir es verstanden haben, können wir es auf die Demo anwenden, um zu testen, ob es das Level bestehen kann.

Klicken Sie auf die automatische Anordnung in der Demo

3. Code

//Durchlaufe die Lösung, während (true) {
    let Schritte: Array<beliebig> = [];
    let lastGrad: Array<beliebig> = this.mMapData[this.mMapData.length - 1];
    console.log(letzterGrad.Länge);
    //Alle Ergebnisse im letzten Gradienten durchlaufen und den nächsten Schritt lösen for (let i = 0; i < lastGrad.length; i++) {
        lass matrix = letzterGrad[i]["matrix"];
        lass Antwort = letzterGrad[i]["Antwort"];
        let-Ergebnis: Array<any> = this.move(Matrix, Antwort, Schritte);
        wenn (Ergebnis) {
            console.log("Ergebnis:", Ergebnis);
            Lösung (Ergebnis);
            zurückkehren;
        }
    }

    wenn(Schritte.Länge<=0){
        console.log("Abfrageergebnis fehlgeschlagen, ");
        auflösen (null);
        zurückkehren;
    }
    this.mMapData.push(Schritte);
}
privater Zug(Matrix: Array<Zahl>, Antwort: Array<beliebig>, Schritte: Array<beliebig>): Array<beliebig> {
    für (lass i = 0; i < Matrix.Länge; i++) {
        if (matrix[i] != -1) { //Kein leerer Bereich. Überprüfe, ob er verschoben werden kann, und erhalte das Ergebnis der Verschiebung. //Überprüfe, ob er nach oben, unten, links und rechts verschoben werden kann.
            let result0: Array<any> = this.moveUp(i, matrix, antwort, schritte);
            let result1: Array<any> = this.moveDown(i, matrix, antwort, schritte);
            let result2: Array<any> = this.moveLeft(i, matrix, antwort, schritte);
            let result3: Array<any> = this.moveRight(i, matrix, answer, steps);

            wenn (Ergebnis1) {
                Ergebnis1 zurückgeben;
            }
            wenn (Ergebnis2) {
                gib Ergebnis2 zurück;
            }
            wenn (Ergebnis0) {
                gib Ergebnis0 zurück;
            }
            wenn (Ergebnis3) {
                Ergebnis3 zurückgeben;
            }
        }
    }
    gibt null zurück;
}
private moveRight(i: Zahl, Matrix: Array<Zahl>, Antwort: Array<beliebig>, Schritte: Array<beliebig>): Array<beliebig> {
    let Zeile: Zahl = i % this.mLine;
    lass Zeile: Zahl = Math.floor(i / this.mLine);
    if (line + 1 >= this.mLine) return null; //Außerhalb der Grenzen let targetIndex: number = row * this.mLine + (line + 1);
    if ( matrix[targetIndex] != -1) return null; //Nicht verschiebbar //Verschieben //Verschieben //Das neue Array zur Änderung kopieren let newMatrix: Array<number> = JSON.parse(JSON.stringify(matrix));
    let newAnswer: Array<beliebig> = JSON.parse(JSON.stringify(answer));
    //Positionen austauschen let temp: number = newMatrix[i];
    neueMatrix[i] = neueMatrix[ZielIndex];
    neueMatrix[ZielIndex] = temp;
    neueAntwort.push({ "index": i, "dic": 3 });

    wenn (this.checkIsExist(newMatrix)) {
        gibt null zurück;
    }

    wenn (dieser.checkPass(neueMatrix)) {
        gib eine neue Antwort zurück;
    }
    lass Schritt: beliebig = {};
    Schritt["Matrix"] = neueMatrix;
    Schritt["Antwort"] = neue Antwort;
    Schritte.drücken(Schritt);
}
/**
 *Überprüfen Sie, ob es gelöscht ist*/
private checkPass(Matrix: Array<Zahl>): boolean {
    wenn (Matrix[diese.mRow * diese.mLine - 1] != -1) false zurückgibt;
    für (lass i = 0; i < diese.mRow * diese.mLine - 1; i++) {
        wenn (Matrix[i] != i + 1) {
            gibt false zurück;
        }
    }
    Konsole.log(Matrix)
    gibt true zurück;
}
/**
 *Überprüfen Sie, ob es wiederholt wird */
private checkIsExist(Matrix): boolean {
    wenn (diese.mMapMatrixS[JSON.stringify(matrix)]) {
        gibt true zurück;
    }
    dies.mMapMatrixS[JSON.stringify(matrix)] = "1";
    gibt false zurück;
}

4. Hinweis

Die Demo zeigt eine 3*3-Anordnung, die mit einem Browser ausgeführt werden kann, aber 4*4 oder 5*5 können nicht ausgeführt werden, da es zu viele Verzweigungen gibt. Später werde ich Python-Skripte verwenden, um 4 * 4, 5 * 5 oder mehr Anordnungen zu implementieren und schließlich Informationen auf JSON-Ebene zu exportieren.

Oben finden Sie eine ausführliche Erklärung zum digitalen Puzzle CocosCreator Huarongdao. Weitere Informationen zu CocosCreator Huarongdao finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • CocosCreator Erste Schritte Tutorial: Netzwerkkommunikation
  • Cocos2d-x 3.x Erste Schritte Tutorial (Teil 2): ​​Node-Klasse
  • Cocos2d-x 3.x Erste Schritte Tutorial (I): Grundkonzepte
  • Cocos2d-x Erste Schritte Tutorial (ausführliche Beispiele und Erklärungen)
  • Detaillierte Erklärung zur Erstellung von Schießspielen mit CocosCreator
  • So zeichnen Sie in CocosCreator ein cooles Radardiagramm
  • Detaillierte Erklärung der CocosCreator MVC-Architektur
  • Detaillierte Erläuterung des CocosCreator-Nachrichtenverteilungsmechanismus
  • So erstellen Sie WeChat-Spiele mit CocosCreator
  • Detaillierte Erklärung, wie CocosCreator-Systemereignisse generiert und ausgelöst werden
  • So verwenden Sie einen Gamecontroller in CocosCreator
  • CocosCreator-Tutorial für den Einstieg: Erstellen Sie Ihr erstes Spiel mit TS

<<:  Detailliertes Installationstutorial für Mysql5.7.19 unter Centos7

>>:  So lösen Sie das Problem des Befehlsfehlers, der durch das Überschreiben des ursprünglichen Pfads und die Meldung „Befehl nicht gefunden“ verursacht wird

Artikel empfehlen

Versuchen Sie Docker+Nginx, um die Single-Page-Anwendungsmethode bereitzustellen

Von der Entwicklung bis zur Bereitstellung: Mache...

Detaillierte Erläuterung der Destrukturierungszuweisung von JS ES6-Variablen

Inhaltsverzeichnis 1. Was ist Dekonstruktion? 2. ...

MySQL 5.7.20 Win64 Installations- und Konfigurationsmethode

mysql-5.7.20-winx64.zipInstallationspaket ohne In...

So implementieren Sie Sveltes Defer Transition in Vue

Ich habe mir vor Kurzem Rich Harris‘ Video „Rethi...

Ubuntu 19.10 aktiviert SSH-Dienst (detaillierter Prozess)

Ich habe mehr als eine Stunde gebraucht, um SSH i...

JS-Code zum Erzielen eines Seitenwechseleffekts

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung und Analyse häufig verwendeter Docker-Befehle und Beispiele

Inhalt 1. Container-Lebenszyklusmanagement (1) Do...

Referenzen und Referenzdetails in Vue3

Der Editor teilt Ihnen auch die entsprechenden Pr...

Vue implementiert Beispielcode zur Formulardatenvalidierung

Fügen Sie dem el-form-Formular Regeln hinzu: Defi...

Lösung für das Verschwinden des MySql-Dienstes aus unbekannten Gründen

Lösung für das Verschwinden des MySql-Dienstes au...