11
1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result). play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result). play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result). Sets initial state Displays game state Terminating state Display the result Decide on a move Update the state Choose who’s next

1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

Embed Size (px)

Citation preview

Page 1: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

1

Logic ProgrammingSchool of Informatics, University of Edinburgh

A Basic Interactive Game

play(Result) :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).

play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).

Sets initial state

Displays game state

Terminating state

Display the result

Decide on a move

Update the state

Choose who’s next

Page 2: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

2

Logic ProgrammingSchool of Informatics, University of Edinburgh

Noughts and Crosses

play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).

play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).

X

Page 3: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

3

Logic ProgrammingSchool of Informatics, University of Edinburgh

Noughts and Crosses

play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).

play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).

X

X

OX

X

Page 4: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

4

Logic ProgrammingSchool of Informatics, University of Edinburgh

Noughts and Crosses

play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).

play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).

XOX

Page 5: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

5

Logic ProgrammingSchool of Informatics, University of Edinburgh

Noughts and Crosses

play :- initialise(Game, Position, Player), display_game(Position, Player), play(Position, Player, Result).

play(Position, Player, Result) :- game_over(Position, Player, Result),!, announce(Result).play(Position, Player, Result) :- choose_move(Position, Player, Move), move(Move, Position, NewPosition), display_game(NewPosition, Player), next_player(Player, NewPlayer), !, play(NewPosition, NewPlayer, Result).

XX

X OO

Page 6: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

6

Logic ProgrammingSchool of Informatics, University of Edinburgh

Representing Game State: Examples

board(x, [x,e,o,e,x,o,e,e,x]).

board(x, [x,_,o,_,x,o,_,_,x]).

board(P, [S1,S2,S3,S4,S5,S6,S7,S8,S9], [ [S1,S2,S3], [S4,S5,S6], [S7,S8,S9], [S1,S4,S7], [S2,S5,S8], [S3,S6,S9], [S1,S5,S9], [S3,S5,S7] ]).

board(x, player(x,[1,5,9]), player(o,[3,6])).

Page 7: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

7

Logic ProgrammingSchool of Informatics, University of Edinburgh

Input and Output (Prolog Terms)

| ?- read(X).: move(5).X = move(5)

| ?- write([x,e,e,x,o,e,e,e,e]), nl.([x,e,e,x,o,e,e,e,e])

Reads a Prolog Term from the standard input

Writes a Prolog Term to the standard output

Throws a new line on the standard input

Page 8: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

8

Logic ProgrammingSchool of Informatics, University of Edinburgh

A Simple Recursive Input Program

read_until([Input|Rest], Prompt, StopTerm) :-write(Prompt),read(Input),\+ Input = StopTerm, !,read_until(Rest, Prompt, StopTerm).

read_until([], _, _).

| ?- read_until(X, 'Input data : ', stop).Input data : foo(a).Input data : baz.Input data : stop.

X = [foo(a), baz]

Page 9: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

9

Logic ProgrammingSchool of Informatics, University of Edinburgh

Input (Characters)

| ?- read_word_list(X).|: You can find this program in Sterling and Shapiro

X = [‘You’,can,find,this,program,in,’Sterling’,and,’Shapiro’]

Page 10: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

10

Logic ProgrammingSchool of Informatics, University of Edinburgh

Input (Characters)

read_word_list(Ws) :- get0(C), read_word_list(C, Ws).

read_word_list(C, [W|Ws]) :-word_char(C),read_word(C, W, C1),read_word_list(C1, Ws).

read_word_list(C, Ws) :-fill_char(C),get0(C1),read_word_list(C1, Ws).

read_word_list(C, []) :-end_of_words_char(C).

fill_char(32).

end_of_words_char(46).end_of_words_char(63).

Full stop

Question mark

Reads the first character from standard

input

Page 11: 1 Logic Programming School of Informatics, University of Edinburgh A Basic Interactive Game play(Result) :- initialise(Game, Position, Player), display_game(Position,

11

Logic ProgrammingSchool of Informatics, University of Edinburgh

Reading a Word

read_word(C, W, C1):-word_chars(C, Cs, C1),name(W, Cs).

word_chars(C, [C|Cs], C0):-word_char(C), !,get0(C1),word_chars(C1, Cs, C0).

word_chars(C, [], C):-\+ word_char(C).

word_char(C):- 97 =< C, C =< 122.word_char(C):- 65 =< C, C =< 90.word_char(C):- 48 =< C, C =< 57.word_char(95).

Lower case letter

Upper case letter

Number

Underscore