Prolog - showBoard of a game

时间:2014-05-15 12:22:35

标签: prolog

我试图在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 ||

== == == == == == == == == ==

1 个答案:

答案 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;但这是一种非常有效的方法。绘制一个对象取决于你的对象是什么,绘制网格边界是微不足道的。