0

線上のすべての点を保持する配列を使用して、ヘビ ゲームのように線を動かすアルゴリズムを設計するのに問題があります。私は次のようなことをします...

for (int x = 0; i < array.length; i++) { 
     array[i] = array[i+1]
}
array[array.length] = (the new point)

しかし、これは 1 秒間に何度も発生し、非常に低速です。私は似たようなことを考えましたが、毎回各番号を移動する代わりに、配列内の同じ位置にとどまりますが、次に削除される番号と新しい番号を含む番号を追跡するために int が保存されます。私が今言ったことを理解できるなら、助けてください。ありがとう

4

4 に答える 4

5

循環バッファを使用します。これは、配列と 2 つのインデックス (ヘッド用に 1 つ、テール用に 1 つ) を使用して実装できます。ヘビの長さが常に同じである場合は、単一のインデックスを使用して問題を解決できます。

このような構造を使用すると、必要な操作全体を一定時間で実行できます (つまり、配列のサイズに関係なく)。

于 2013-09-23T18:53:52.697 に答える
1

毎回すべてのブロックを移動するのは遅いと考えるのは正しいです。

より効率的な方法があります。

各移動で変化するのは、最初と最後の位置だけです。

したがって、ヘビarray[i]と「頭」マーカーがある場合は、配列をhead単純に行進し、そのターンで頭が移動した場所で次の場所を上書きできます。head

上書きした場所?それは尻尾があった場所で、もう必要ありません。

ヘビが成長すると少し難しくなりますが、それほど大きくはありません。

(NPE が指摘するように、データ構造は循環バッファーです。)

于 2013-09-23T18:59:50.713 に答える
0

循環バッファーが最適なソリューションであるという NPE の意見は正しいです。これは、C++ を使用した循環バッファーの簡単な例です。ifテストの代わりにモジュラス演算子に注意してください。

#include <iostream>

int main(int argc, char **argv)
{
    int front = 4;
    int back = 0;
    int length = 10;
    int snake[10] = { 1,1,1,1,1,0,0,0,0,0 };

    for (int i = 0; i < length * 3; i++)
    {
        for (int j = 0; j < length; j++)
            std::cout << snake[j] << " ";
        std::cout << std::endl;

        snake[back] = 0;
        front = (front + 1) % length;
        back = (back + 1) % length;
        snake[front] = 1;
    }
}

出力:

1 1 1 1 1 0 0 0 0 0
0 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 0 0 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 1 1 1
1 1 1 0 0 0 0 0 1 1
1 1 1 1 0 0 0 0 0 1
1 1 1 1 1 0 0 0 0 0
0 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 0 0 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 1 1 1
1 1 1 0 0 0 0 0 1 1
1 1 1 1 0 0 0 0 0 1
1 1 1 1 1 0 0 0 0 0
0 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 0 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 1 1 1 1 1 0
0 0 0 0 0 1 1 1 1 1
1 0 0 0 0 0 1 1 1 1
1 1 0 0 0 0 0 1 1 1
1 1 1 0 0 0 0 0 1 1
1 1 1 1 0 0 0 0 0 1

ヘビがバッファ内を「移動」している様子が出力に示されていることに注目してください。

于 2013-09-23T19:29:07.057 に答える
0
int front, back, length; // 0<=front,back<length

increaseLength()
{
   back--;
   if(back<0)
      back=length-1;
}

goForward()
{
   front++;
   back++;
   if (front==length)
      front=0;

   if (back==length)
      back=0;
}

checkFull() // check every time you increase length
{
   if (back==front)
      return true;
   return false;
}
于 2013-09-23T19:04:13.550 に答える