РГР - Ибрагимова Шакиров
.docxУФИМСКИЙ ГОСУДАРСТВЕННЫЙ АВИАЦИОННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ИНФОРМАТИКИ И РОБОТОТЕХНИКИ
КАФЕДРА ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
|
|
|
||
|
УТВЕРЖДАЮ Проректор университета по научной работе ФИО |
|||
|
|
|
||
|
"___" ______________ _______г. |
|||
|
|
|
||
ОТЧЕТ О ПРОВЕДЕНИИ РАСЧЁТНО-ГРАФИЧЕСКОЙ РАБОТЫ |
||||
|
||||
по предмету: ФУНКЦИОНАЛЬНО И ЛОГИЧЕСКОЕ ПРОГРАММИРОВАНИЕ |
||||
Преподаватель |
|
Котельников В. А. |
||
|
|
|
||
|
|
|
||
|
|
|
||
Исполнители |
|
Ибрагимова К. Б. Шакиров А. Р.
|
||
|
|
|
||
|
|
|
||
Уфа 2020 |
ВВЕДЕНИЕ
Цель работы – научится работать с простыми механизмами и списками на логическом языке программирования Prolog. Получить новые навыки работы в среде Visual Prolog 5.2. Научиться работать с динамической базой данных.
ЗАДАЧА
Разработать игру «Камень-ножницы-бумага», поддерживающая работу нескольких пользователей.
ХОД РАБОТЫ
Определим факты, которые будут храниться в базе данных.
Рис. 1 – Описание фактов, хранящихся в базе данных
Далее определим первоначальные правила.
Рис. 2 – Описание первоначальных правил
Затем опишем вспомогательные предикаты и правил игры (рисунки 3-4).
Рис. 3 – Описание правил игры (начало)
Рис. 4 – Описание правил игры (продолжение)
Экземпляр игры может дать в управление только одного игрока. Для работы второго игрока требуется запустить еще один экземпляр игры. Игра также поддерживает игру нескольких пользователей за одним игроком.
Пример работы игры продемонстрированы на рисунках 5-7.
Рис. 5 – Экран выбора игрока
Рис. 6 – Выполненный ход каждого игрока
Рис. 7 – Отображение результатов игр
ЗАКЛЮЧЕНИЕ
В ходе выполнения расчетно-графической работы были получены новые знания по работе на логическом языке программирования Prolog. Усвоены приемы работы с Visual Prolog 5.2.
ПРИЛОЖЕНИЕ А. Листинг кода в файле «game.pro»
domains
step = symbol % rock | scissors | paper
player = char % 1 | 2
database
item(char, step)
player_step(player, step)
next(player)
get_next(player, player)
result(player, step, step)
predicates
nondeterm login
nondeterm prompt_menu
nondeterm menu(player)
nondeterm end(player)
nondeterm final
nondeterm print_steps
nondeterm action(player,char)
nondeterm win(step,step,player)
nondeterm print_winner(player,step,step)
constants
file = "game.anime"
clauses
item('1', "rock").
item('2', "scissors").
item('3', "paper").
get_next('1','2').
get_next('2','1').
next('1').
login :-
write("Choose player:"), nl,
write("1 - Player1"), nl,
write("2 - Player2"), nl,
write("0 - Exit game"), nl,
readchar(Char),
menu(Char).
prompt_menu :-
write("1 - Make step"), nl,
write("2 - Show results"), nl,
write("0 - Exit game"), nl.
menu('0') :- save(file), !.
menu(Player) :-
nl,nl,nl,
prompt_menu,
readchar(Char),
retractall(_),
consult(file),
nl,nl,nl,
action(Player,Char).
end(Player) :-
save(file),
write("Press any key to continue"), nl,
readchar(_),
menu(Player).
final :-
next('1'),
player_step('1', X1),
player_step('2', X2),
win(X1, X2, Winner),
assertz(result(Winner,X1,X2)).
final.
win(X,Y,'1') :-
item('1', R), X = R, item('2', S), Y = S, !;
item('2', S), X = S, item('3', P), Y = P, !;
item('3', P), X = P, item('1', R), Y = R, !.
win(X,X,'0') :- !.
win(_,_,'2').
print_steps :-
write("1 - rock"), nl,
write("2 - scissors"), nl,
write("3 - paper"), nl.
action(_,'0') :- save(file), !.
action(Player,'1') :-
next(Player),
print_steps,
readchar(N),
item(N, Step),
retractall(player_step(Player, _)),
assert(player_step(Player, Step)),
get_next(Player, Next),
retractall(next(_)),
assert(next(Next)),
final,
end(Player).
action(Player,'1') :-
write("Wait for the opponent's step!"), nl,
end(Player).
action(_,'2') :- write("Results:"), nl, nl, fail.
action(_,'2') :-
result(Result, Step1, Step2),
print_winner(Result, Step1, Step2),
fail.
action(Player,'2') :- nl, end(Player).
print_winner('0',Step1,Step2) :- write("Draw! ", Step1, " - ", Step2), nl, !.
print_winner(Winner,Step1,Step2) :- write("Winner is Player", Winner, "! ", Step1, " - ", Step2), nl.
goal
login.