次のコードは、最終的に「Out of Local Stack」エラーを伴う無限ループを引き起こします。基本的に、MX と同じになるまで GX の値を減らします。サンプル入力 [[m,g,b],[w,w,w]],パス
wallBlock('w').
wallBlock('b').
item('f').
item('p').
item('m').
item('u').
item('6').
item('r').
item('g').
anyCell(Cell) :-
wallBlock(Cell).
anyCell(Cell) :-
item(Cell).
ghostPathing(Maps, Path) :-
append(Maps, NewMap),
length(Maps, N),
findGhost(NewMap, N, GX, GY),
findPacman(NewMap, N, MX, MY),
moveGhost(NewMap, N, MX, MY, GX, GY, Path).
/*FINDS THE COORDINATES OF THE GHOST W=row X=column*/
findGhost(NewMap, N, X, Y) :-
findGhostSpot(NewMap, S),
X is floor(S / N) + 1,
Y is (S mod N) +1 .
findGhostSpot(['g'|_], 0) :-
print('Found Ghost. ').
findGhostSpot(['r'|_], 0) :-
print('Found Ghost. ').
findGhostSpot(['6'|_], 0) :-
print('Found Ghost. ').
findGhostSpot([_|Tail], S) :-
findGhostSpot(Tail, S1),
S is S1+1 .
/*FINDS THE COORDINATES OF THE GHOST W=row X=column*/
findPacman(NewMap, N, X, Y) :-
findPacmanSpot(NewMap, S),
X is floor(S / N) + 1,
Y is (S mod N) + 1.
findPacmanSpot(['m'|_], 0) :-
print('Found Pacman. ').
findPacmanSpot([_|Tail], S) :-
findPacmanSpot(Tail, S1),
S is S1+1 .
/* Base Case, Ghost is on the Pacman*/
moveGhost(_, _, X, Y, X, Y, []).
/*IF PACMAN AND THE GHOST ARE IN THE SAME COLUMN*/
moveGhost(NewMap, N, MX, Y, GX, Y, ['u'|Rest]) :-
itemNext(NewMap, CN, Z),
item(Z),
moveGhost(NewMap, N, MX, Y, X, Y, Rest),
GX is X + 1,
MX < GX,
CN is ((X * N) + Y).
moveGhost(NewMap, N, MX, Y, GX, Y, ['d'|Rest]) :-
itemNext(NewMap, CN, Z),
item(Z),
moveGhost(NewMap, N, MX, Y, X, Y, Rest),
GX is X - 1,
MX > GX,
CN is ((X * N) + Y).
/*IF PACMAN AND THE GHOST ARE IN THE SAME ROW*/
moveGhost(NewMap, N, X, MY, X, GY, ['l'|Rest]) :-
itemNext(NewMap, CN, Z),
item(Z),
moveGhost(NewMap, N, X, MY, X, Y, Rest),
GY is Y + 1,
MY < GY,
CN is ((X * N) + Y).
moveGhost(NewMap, N, X, MY, X, GY, ['r'|Rest]) :-
itemNext(NewMap, CN, Z),
item(Z),
moveGhost(NewMap, N, X, MY, X, Y, Rest),
GY is Y - 1,
MY > GY,
CN is ((X * N) + Y).
itemNext([Cell|_], 0, Cell) :-
item(Cell).
itemNext([First|Rest], CN, Cell) :-
anyCell(First),
itemNext(Rest, N, Cell),
CN is N + 1.
これは 2 次元配列であるため、追加により 1 次元に変換され、NextCell の算術演算は行の長さを取り、隣接するセルの座標を見つけて、そのセルの値を返します。セルが「w」または「b」の場合、ゴーストはその方向に移動できません。マップは正方形であると想定できます。