2

Snake が存在する独自の Snake ゲームを作成し、ArrayList of Pointsこのメソッドを使用して自食をチェックします。

public void checkSelfEating() {
    for (int i = 1; i < body.size(); i++) {
        if (body.get(i).equals(body.get(0))) {
            sgv.setGameOverState(true);
            sgv.setMessage("Game over!");
            System.out.println("SelfEatingdetected");

        }
    }
}

ビデオ (35 秒から開始)

VisualVMの結果

しかし、それは遅すぎて、ヘビはゲームオーバーになるまでに約 5 つの動きをします。より良い解決策はありますか?

4

1 に答える 1

3

ボディ ユニットをHashSetビアaddremove呼び出しに格納します。 O(1). さらに、 a を使用するLinkedHashSetと、頭と尾を管理するのが非常に簡単になります (コメントごと)。

これはすべて言われていることですが、これは正しいデータ構造であり、あなたの質問に答えていますが、数十個の要素に対して for ループを実行する必要があるため、プログラムが非常に遅くなる理由がまったくわかりません。プロファイリングして実際のボトルネックを見つけることを強くお勧めします。ハッシュ セットがこの規模で高速になるかどうかさえわからないからです。

于 2012-12-05T20:40:44.287 に答える