私が考えることができる最も簡単なアプローチ:
for each tile
based on the surrounding already generated tiles,
generate a random type among those which won't result in 3-in-a-row
そして、これを行うための最適化されていない方法は、水平方向と垂直方向の一致のみを想定しています (対角線ではありません): (疑似コード)
for x = 1 to M
for y = 1 to M
do
board[x][y] = randomType()
while ((x >= 3 && board[x-1][y] == board[x-2][y] && board[x-1][y] == board[x][y]) ||
(y >= 3 && board[x][y-1] == board[x][y-2] && board[x][y-1] == board[x][y]))
繰り返し生成を完全に回避する方法: (型が数値であると仮定)
for x = 1 to M
for y = 1 to M
limit = N
horizontal = (x >= 3 && board[x-1][y] == board[x-2][y] && board[x-1][y] == board[x][y])
vertical = (y >= 3 && board[x][y-1] == board[x][y-2] && board[x][y-1] == board[x][y])
if horizontal
limit--
if vertical
limit--
board[x][y] = randomType(limit)
offset = 0
if (vertical && board[x][y] >= board[x][y-1])
offset++
if (horizontal && board[x][y] >= board[x-1][y])
offset++
board[x][y] += offset
上記の方法は、範囲 [0,A-1] および [A+1,B] の数値を生成するのと同様に機能し、範囲 [0,B-1] の数値を生成し、生成された数値が A 以上の場合、それを 1 増やします。
N
少なくとも 3 である必要があります。そうでない場合は、次のようになります。
..A
..A
BB?
上記のアルゴリズムは無限ループに陥ります。