私はゲームの意思決定 AI を書いていて、次のコードを思いつきました。
if(pushedLeft && leftFree && leftExists)
GoLeft();
else if(pushedRight && rightFree && rightExists)
GoRight();
else if(leftFree && leftExists)
GoLeft();
else if(rightFree && rightExists)
GoRight();
else if(pushedLeft && leftExists)
GoLeft();
else if(pushedRight && rightExists)
GoRight();
else if(leftExists)
GoLeft();
else if(rightExists)
GoRight();
// else do nothing...
if
これは、同様の条件付きのステートメントのかなり長いストリームです!
この素敵なパターンになることに注意してください。
L1 L2 L3 -> L
R1 R2 R3 -> R
L2 L3 -> L
R2 R3 -> R
L1 L3 -> L
R1 R3 -> R
L3 -> L
R3 -> R
(nothing) -> 0
このコードの目的は、入ってくる状態情報に基づいて、オブジェクトが左または右に移動するか (またはまったく移動しないか) を決定することです。各情報には、異なる優先順位があります。次のように順序付けられたリストに記述できます。
Highest Priority
----------------
Don't ever move into an invalid space
Prefer to move into an unoccupied space
Prefer to move in the push direction
Prefer to move left
----------------
Lowest Priority
この決定を行うための情報入力を追加すると、条件の数が 2 倍になることは明らかです。また、これらの入力の可能な値の数を 2 倍にする (例: 上/下/左/右を許可する) と、条件の数も 2 倍になります。(つまり、これは n×m 2の条件ですよね?)
だから私の質問は:
これをコーディングするための、満足のいく、エレガントな方法はありますか?
私はそれを行うための素敵な「n×m」の方法があるに違いないと考えています(編集:最初はここに「n + m」がありましたが、n×mの入力条件があるため、それは不可能に思えます)。ここの私のコードと一般的な問題の両方に当てはまるものはありますか?
上記の条件付きバージョンと同じかそれ以上のパフォーマンスを発揮するものが望ましいです。理想的には、ヒープ割り当てを回避するもの - ゲーム開発シナリオで使用するために重要です (ただし、これらは必要に応じてキャッシュなどでいつでも最適化できます)。
また、この問題に対して「Google で使用できる用語」はありますか? これは珍しい問題ではないと思いますが、名前がわかりません。
更新: Superpig の回答のおかげで、さまざまなオプションのスコアを計算するというアイデアがあります。このようなもの:
int nothingScore = 1 << 4;
int leftScore = (1 << 1) + (pushedLeft ? 1 << 2 : 0) + (leftFree ? 1 << 3 : 0) + (leftExists ? 1 << 5 : 0);
int rightScore = (pushedRight ? 1 << 2 : 0) + (rightFree ? 1 << 3 : 0) + (rightExists ? 1 << 5 : 0);
確かに、スコアリング コードを記述するより適切な方法があります (スコアリングする別の方法もあります)。そして、スコアが計算されたら何をするかを選択するという問題がまだあります。そしてもちろん、採点をまったく含まない、より良い方法があるかもしれません。
更新 2:ここに自分の回答を投稿して受け入れました(Superpig は完全なソリューションではなく、これまでのところ他の回答はリモートで正しい軌道に乗っていないため)。さまざまな出力をスコアリングするのではなく、ビットフィールドを使用してオプションを除外するアプローチを選択しました。これにより、メモリに単一の整数のみを使用して決定を下すことができます。