所以我正在编写一个战舰游戏。游戏有5x5的棋盘,船的位置与真实游戏的逻辑相似,这意味着它们不能并排并相互接触。
所以我遇到了这些问题。
目前,提示循环将在首次击中后结束,但目标是在所有船只沉没时结束循环。
编辑:Board包含2个值0和1,0个为空Tile,1表示它有一个船舶部件。
board([[0, 0, 0, 0, 0],
[1, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 0],
[0, 0, 0, 0, 0]]).
row_at(X, Row) :-
board(Board),
nth0(X, Board, Row).
column_at(Y, Row, Cell) :-
nth0(Y, Row, Cell).
ship_at(X, Y) :-
row_at(X, Row),
column_at(Y, Row, Cell),
Cell = 1.
hit:-
write('hit!'), nl.
miss :-
write('miss!'), nl.
target(X, Y, State) :-
(ship_at(X, Y) ->
hit, asserta(X,Y);
miss).
prompt_number(Prompt, Number) :-
write(Prompt),
write(': '),
read(Number).
:- initialization(main).
main :-
repeat,
prompt_number('enter column number', Col),
prompt_number('enter row number', Row),
target(Row, Col, State),
(ship_at(Row, Col) ->
write('you won!'), nl, halt ;
write('keep trying!'), nl, fail).