0

私はある種のボードゲームを構築しており、現在プレイヤーの動きを扱っています。プレイヤーがゲーム ボード内でのみ移動できるように制限したい。ボードはネストされた配列に格納されます。これは Actionscript 3 では 2D 配列に相当します - array[x][y] のように。私は長さを知っており、見つけようとしているターゲットを知っています。プレイヤーが実際にそのスロットに移動できるかどうかを確認するために、そのターゲットが配列内に存在するかどうかを識別し、true または false を返すだけです。誰でも提案できますか?これは非常に簡単な質問ではないようです。

4

2 に答える 2

0

長すぎるため、コメントにはしませんでしたが、これは網羅的な回答ではありませんが、明確にする必要があることがいくつかあります。

  1. 2D 配列をエミュレートするための最良の選択である場合とそうでない場合があります。他のいくつかの選択肢には次のものがあります: モジュロ幅の項目にアクセスする単一の 1 次元配列。これには、ルックアップが高速になるという利点があり、配列で機能する多くの組み込み関数がそのまま使用できるという利点があります。欠点は、行挿入操作です。配列の配列に行を挿入するのは簡単ですが、独自に記述する必要があります。別の選択肢 - Cantor のマッピング関数を使用する (例: 2 つの整数を 1 つに一意かつ決定論的な方法でマッピングする))、整数ハッシュテーブルを持つそのような関数が複数あります。これには、実際の値と同じくらい多くのスペースを使用できるという利点があります (マップ上の要素がほとんどない場合は、必要なメモリが少なくなります)。このような配列内のアイテムの検索は、通常の配列内よりもはるかに高速です (存在すらしていない「空の」アイテムを調べないためです。ただし、多くの機能をすべて自分で作成する必要があります。

  2. パスの検索は、 「パス検索アルゴリズム」として累積的に知られている多くのアルゴリズムの主題です。選択する最適な方法は、状況によって大きく異なります。いずれかを選択する (または独自のものを発明する) 前に、次のような質問に答えることが重要です。

    • すべての移動に同じコストがかかりますか?
    • 戻ること、または同じ場所を再訪することは許可されていますか?
    • 最善の方法、または任意の方法を確実に見つけられるソリューションをお探しですか?
    • 動きが単純でない場合、中間ソリューションのコストを見積もるヒューリスティック関数を見つけることは可能ですか?
    • 最後に、何のために最適化していますか? スピード?想い出?

ただし、ポイントが長方形の境界内にあるかどうかを知りたいだけRectangleの場合は、マップのサイズを取得してhttp://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashを使用します/geom/Rectangle.html#containsPoint%28%29 - これにより、Artiace の回答にあるようなスイッチを書く必要がなくなります。

于 2013-03-28T19:26:36.930 に答える
0

配列が次のようになっていると仮定します。

var board:Array = [
    [a,0,0],
    [0,b,0],
    [0,0,c]
]

次に、ボードの中央に存在するかどうかを確認するには、次のようにします。

if (board[1][1] != 0) {
    trace(board[1][1]) // outputs "b"
}

したがって、任意の方向に 1 ブロックずつ移動したい場合bは、一般的に次のことを試してください...

function move(row:int, col:int, direction:string):void {
    switch (direction) {
        case "up":
            if (row - 1 >= 0 && row - 1 < board.length) {
                board[row-1][col] = board[row][col];
                board[row][col] = 0;
            }
            break;
        case "down":
            if (row + 1 >= 0 && row + 1 < board.length) {
                board[row+1][col] = board[row][col];
                board[row][col] = 0;
            }
            break;
        case "left":
            if (col - 1 >= 0 && col - 1 < board[row].length) {
                board[row][col - 1] = board[row][col];
                board[row][col] = 0;
            }
            break;
        case "right":
            if (col + 1 >= 0 && col + 1 < board[row].length) {
                board[row][col + 1] = board[row][col];
                board[row][col] = 0;
            }
            break;
    }
}
于 2013-03-28T18:22:56.340 に答える