Implementierung eines Wortspielbretts?


12

Ich arbeite an einem boggle-artigen Spiel für Android mit libgdx. Dem Benutzer wird ein 4x4-Buchstabengitter angezeigt, und er muss Wörter finden, indem er seinen Finger über die Buchstaben zieht.

Im Gegensatz zu Boggle möchte ich, dass gebrauchte Buchstaben verschwinden. Die verbleibenden Buchstaben fallen nach unten (auf die Unterseite der Tafel, die Bildschirmausrichtung ist festgelegt) und die Tafel wird von oben nachgefüllt. Benutzer können das Board drehen, um zu versuchen, schwer zu verwendende Buchstaben durch strategische Wortauswahl an einer besseren Stelle zu platzieren.

Ein Beispiel:

d g a o
u o r T
h v R I
d G n a

Wenn ich das Wort GRIT auswähle, verschwinden diese Buchstaben und die restlichen fallen herunter:

d
u g a
h o r o
d v n a

und dann durch neue Buchstaben ersetzt werden

d w x y
u g a z
h o r o
d v n a

Ich weiß nicht, wie ich das Brett und die Kacheln darstellen soll.

Ich habe versucht, das Brett als Matrix darzustellen, um die ausgewählten Kacheln und gültigen Züge sowie die in einer Matrix gespeicherten Kacheln im Auge zu behalten, damit eine einfache Zuordnung möglich ist. Das funktioniert, aber ich musste etwas Code schreiben, um das Board zu drehen.

Wie gehen andere Spiele mit diesem Problem um?

EDIT: Wenn ich darüber nachdenke, sollte ich meinen Berührungspunkt wirklich nur entsprechend der Boardrotation verarbeiten, damit die Zellen konstant bleiben. Anbei ein Bild von dem, was ich denke.Berühren Sie den Prozessbildschirm, damit sich die Ausrichtung der Karte nie ändert


1
Sie meinen, dass die Richtung, in die die Buchstaben fallen, von der Ausrichtung des Geräts abhängt? Könnten Sie auch erarbeiten , dass Sie durch meine ich „vermasselt , wenn ich die Fliesen drehen wollen“ .
Petr Abdulin

Ich meinte, dass meine Zuordnung von der Position des Spielbretts zur Position der Kacheln sehr kompliziert war, als ich eine Rotation durchführte. Ich denke jedoch, ich kann dieses Problem lösen, wenn ich mir das Board so
vorstelle,

Danke für das Update. In der Regel ist es besser, die Frage selbst zu aktualisieren, damit andere Benutzer nicht in Kommentaren nach wertvollen Informationen suchen müssen. Es ist mir immer noch nicht klar, wie die Rotation durchgeführt wird (jetzt), was das Ergebnis ist und wie es das Tracking tatsächlich erschwert. Es ist nicht klar, ob das Vollbrett gedreht wird oder nur einzelne Kacheln. Normalerweise hilft das Hinzufügen von Codefragmenten beim Verständnis des Problems.
Petr Abdulin

Ich glaube, ich habe das Problem völlig falsch gelöst. Wenn ich den Berührungspunkt des Benutzers entsprechend der Rotation verarbeite, kann ich mir das Board als statisches Objekt vorstellen.
Andy Mcevoy

Bitte geben Sie dies in eine Antwort ein und akzeptieren Sie Ihre Antwort, wenn Sie die Lösung für Ihr Problem gefunden haben. Andernfalls können Sie dies offen halten, wenn Sie sich immer noch nicht zu 100% sicher sind. Der Begriff, der Ihre vorgeschlagene Lösung beschreibt, lautet "Raumübersetzung", dh Sie übersetzen Ihren Berührungspunkt zwischen dem Bildschirmbereich und dem (gedrehten) Leiterplattenbereich.
Ingenieur

Antworten:


1

Ich würde dafür überhaupt keine Arrays verwenden, da die Verwaltung immer komplexer wird. Erstellen Sie eine benutzerdefinierte Board-Datenstruktur mit Knoten, die Verweise auf ihre Nachbarn enthalten. Dies ist im Wesentlichen eine mehrdimensionale LinkedList von Knoten. Wenn der Buchstabe eines Knotens entfernt wird, können andere Knoten dies auf diese Weise gekapselt anzeigen. Dies vermeidet komplizierte Array-Arithmetik. Sie benötigen eine große Funktion, um alles richtig zu verbinden, aber sobald die Logik verknüpft ist, sollte es viel einfacher sein, mit ihr zu arbeiten.

Für Ihre Randknoten sind die Nachbarn auf festgelegt. nullVergewissern Sie sich daher, dass Sie diese in Ihren Methoden in der Knotenklasse, die auf Nachbarn verweisen müssen, entsprechend behandeln.

Ich habe diesen Ansatz für die Implementierung von Conways Game Of Life verwendet Sobald Sie es eingerichtet haben, wird die Komplexität des Hinzufügens von Logik, die den Status eines Knotens basierend auf den Nachbarn ändert, drastisch verringert.

Abhängig davon, wie Sie die Knoten in der Karte manipulieren, benötigen Sie möglicherweise eine Kartenmethode, um den nächsten Status oder die nächste Aktion zu durchlaufen und zu bestimmen und diese in jedem Knoten zu speichern. Folgen Sie dem, indem Sie jeden Knoten iterieren und in den neuen Zustand versetzen. Auf diese Weise wird vermieden, dass Knoten ihren nächsten Status bestimmen, indem sie Knoten betrachten, die sich bereits geändert haben.

Bildbeschreibung hier eingeben


-2

Ja, die Lösung besteht darin, dass Sie einen Wert aus Ihrer Matrix oder einem Array erhalten und diesen Wert für ein temporäres Array oder eine temporäre Matrix festlegen. Anschließend wird der Wert von dort festgelegt. Ich fügte unten Code hinzu, ich denke, es hilft Ihnen

    int MAX_GRID = 4;
    int[][] main_array = new int[MAX_GRID][MAX_GRID];
    int[][] temp_array = new int[MAX_GRID][MAX_GRID];

    /** This method for clockwise **/
    int mainRow = MAX_GRID - 1;
    for (int c = 0; c < MAX_GRID; c++) {
        for (int r = 0; r < MAX_GRID; r++) {
            temp_array [mainRow][c] = main_array [r][c];
            Log.i("TAG", "R C : [ " + mainRow + " " + c + " ]" + " => [ "
                    + r + " " + c + " ]");
            mainRow--;
        }
    }
    main_array = temp_array;

    /** This method for anti-clockwise **/
    int mainCol = 0;
    for (int c = MAX_GRID - 1; c >= 0; c--) {
        for (int r = MAX_GRID - 1; r >= 0; r--) {
            temp_array [r][mainCol] = main_array [c][r];
            Log.i("TAG", "R C : [ " + r + " " + mainCol + " ]" + " => [ "
                    + c + " " + r + " ]");
        }
        mainCol++;
    }
    main_array = temp_array;

    // Now you can set main_array value then its rotate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.