Разработка программы с использованием языка логического программирования Prolog

Автор работы: Пользователь скрыл имя, 09 Мая 2014 в 20:07, курсовая работа

Описание работы

Настоящий программный продукт предназначен для игры «Крестики - нолики». «Крестики - нолики» — игра для двух участников, в которой игроки по очереди вписывают “x” или “o” в таблицу 3 x 3. Цель игрока — первым заполнить строку, столбец или диагональ таблицы.

Содержание работы

1 ОПИСАНИЕ НАЗНАЧЕНИЯ ПРОГРАММНОГО ПРОДУКТА 4
2 ОПИСАНИЕ ДАННЫХ 4
3 ОПИСАНИЕ МЕТОДОВ РЕШЕНИЯ 5
4 ОПИСАНИЕ ПРОГРАММЫ 10
5 ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА 12
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 14
ПРИЛОЖЕНИЯ 14

Файлы: 1 файл

Курсовая работа.docx

— 46.62 Кб (Скачать файл)

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) Предикат проверяющий ситуацию окончания игры.

 

 

 

 

 

 

 

 

 

 

 

 

 

5 ОПИСАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО  ИНТЕРФЕЙСА

Программа имеет простой пользовательский интерфейс:

При запуске программы на экран выводиться главное меню (рис. 2):

Рисунок 2. Главное меню.

В соответствии с каждым пунктом меню пользователь получает возможность:

    1. начать новую игру
    2. просмотреть текущий счёт
    3. закончить игру

При выборе первого пункта пользователь видит опрос о праве первого хода (рис. 3):

                                                                  

Рисунок 3. Право первого хода

Выбрав, кому будет принадлежать первый ход, пользователь начинает игровой процесс. На экран выводится игровое поле и сообщение о первом ходе (рис. 4).

Рисунок 4. Игровое поле

Пользователю предлагается сделать ход (ввести порядковый номер ячейки, нумерация слева на право, куда пользователь хочет походить, если номер введён неправильно, выводится предложение о повторном вводе).

По окончанию игры на экран выводится игровое поле и главное меню (рис. 5).

Рисунок 5. Окончание игры

 

 

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

  1. Стерлинг Л., Шапиро Э., Искусство программирования на языке Пролог. – М.: Мир, 1990. – 333 с.
  2. Братко И.,  Программирование на языке Пролог для искусственного интеллекта: Пер. с англ. -М.: Мир, 1990.- 560 с., ил.
  3. Материал из Википедии — свободной энциклопедии. – 2010. [Электронный ресурс]. URL: http://ru.wikipedia.org/wiki/ Крестики-нолики.

 

 

 

 

 

 

 

 

 

ПРИЛОЖЕНИЯ

Приложение А. Исходный код программы

%=============================================================================%

    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,X6,X7,X8,X9),

    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,Comp), mydb).

edit_global_score(2) :-

    global_score(You,Comp),

    retract(global_score(_,_), mydb),

    NewComp=Comp+1,

    assertz(global_score(You,NewComp), mydb).

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,0,0,0), edit_global_game_end(1), write("> You won! =)"), nl, nl,!.

who_won(2) :- edit_global_score(2), edit_global_field(0,0,0,0,0,0,0,0,0), edit_global_game_end(1), write("> You lose. :("), nl, nl,!.

who_won(_).

 

 

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X2,X1=X3, who_won(X1),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0, X4=X5,X4=X6, who_won(X4),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0, X7=X8,X7=X9, who_won(X7),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X4,X1=X7, who_won(X1),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0, X2=X5,X2=X8, who_won(X2),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X6,X3=X9, who_won(X3),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0, X1=X5,X1=X9, who_won(X1),!.

find_win(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0, X3=X5,X3=X7, who_won(X3),!.

find_win(0).

 

 

scan_move(1,1) :- global_field(X1,_,_,_,_,_,_,_,_), X1>0 ,!.

scan_move(2,1) :- global_field(_,X2,_,_,_,_,_,_,_), X2>0 ,!.

scan_move(3,1) :- global_field(_,_,X3,_,_,_,_,_,_), X3>0 ,!.

scan_move(4,1) :- global_field(_,_,_,X4,_,_,_,_,_), X4>0 ,!.

scan_move(5,1) :- global_field(_,_,_,_,X5,_,_,_,_), X5>0 ,!.

scan_move(6,1) :- global_field(_,_,_,_,_,X6,_,_,_), X6>0 ,!.

scan_move(7,1) :- global_field(_,_,_,_,_,_,X7,_,_), X7>0 ,!.

scan_move(8,1) :- global_field(_,_,_,_,_,_,_,X8,_), X8>0 ,!.

scan_move(9,1) :- global_field(_,_,_,_,_,_,_,_,X9), X9>0 ,!.

scan_move(_,0).

 

 

edit_global_field(NewX1,NewX2,NewX3,NewX4,NewX5,NewX6,NewX7,NewX8,NewX9) :-

    global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9),

    retract(global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), mydb),

    assertz(global_field(NewX1,NewX2,NewX3,NewX4,NewX5,NewX6,NewX7,NewX8,NewX9), mydb).

 

 

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,X7,X8,X9) :- clearwindow,

    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,X3,X4,X5,X6,X7,X8,X9), edit_global_field(First,X2,X3,X4,X5,X6,X7,X8,X9), draw_field(First,X2,X3,X4,X5,X6,X7,X8,X9),!.

make_move(First, 2, 1) :- scan_move(2,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,First,X3,X4,X5,X6,X7,X8,X9), draw_field(X1,First,X3,X4,X5,X6,X7,X8,X9),!.

make_move(First, 3, 1) :- scan_move(3,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,First,X4,X5,X6,X7,X8,X9), draw_field(X1,X2,First,X4,X5,X6,X7,X8,X9),!.

make_move(First, 4, 1) :- scan_move(4,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,X3,First,X5,X6,X7,X8,X9), draw_field(X1,X2,X3,First,X5,X6,X7,X8,X9),!.

make_move(First, 5, 1) :- scan_move(5,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,X3,X4,First,X6,X7,X8,X9), draw_field(X1,X2,X3,X4,First,X6,X7,X8,X9),!.

make_move(First, 6, 1) :- scan_move(6,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,X3,X4,X5,First,X7,X8,X9), draw_field(X1,X2,X3,X4,X5,First,X7,X8,X9),!.

make_move(First, 7, 1) :- scan_move(7,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,X3,X4,X5,X6,First,X8,X9), draw_field(X1,X2,X3,X4,X5,X6,First,X8,X9),!.

make_move(First, 8, 1) :- scan_move(8,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,X3,X4,X5,X6,X7,First,X9), draw_field(X1,X2,X3,X4,X5,X6,X7,First,X9),!.

make_move(First, 9, 1) :- scan_move(9,Pusto), Pusto<1,!,global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), edit_global_field(X1,X2,X3,X4,X5,X6,X7,X8,First), draw_field(X1,X2,X3,X4,X5,X6,X7,X8,First),!.

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,X6,X7,X8,X9), X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move(2) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move(3) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move(4) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X5<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move(5) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X6<>0,X7<>0,X8<>0,X9<>0,!.

select_move(6) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X7<>0,X8<>0,X9<>0,!.

select_move(7) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X8<>0,X9<>0,!.

select_move(8) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X9<>0,!.

select_move(9) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X2<>0,X3<>0,X4<>0,X5<>0,X6<>0,X7<>0,X8<>0,!.

%

select_move(3) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X2,X3=0,!.

select_move(6) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0,X4=X5,X6=0,!.

select_move(9) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0,X7=X8,X9=0,!.

select_move(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X2=X3,X1=0,!.

select_move(4) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X6,X4=0,!.

select_move(7) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X8<>0,X8=X9,X7=0,!.

select_move(7) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X4,X7=0,!.

select_move(8) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X2=X5,X8=0,!.

select_move(9) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0,X3=X6,X9=0,!.

select_move(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0,X4=X7,X1=0,!.

select_move(2) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X8,X2=0,!.

select_move(3) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X6<>0,X6=X9,X3=0,!.

select_move(9) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X5,X9=0,!.

select_move(1) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X9,X1=0,!.

select_move(7) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X3,X7=0,!.

select_move(3) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X5<>0,X5=X7,X3=0,!.

select_move(2) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X3,X2=0,!.

select_move(5) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X4<>0,X4=X6,X5=0,!.

select_move(8) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X7<>0,X7=X9,X8=0,!.

select_move(4) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X7,X4=0,!.

select_move(5) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X2<>0,X2=X8,X5=0,!.

select_move(6) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0,X3=X9,X6=0,!.

select_move(5) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X1<>0,X1=X9,X5=0,!.

select_move(5) :- global_field(X1,X2,X3,X4,X5,X6,X7,X8,X9), X3<>0,X3=X7,X5=0,!.

select_move(Xod) :- random(8,TempXod), Xod=TempXod+1,!.

 

case(1) :- clearwindow, write("New Game"),nl,

    edit_global_game_end(0),edit_global_field(0,0,0,0,0,0,0,0,0),

    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,0,0,0,0,0), mydb),

assertz(global_score(0,0), mydb),

menu.

 

 


Информация о работе Разработка программы с использованием языка логического программирования Prolog