我试图在prolog中显示一个网格,而不是获取它的listing
。
这是我到目前为止所拥有的
sB:-
showBoard.
showBoard(Row) :-
setof([Row,Col,Object,Visible],square(Row,Col,Object,Visible),RList),
showRow(RList),
writeln(''),
NextRow is Row - 1,
showBoard(NextRow).
这是一个新的东西,我试图测试,看看我是否可以得到这个。我是在正确的轨道上吗?
修改
对于任务,我们必须通过代码
生成网格这是我想要的......
我正在使用square/3
,回到正方形(x,y,对象)。但我希望将它提升到square/4
,这样我就可以看到网格的可见性,这意味着机器人只能看到他周围,一个方向左,右,上,下,直到找到他的眼镜。
== == == == == == == == == ==
|| x x x x x x x x ||
|| x x x x x x x x ||
|| x x x x x x x x ||
|| x x x x x x x x ||
|| x x x x x x x x ||
|| x x x x x x x x ||
|| x x x x x x x x ||
== == == == == == == == == ==
答案 0 :(得分:1)
最简单的是"扫描"你的棋盘从左到右,从上到下(这就是我们输出到控制台的方式),看看是否有任何东西要显示给这个特定的方块。假设您正在使用format
进行写入(更容易控制输出的格式),并假设事先知道了电路板的大小,并且您的x和y坐标从左上角开始,需要:
或者,在代码中:
show_board(Rows, Cols) :-
show_rows(1, Rows, Cols).
show_rows(R, Rows, Cols) :-
( R =< Rows
-> show_row(R, 1, Cols),
R1 is R + 1,
show_rows(R1, Rows, Cols)
; true
).
show_row(R, C, Cols) :-
( C =< Cols
-> show_square(R, C) % or maybe show_square(C, R)?
C1 is C + 1,
show_row(R, C1, Cols)
; true
).
% show_square should always succeed!
show_square(R, C) :-
( square(R, C, Obj /* additional arguments? */)
-> draw(Obj /* additional arguments */)
; draw_not_visible
).
这可能是一个起点。它可以做得更多&#34;花哨&#34;但这是一种非常有效的方法。绘制一个对象取决于你的对象是什么,绘制网格边界是微不足道的。