List Prolog中的列表移位
下面的代码会导致一个无限循环,最终会出现“本地堆栈外”错误。基本上,我正在递减GX的值,直到它与MX相同。 样本输入[[m,g,b],[w,w,w]],路径List Prolog中的列表移位,list,prolog,failure-slice,List,Prolog,Failure Slice,下面的代码会导致一个无限循环,最终会出现“本地堆栈外”错误。基本上,我正在递减GX的值,直到它与MX相同。 样本输入[[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) :- it
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.
wallBlock('w')。
墙砖('b')。
项目('f')。
项目(‘p’)。
项目('m')。
项目(“u”)。
项目(“6”)。
项目('r')。
项目(‘g’)。
任何单元格(单元格):-
墙砖(单元)。
任意单元格(单元格):-
项目(单元格)。
重影路径(贴图、路径):-
附加(地图、新地图),
长度(地图,N),
FindHost(NewMap,N,GX,GY),
findPacman(NewMap,N,MX,MY),
moveGhost(NewMap、N、MX、MY、GX、GY、Path)。
/*查找重影W=行X=列的坐标*/
FindHost(新映射,N,X,Y):-
FindHostSpot(新图,S),
X为楼层(序号)+1,
Y是(S模N)+1。
FindHostSpot(['g'|],0):-
打印('找到幽灵')。
FindHostSpot(['r'|],0):-
打印('找到幽灵')。
FindHostSpot(['6'|],0):-
打印('找到幽灵')。
FindHostSpot([| Tail],S):-
FindHostSpot(尾部,S1),
S是S1+1。
/*查找重影W=行X=列的坐标*/
findPacman(新地图,N,X,Y):-
findPacmanSpot(新图,S),
X为楼层(序号)+1,
Y是(S模N)+1。
findPacmanSpot(['m'|],0):-
打印('找到吃豆人')。
findPacmanSpot([| Tail],S):-
findPacmanSpot(尾部,S1),
S是S1+1。
/*基本情况下,幽灵在吃豆人身上*/
moveGhost(u,u,X,Y,X,Y,[])。
/*如果PACMAN和鬼魂在同一列*/
moveGhost(NewMap,N,MX,Y,GX,Y,[u'| Rest]):-
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,MX,Y,X,Y,Rest),
GX是X+1,
MXGX,
CN是((X*N)+Y)。
/*如果吃豆人和鬼在同一排*/
moveGhost(NewMap,N,X,MY,X,GY,[l'| Rest]):-
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,X,MY,X,Y,Rest),
GY是Y+1,
我的朋友们,
CN是((X*N)+Y)。
moveGhost(NewMap,N,X,MY,X,GY,[r'| Rest]):-
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,X,MY,X,Y,Rest),
GY是Y-1,
我的天啊,
CN是((X*N)+Y)。
itemNext([Cell |],0,Cell):-
项目(单元格)。
itemNext([第一个|剩余],CN,单元格):-
任何单元格(第一个),
itemNext(剩余、N、单元格),
CN是N+1。
因为它是一个2d数组,所以append会将其转换为1d,NextCell中的算法会获取一行的长度,并找到相邻单元格的坐标,然后返回该单元格的值。如果单元为“w”或“b”,则重影无法向该方向移动。你可以假设地图是正方形的 (我假设您的问题是为什么程序会循环。)
为了确定您的计划未终止的原因,我在您的计划中插入了目标false
。由于剩余程序(故障片)不会终止,因此您的原始程序也不会终止。您需要修复剩余可见部分中的某些内容。或者,换一种说法:只要当前片段保持不变,问题就会继续存在!作为一个小评论,最好避免像你这样的纯程序中的print/1
目标
有关更多信息,请参见标记
-重影路径([[m,g,b],[w,w,w]],路径),错误。
项目('f'):-false。
项目('p'):-false。
项目('m')。
项目('u'):-false。
项目('6'):-false。
项目('r'):-false。
项目(‘g’)。
anyCell(Cell):-false,
墙砖(单元)。
任意单元格(单元格):-
项目(单元格)。
重影路径(贴图、路径):-
附加(地图、新地图),
长度(地图,N),
FindHost(NewMap,N,GX,GY),
findPacman(NewMap,N,MX,MY),
moveGhost(NewMap,N,MX,MY,GX,GY,Path),false。
/*查找重影W=行X=列的坐标*/
FindHost(新映射,N,X,Y):-
FindHostSpot(新图,S),
X为楼层(序号)+1,
Y是(S模N)+1。
FindHostSpot(['g'|],0):-
打印('找到幽灵')。
FindHostSpot(['r'|],0):-false,
打印('找到幽灵')。
FindHostSpot(['6'|],0):-false,
打印('找到幽灵')。
FindHostSpot([| Tail],S):-
FindHostSpot(尾部,S1),
S是S1+1。
/*查找重影W=行X=列的坐标*/
findPacman(新地图,N,X,Y):-
findPacmanSpot(新图,S),
X为楼层(序号)+1,
Y是(S模N)+1。
findPacmanSpot(['m'|],0):-
打印('找到吃豆人')。
findPacmanSpot([[u124; Tail],S):-false,
findPacmanSpot(尾部,S1),
S是S1+1。
/*基本情况下,幽灵在吃豆人身上*/
moveGhost(u,u,X,Y,X,Y,[]):-false。
/*如果PACMAN和鬼魂在同一列*/
moveGhost(NewMap,N,MX,Y,GX,Y,[u'| Rest]):-false,
itemNext(新地图、CN、Z),
项目(Z),
moveGhost(NewMap,N,MX,Y,X,Y,Rest),
GX是X+1,
MX如果GX是一个自由变量,您会收到“2:参数没有充分实例化。”因此GX是X+1,必须在MX