1

私が質問したゲームを再コーディングしています.Haskell.

最初にデータのグリッドを作成するために、以下に示す非常に命令的なスタイルのアルゴリズムを使用しました。それが依存している重要な機能は、配列にインデックスを取り、そこから参照を作成できることです。例「&array[x][y]」。

変更可能な配列にインデックスを取り、そこから Haskell で状態参照を作成できるようにする必要があります。したがって、型シグネチャは次のようになります。

convertToSTRef :: i -> STArray s i a -> ST s (STRef s a)

ドキュメントに目を通し、hoogle と hayoo の両方を試しましたが、これを達成する方法が見つかりませんでした。

PS または、誰かが私が使用できる別のアルゴリズムを持っていれば、それは素晴らしいことです。

PSS シンプルな命令型アルゴリズム。

const size_t rows = 20;
const size_t columns = 59;

block tiles[columns][rows];
block * const start = &tiles[columns/2][rows/2];

for (size_t x = 0; x < columns; ++x)
 for (size_t y = 0; y < rows; ++y)
 {
  tiles[x][y].floor = '^';
  tiles[x][y].inhabitant = WALL;
  tiles[x][y].side_block[EAST] = (x + 1 < columns) ? &tiles[x + 1][y] : NULL;
  tiles[x][y].side_block[SOUTH] = (y + 1 < rows) ? &tiles[x][y + 1] : NULL;
  tiles[x][y].side_block[WEST] = (x > 0) ? &tiles[x - 1][y] : NULL;
  tiles[x][y].side_block[NORTH] = (y > 0) ? &tiles[x][y - 1] : NULL;
 }
4

1 に答える 1

5

カーソル、つまり配列参照とオフセットを含むデータ構造で「ポインター」を表すことができます。

data Cursor t i a = Cursor (t i a) i

makeCursor :: STArray s i a -> i -> Cursor (STArray s) i a
makeCursor = Cursor

readCursor :: Ix i => Cursor (STArray s) i a -> ST s a
readCursor (Cursor arr i) = readArray arr i

writeCursor :: Ix i => a -> Cursor (STArray s) i a -> ST s ()
writeCursor x (Cursor arr i) = writeArray arr i x

GHC では、ガベージ コレクションされたオブジェクトの内部を指すことはできません。ガベージ コレクターは、そのようなポインターを理解できません。配列がガベージ コレクターによって移動された場合、ガベージ コレクターはそのようなポインターを適切に更新できません。ガベージ コレクターに配列の中央へのポインターが与えられた場合、配列の先頭を見つけることができないため、配列全体をスキャンすることはできません。

于 2012-04-18T20:55:33.203 に答える