単語ゲーム-ボード実装?


12

私はlibgdxを使用して、アンドロイド用のボグル型ゲームに取り組んでいます。ユーザーには4x4の文字のグリッドが表示され、文字の上で指をドラッグして単語を見つける必要があります。

boggleとは異なり、使用済みの文字を非表示にします。残りの文字は落ち(ボードの下部まで、画面の向きは固定されます)、ボードは上部から補充されます。ユーザーは、戦略的な単語選択により、ボードを回転させて、使いやすい文字をより良い場所に配置することができます。

例:

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

「GRIT」という単語を選択した場合、これらの文字は消え、残りの文字は落ちます。

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

そして、新しい文字に置き換えられます

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

ボードとタイルをどのように表現するかを考えるのが難しいです。

簡単にマッピングできるように、選択したタイルと有効な動きを追跡するためのマトリックスとしてボードを表してみて、タイルもマトリックスに保存しました。これは機能しますが、ボードを回転させるために複雑なコードを作成する必要がありました。

他のゲームはこの問題をどのように処理しますか?

編集:だからそれについて考えて、私は本当にセルが一定に保たれるように、ボードの回転に応じてタッチポイントを処理するだけです 私が考えていることのイメージを添付しました。ボードの向きが変わらないように画面のタッチを処理する


1
つまり、どの文字に向かっているのかは、デバイスの向きに依存するということですか?また、あなたがによって意味ですかその手の込んだでした「私はタイルを回転させたいときめちゃくちゃ」
ペトルアブドゥリン14

つまり、ボードの位置からタイルの位置へのマッピングは、一度回転すると非常に複雑になります。しかし、私は...私が代わりに場所を変更するすべてのタイルの座標系の原点を中心に回転するようボードを考えるならば、私はこの問題を解決することができると思う
アンディー・マクエボイ

更新していただきありがとうございます。通常は質問自体を更新する方がよいため、他の人は貴重な情報についてコメントを掘り下げる必要はありません。回転がどのように実行されるのか(今)、結果は何なのか、トラッキングが実際にどのように困難になるのかはまだわかりません。ボード全体を回転させるのか、個別のタイルのみにするのかは明確ではありません。通常、コードの断片を追加することは、問題を理解するのに非常に役立ちます。
ペトルアブドゥリン14

私は問題についてまったく間違っていたと思う、回転に応じてユーザーのタッチポイントを処理すると、ボードを静的オブジェクトと考えることができます。
アンディmcevoy 14

これを回答に入れて、問題の解決策が見つかった場合は回答を受け入れてください。それ以外の場合は、100%確信が持てない場合はこれを開いたままにしておくことができます。提案されたソリューションを説明する用語は「スペース変換」です。つまり、画面スペースと(回転した)ボードスペースの間でタッチポイントを変換します。
エンジニア

回答:


1

配列の管理はますます複雑になるため、これには配列を使用しません。隣接ノードへの参照を持つノードを持つカスタムボードデータ構造を作成します。これは、本質的にノードの多次元LinkedListです。そのようにして、ノードの文字が削除されると、他のノードはこれをカプセル化された方法で表示できます。これにより、複雑な配列演算が回避されます。すべてを正しく接続するために1つの大きな関数が必要になりますが、一度リンクすると、ロジックの操作がはるかに簡単になります。

エッジノードのネイバーはに設定されるためnull、ネイバーを参照する必要があるNodeクラスのメソッドで、それに応じて適切に処理するようにしてください。

ConwayのGame Of Lifeを実装するためにこのアプローチを使用しました。一度設定すると、近隣に基づいてノードの状態を変更するロジックを追加する複雑さが大幅に減少します。

ボード内のノードの操作方法に応じて、次の状態またはアクションを反復して決定し、各ノード内に保存するために、1つのボードメソッドが必要になる場合があります。次に、各ノードを繰り返して新しい状態にコミットすることにより、それに従います。これにより、既に変更されているノードを調べることで、ノードが次の状態を決定することを回避できます。

ここに画像の説明を入力してください


-2

はい、解決策は、マトリックスまたは配列から値を取得し、その値を一時配列または一時行列に設定し、そこから値を設定することで、回転値グリッドが表示されます。私はあなたに役立つと思う以下のコードを追加しました

    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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.