0

現在、私は次の問題について考えており、誰かが私を助けることができるかもしれません:

Minecraft では、多くのブロックを変更したいのですが、遅延を防ぐために、同時にいくつかのブロックだけを変更したいと考えています。直方体を変更するには、通常、次のようなループを使用します。

for(int x=t.x; x<t.X; x++) 
  for(int y=t.y; y<t.Y; y++) 
    for(int z=t.z; z<t.Z; z++) {
      // ..
    }

ここで、t は from と to の座標を保存します。

ここで、現在の進行状況を保存して、後で続行したいと考えています。

それについて考えるのにうんざりしている私を助けてください..

4

1 に答える 1

1

コードはCのように見えます。Cでは、プロセスは、呼び出し元の関数を離れた後、特定のスタック状態に戻ることはできません。したがって、ループを離れて後でループに戻ることは、言語レベルでは不可能です。他の言語では、物事は異なります。たとえば、Python言語のPypy実装では、コンティニューレットを使用して、記述した内容を実現できます。

ただし、独自のオブジェクトを使用して最後のカウンターを格納することにより、同様の方法を実現できます。

struct counters { int x, y, z; };

bool continueLoops(struct counters *ctrs) {
  for (; ctrs->x < t.X; ctrs->x++) {
    for (; ctrs->y < t.Y; ctrs->y++) {
      for (; ctrs->z < t.Z; ctrs->z++) {
        // ..
        if (weWantToInterruptTheLoop)
          return true;
      }
      ctrs->z = t.z;
    }
    ctrs->y = t.y;
  }
  return false;
}

void startLoops() {
  struct counters ctrs;
  ctrs.x = t.x;
  ctrs.y = t.y;
  ctrs.z = t.z;
  while (continueLoops(&ctrs)) {
    // do whatever you want to do between loops
  }
}

ただし、内側のループ内で直接関連する操作を実行するのとは対照的に、上記のアプローチにはあまりメリットがありません。ですから、これがあなたにとって役立つかどうかはわかりません。

于 2012-11-15T19:11:58.950 に答える