Автор работы: Пользователь скрыл имя, 09 Мая 2014 в 20:07, курсовая работа
Настоящий программный продукт предназначен для игры «Крестики - нолики». «Крестики - нолики» — игра для двух участников, в которой игроки по очереди вписывают “x” или “o” в таблицу 3 x 3. Цель игрока — первым заполнить строку, столбец или диагональ таблицы.
1 ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА 4
2 ОПИСАНИЕ ДАННЫХ 4
3 ОПИСАНИЕ МЕТОДОВ РЕШЕНИЯ 5
4 ОПИСАНИЕ ПРОГРАММЫ 10
5 ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА 12
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14
ПРИЛОЖЕНИЯ 14
draw_field (integer, integer, integer, integer, integer, integer, integer, integer, integer) Предикат выполняющий прорисовку игрового поля.
scan_x_o (integer) Вспомогательный предикат выбирающий символ необходимый для вывода в ячейку поля.
edit_global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer) Предикат изменяющий состояние игрового поля в базе данных.
edit_global_score (integer) Предикат изменяющий состояние счёта в базе данных.
edit_global_game_end (integer) Предикат изменяющий текущее состояние игрового процесса (конец игры).
count_field (integer) Предикат подсчитывающий количество занятых ячеек поля.
scan_empty (integer, integer) Вспомогательный предикат проверяющий ячейку поля на пустоту.
find_win (integer) Предикат проверяющий наличие выигрышной комбинации на поле.
who_won (integer) Предикат определяющий победителя раунда.
scan_move (integer, integer) Вспомогательный предикат, проверяющий возможность заданного хода.
select_move (integer) Предикат определяющий ход компьютера.
scan_end_game (integer) Предикат проверяющий ситуацию окончания игры.
Программа имеет простой пользовательский интерфейс:
При запуске программы на экран выводиться главное меню (рис. 2):
Рисунок 2. Главное меню.
В соответствии с каждым пунктом меню пользователь получает возможность:
При выборе первого пункта пользователь видит опрос о праве первого хода (рис. 3):
Рисунок 3. Право первого хода
Выбрав, кому будет принадлежать первый ход, пользователь начинает игровой процесс. На экран выводится игровое поле и сообщение о первом ходе (рис. 4).
Рисунок 4. Игровое поле
Пользователю предлагается сделать ход (ввести порядковый номер ячейки, нумерация слева на право, куда пользователь хочет походить, если номер введён неправильно, выводится предложение о повторном вводе).
По окончанию игры на экран выводится игровое поле и главное меню (рис. 5).
Рисунок 5. Окончание игры
Приложение А. Исходный код программы
%=============================
DATABASE - mydb
global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer)
global_score (integer, integer)
global_game_end (integer)
%=============================
PREDICATES
repeat
case (integer)
menu
show_score ()
who_first ()
first (integer)
game (integer)
make_move (integer, integer, integer)
draw_field (integer, integer, integer, integer, integer, integer, integer, integer, integer)
scan_x_o (integer)
edit_global_field (integer, integer, integer, integer, integer, integer, integer, integer, integer)
edit_global_score (integer)
edit_global_game_end (integer)
count_field (integer)
scan_empty (integer, integer)
find_win (integer)
who_won (integer)
scan_move (integer, integer)
select_move (integer)
scan_end_game (integer)
%=============================
CLAUSES
scan_empty(0,NX) :- NX=0.
scan_empty(_,NX) :- NX=1.
count_field(End) :- global_field(X1,X2,X3,X4,X5,
scan_empty(X1,A),
scan_empty(X2,B),
scan_empty(X3,C),
scan_empty(X4,D),
scan_empty(X5,E),
scan_empty(X6,F),
scan_empty(X7,G),
scan_empty(X8,H),
scan_empty(X9,I),
End=A+B+C+D+E+F+G+H+I.
edit_global_score(1) :-
global_score(You,Comp),
retract(global_score(_,_), mydb),
NewYou=You+1,
assertz(global_score(NewYou,
edit_global_score(2) :-
global_score(You,Comp),
retract(global_score(_,_), mydb),
NewComp=Comp+1,
assertz(global_score(You,
edit_global_score(_).
edit_global_game_end(X) :-
retract(global_game_end(_), mydb),
assertz(global_game_end(X), mydb),!.
who_won(1) :- edit_global_score(1), edit_global_field(0,0,0,0,0,0,
who_won(2) :- edit_global_score(2), edit_global_field(0,0,0,0,0,0,
who_won(_).
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(1) :- global_field(X1,X2,X3,X4,X5,
find_win(0).
scan_move(1,1) :- global_field(X1,_,_,_,_,_,_,_,
scan_move(2,1) :- global_field(_,X2,_,_,_,_,_,_,
scan_move(3,1) :- global_field(_,_,X3,_,_,_,_,_,
scan_move(4,1) :- global_field(_,_,_,X4,_,_,_,_,
scan_move(5,1) :- global_field(_,_,_,_,X5,_,_,_,
scan_move(6,1) :- global_field(_,_,_,_,_,X6,_,_,
scan_move(7,1) :- global_field(_,_,_,_,_,_,X7,_,
scan_move(8,1) :- global_field(_,_,_,_,_,_,_,X8,
scan_move(9,1) :- global_field(_,_,_,_,_,_,_,_,
scan_move(_,0).
edit_global_field(NewX1,NewX2,
global_field(X1,X2,X3,X4,X5,
retract(global_field(X1,X2,X3,
assertz(global_field(NewX1,
scan_x_o(1) :- !, write("x").
scan_x_o(2) :- !, write("o").
scan_x_o(0) :- !, write(" ").
draw_field(X1,X2,X3,X4,X5,X6,
write(" -------------"), nl,
write(" | "), scan_x_o(X1), write(" | "), scan_x_o(X2), write(" | "), scan_x_o(X3), write(" |"), nl,
write(" -------------"), nl,
write(" | "), scan_x_o(X4), write(" | "), scan_x_o(X5), write(" | "), scan_x_o(X6), write(" |"), nl,
write(" -------------"), nl,
write(" | "), scan_x_o(X7), write(" | "), scan_x_o(X8), write(" | "), scan_x_o(X9), write(" |"), nl,
write(" -------------"), nl, nl.
make_move(First, 1, 1) :- scan_move(1,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 2, 1) :- scan_move(2,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 3, 1) :- scan_move(3,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 4, 1) :- scan_move(4,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 5, 1) :- scan_move(5,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 6, 1) :- scan_move(6,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 7, 1) :- scan_move(7,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 8, 1) :- scan_move(8,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(First, 9, 1) :- scan_move(9,Pusto), Pusto<1,!,global_field(X1,X2,
make_move(_,_,0) :- !.
scan_end_game(9) :-edit_global_game_end(1).
scan_end_game(_).
game(1) :-
global_game_end(Endgame), Endgame=0,!,
write("Your step (1-9): "), readint(Xod),
make_move(1, Xod, XodEst), XodEst>0,
find_win(Find_win), Find_win<1 ,!,
count_field(End), scan_end_game(End),
game(2).
game(1) :- global_game_end(End), End=0,!, game(1).
game(2) :-
global_game_end(Endgame), Endgame=0,!,
select_move(Xod),
%write("Computer's lead: ",Xod), nl, readchar(QWERTY),
make_move(2, Xod, XodEst), XodEst>0,
find_win(Find_win), Find_win<1 ,!,
count_field(End), scan_end_game(End),
game(1).
game(2) :- global_game_end(End), End=0,!, game(2).
game(_):-!.
first(1) :- draw_field(0,0,0,0,0,0,0,0,0),
write("> Your step is the first!"), nl, nl,
game(1),menu.
first(2) :- draw_field(0,0,0,0,0,0,0,0,0),
write("> Your step is the second"), readchar(JKHBVJD), nl, nl,
game(2),menu.
first(_) :- clearwindow, write(">! Incorrect input ! Please try again."), nl, nl, who_first().
who_first() :-
write("The first step?"), nl,nl,
write(" 1. You's"), nl,
write(" 2. Computer's"), nl,
write(" =>"), readint(Select), nl,
first(Select).
show_score() :-
global_score(You,Comp),
write(" You: "), write(You), nl,
write(" Computer: "), write(Comp).
select_move(1) :- global_field(X1,X2,X3,X4,X5,
select_move(2) :- global_field(X1,X2,X3,X4,X5,
select_move(3) :- global_field(X1,X2,X3,X4,X5,
select_move(4) :- global_field(X1,X2,X3,X4,X5,
select_move(5) :- global_field(X1,X2,X3,X4,X5,
select_move(6) :- global_field(X1,X2,X3,X4,X5,
select_move(7) :- global_field(X1,X2,X3,X4,X5,
select_move(8) :- global_field(X1,X2,X3,X4,X5,
select_move(9) :- global_field(X1,X2,X3,X4,X5,
%
select_move(3) :- global_field(X1,X2,X3,X4,X5,
select_move(6) :- global_field(X1,X2,X3,X4,X5,
select_move(9) :- global_field(X1,X2,X3,X4,X5,
select_move(1) :- global_field(X1,X2,X3,X4,X5,
select_move(4) :- global_field(X1,X2,X3,X4,X5,
select_move(7) :- global_field(X1,X2,X3,X4,X5,
select_move(7) :- global_field(X1,X2,X3,X4,X5,
select_move(8) :- global_field(X1,X2,X3,X4,X5,
select_move(9) :- global_field(X1,X2,X3,X4,X5,
select_move(1) :- global_field(X1,X2,X3,X4,X5,
select_move(2) :- global_field(X1,X2,X3,X4,X5,
select_move(3) :- global_field(X1,X2,X3,X4,X5,
select_move(9) :- global_field(X1,X2,X3,X4,X5,
select_move(1) :- global_field(X1,X2,X3,X4,X5,
select_move(7) :- global_field(X1,X2,X3,X4,X5,
select_move(3) :- global_field(X1,X2,X3,X4,X5,
select_move(2) :- global_field(X1,X2,X3,X4,X5,
select_move(5) :- global_field(X1,X2,X3,X4,X5,
select_move(8) :- global_field(X1,X2,X3,X4,X5,
select_move(4) :- global_field(X1,X2,X3,X4,X5,
select_move(5) :- global_field(X1,X2,X3,X4,X5,
select_move(6) :- global_field(X1,X2,X3,X4,X5,
select_move(5) :- global_field(X1,X2,X3,X4,X5,
select_move(5) :- global_field(X1,X2,X3,X4,X5,
select_move(Xod) :- random(8,TempXod), Xod=TempXod+1,!.
case(1) :- clearwindow, write("New Game"),nl,
edit_global_game_end(0),edit_
nl, who_first(), nl, nl.
case(2) :- clearwindow, write("Score"), nl, show_score(), nl, nl,fail.
case(0):-!.
case(_).
menu :-nl,repeat,
write("Crosses and zeroes"), nl, nl,
write(" 1. New Game"), nl,
write(" 2. Score"), nl,
write(" 0. Exit"), nl,
write(" =>"), readint(Choice),
case(Choice), Choice=0.
repeat.
repeat:-repeat.
%=============================
GOAL
trace(off),
clearwindow,
assertz(global_game_end(0), mydb),
assertz(global_field(0,0,0,0,
assertz(global_score(0,0), mydb),
menu.
Информация о работе Разработка программы с использованием языка логического программирования Prolog