Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Моделирование объекта футболисты

.PL
Скачиваний:
8
Добавлен:
01.05.2014
Размер:
10.63 Кб
Скачать
/* Лабораторная работа №1 */
/* Футболисты */
% 1 - номер футболиста
% 2 - фамилия
% 3 - опыт
:- dynamic(t_player/3).
player_num(1,21).
t_player(1, 'Malafeev', 40).
t_player(2, 'Chontofalski', 75).
t_player(3, 'Anukov',44).
t_player(4, 'Vieshtica', 35).
t_player(5, 'Kriganatz',33).
t_player(6, 'Maresh',63).
t_player(7, 'Flahbart', 58).
t_player(8, 'Hagen', 56).
t_player(9, 'Shkrtel', 17).
t_player(10, 'Kozlov', 44).
t_player(11, 'Vlasov', 61).
t_player(12, 'Gorshkov',94).
t_player(13, 'Denisov', 14).
t_player(14, 'Kasaev',44).
t_player(15, 'Radimov',57).
t_player(16, 'Spivak',40).
t_player(17, 'Shirl',25).
t_player(18, 'Shumolikoski',85).
t_player(19, 'Arshavin',77).
t_player(20, 'Kergakov',22).

/*t_player(22, Пошкус).*/

/* Цвета формы конанд */
color_num( 1, 6 ).
t_color(1, 'Blue').
t_color(2, 'White').
t_color(3, 'Red').
t_color(4, 'Green').
t_color(5, 'Yellow').
t_color(6, 'Black').

/* Команды */
t_team_name(1, 'Zubilo').
t_team_name(2, 'Shaiba').
t_team_name(3, 'Govoruni').
t_team_name(4, 'Outsiders').

/* Состав команд */
% 1 - номер команды
% 2 - номер игрока
/*------ Зубило ------*/
t_team(1,[1,2,3,4,5]).
/*------ Шайба ------*/
t_team(2,[6,7,8,9,10]).
/*------ Говоруны ------*/
t_team(3,[11,12,13,14,15]).
/*------ Аутсайдеры ------*/
t_team(4,[16,17,18,19,20]).

:- dynamic(all_teams/1).
all_teams([1,2,3,4]).

/* Характеристки команд */
% 1 - номер команды
% 2 - капитан
% 3 - цвет формы
% 4 - боевой настрой
% t_team_info(ID_team, ID_captain, Team_color, Spirit),
:- dynamic(t_team_info/4).

t_team_info(1, 1, 1, 1).
t_team_info(2, 6, 2, 1).
t_team_info(3, 11, 3, 1).
t_team_info(4, 16, 4, 1).

/* Вспомогательные функции */
not(X) :- call(X), !, fail.
not(_).

/* Работа со списком */
has_elem(Elem, [Elem|_]).
has_elem(Elem, [_|T]) :- has_elem(Elem, T).

sum_all([], 0).
sum_all([Members|T], Sum) :-
t_player(Members, _, Exp),
sum_all(T, Sum1), Sum is Exp + Sum1.

/* Суммарный опыт */
get_sum_exp(ID_team, Sum) :-
get_team_members(ID_team,Members),
sum_all(Members, Sum).


/* Вывод состава команды */
print_team_members([]) :- nl.
print_team_members([Members|T]) :-
t_player(Members, Player_name, Exp),
write(Members), write(' '), write(Player_name),
write(' '), write(Exp), nl,
print_team_members(T).

/* Получение имени капитана */
get_captain_name(ID_team, Captain_name) :-
t_team_info(ID_team, ID_captain, _, _),
t_player(ID_captain, Captain_name, _).

/* Получение цвета формы команды */
get_team_color(ID_team, Color_name) :-
t_team_info(ID_team, _, Team_color, _),
t_color(Team_color, Color_name).

/* Получение боевого духа команды */
get_team_spirit(ID_team, Team_spirit) :-
t_team_info(ID_team, _, _, Team_spirit).

/* Получение состава команды */
get_team_members(ID_team, Members) :-
t_team(ID_team, Members).

/* Вывести информацию о команде */
% 1 - номер команды
% 2 - ???
print_team(ID_team) :-
show_teams,
write('----------------------------------------------------------'), nl,
write('Team ID: '), write(ID_team), nl,
get_captain_name(ID_team, Captain_name),
write('Captain name: '), write(Captain_name), nl,
get_team_color(ID_team, Color_name),
write('Clothes color: '), write(Color_name), nl,
get_team_spirit(ID_team, Team_spirit),
write('Team spirit: '), write(Team_spirit), nl,
get_team_members(ID_team, Members),
write('Team members: '), nl, print_team_members(Members),
write('----------------------------------------------------------'), nl.

print_team(_) :-
not(show_teams).


/* Назначить нового командира */
set_captain(ID_team, ID_player) :-
t_player(ID_player, _, _), % проверяем, что игрок существует
get_team_members(ID_team, Members), % проверяем, что он есть в этой команде
has_elem(ID_player, Members), %
t_team_info(ID_team, ID_captain, Team_color, Team_spirit),
retract(t_team_info(ID_team, ID_captain, Team_color, Team_spirit)),
asserta(t_team_info(ID_team, ID_player, Team_color, Team_spirit)).
set_captain(_, ID_player) :-
t_player(ID_player, _, _), % проверяем, что игрок существует
write('There is no such player in the team').
set_captain(_,_) :-
write('There is no such player at all.').

/* Шанс выиграть */
chance(ID_team, RES) :-
get_sum_exp(ID_team, Sum), % суммраный опыт команды
random(0,100, Rnd1), % случай
random(1,10, Rnd2), % 2-ой случай
t_team_info(ID_team, _, _, Team_spirit), % Дух команды
RES is Sum / 5 * Rnd1 + Team_spirit * Rnd2.
% RES is Rnd2.

/* Добавить опыта игрокам */
add_exp_all([]).
add_exp_all([H|T]) :-
t_player(H, Player_name, Exp),
random(0,10, Rnd), % случай
retract(t_player(H, Player_name, Exp)),
Res2 is Exp + Rnd,
asserta(t_player(H, Player_name, Res2)),
add_exp_all(T).

add_exp_players(ID_team) :-
get_team_members(ID_team, Members),
add_exp_all(Members).

/* Добавить опыта команде */
add_exp(ID_team) :-
t_team_name(ID_team, _),
t_team_info(ID_team, ID_captain, Team_color, Team_spirit),
retract(t_team_info(ID_team, ID_captain, Team_color, Team_spirit)),
random(0,100, Rnd), % случай
Team_spirit_new is floor((Team_spirit + 2 * Rnd / 100) * 100) / 100,
Diff is Team_spirit_new - Team_spirit,
asserta(t_team_info(ID_team, ID_captain, Team_color, Team_spirit_new)),
write(Diff),
add_exp_players(ID_team).

/* Понизить настрой */
low_spirit(ID_team) :-
t_team_info(ID_team, ID_captain, Team_color, Team_spirit),
retract(t_team_info(ID_team, ID_captain, Team_color, Team_spirit)),
random(0,100, Rnd), % случай
Team_spirit_new is floor((Team_spirit - 2 * Rnd / 100) * 100) / 100,
asserta(t_team_info(ID_team, ID_captain, Team_color, Team_spirit_new)).

/* Зафиксировать факт победы команды */
team_win(ID_team, Team_name) :-
write('After hard strugle team '),
write(Team_name), write(' won.'), nl,
write('It got: '),
add_exp(ID_team),
write(' of spirit.'), nl,
print_team(ID_team).

/* Определить победителя */

:- dynamic(was_game/2).
:- dynamic(team_score/2).
was_game(1, 1).
was_game(2, 2).
was_game(3, 3).
was_game(4, 4).

clear_team_score :-
retract(team_score(_,_)),
clear_team_score.

clear_team_score.

clear_was_game :-
retract(was_game(_,_)),
clear_was_game.

clear_was_game.



was_game([]).
was_game([Teams|T]) :-
asserta(was_game(Teams,Teams)),
was_game(T).

was_game :-
clear_was_game,
all_teams(Teams),
was_game(Teams).


calc_scores(ID_team1, ID_team2, Score1, Score2) :-
champ_is_held,
!,
team_score(ID_team1, Score_old1),
retract(team_score(ID_team1, Score_old1)),

New_score1 is Score_old1 + Score1,
asserta(team_score(ID_team1, New_score1)),

team_score(ID_team2, Score_old2),
retract(team_score(ID_team2, Score_old2)),

New_score2 is Score_old2 + Score2,
asserta(team_score(ID_team2, New_score2)).

calc_scores(_, _, _, _) :-
not(champ_is_held).

calc_scores(ID_team1, ID_team2, 3) :-
calc_scores(ID_team1, ID_team2, 3, 0).
calc_scores(ID_team1, ID_team2, 1) :-
calc_scores(ID_team1, ID_team2, 1, 1).
calc_scores(ID_team1, ID_team2, 0) :-
calc_scores(ID_team1, ID_team2, 0, 3).

check_winner(ID_team1, ID_team2, Team_name1, Team_name2, Chance1, Chance2) :-
Chance1 < Chance2,
team_win(ID_team2, Team_name2),
low_spirit(ID_team1),
calc_scores(ID_team1, ID_team2, 0);

team_win(ID_team1, Team_name1),
low_spirit(ID_team2),
calc_scores(ID_team1, ID_team2, 3).


/* Лабораторная работа №2 */

/* Провести игру */
make_game(ID_team1, ID_team2) :-
ID_team1 == ID_team2,
write('Team cannot play with itself');

t_team_name(ID_team1, Team_name1),
t_team_name(ID_team2, Team_name2),
write('=================================================='), nl,
write('So it happened!! Team '), write(Team_name1), write(' and '), write(Team_name2), write(' met!'), nl,
chance(ID_team1, Chance1),
write('Chance1 = '), write(Chance1),
chance(ID_team2, Chance2),
write(' Chance2 = '), write(Chance2), nl,

Chance1 =\= Chance2,
check_winner(ID_team1, ID_team2, Team_name1, Team_name2, Chance1, Chance2),
write('=================================================='), nl;

write('Neither team won. It was a cool draw game!'), nl,
calc_scores(ID_team1, ID_team2, 1),
write('=================================================='), nl.

/*make_game(ID_team1, ID_team2) :-
randomize,
chance(ID_team1, Chance1),
chance(ID_team2, Chance2),
Chance1 > Chance2,
write('After hard strugle team '),
t_team_name(ID_team1, Team_name),
write(Team_name), write(' won.'), nl,
write('It got: '),
add_exp(ID_team1),
write(' of experience.'), nl,
print_team(ID_team1),
write('=================================================='), nl.
make_game(_, _) :-
write('So it happened!! Team '), write(Team_name1), write(' and '), write(Team_name2), write(' met!'), nl,
write('Neither team won. It was a cool draw game!'), nl,
write('=================================================='), nl.
*/

play_with_others(ID_team1) :-
t_team_info(ID_team2, _, _, _),
not(was_game(ID_team1, ID_team2)),
make_game(ID_team1, ID_team2), % Сыграли игру
% Запомнили результат
asserta(was_game(ID_team1, ID_team2)), % Записали, что такая игра была
play_with_others(ID_team1).

play_with_others(_).

:- dynamic(champ_is_held/0).

team_score(1,0).
team_score(2,0).
team_score(3,0).
team_score(4,0).

set_all_sc_null([]).
set_all_sc_null([Teams|T]) :-
asserta(team_score(Teams,0)),
set_all_sc_null(T).

scores_null :-
clear_team_score,
all_teams(Teams),
set_all_sc_null(Teams).

/* Лабораторная работа №3 */

start_champ :-
was_game,
scores_null,
asserta(champ_is_held).

stop_champ :-
was_game,
retract(champ_is_held).

print_scores([]).
print_scores([Teams|T]) :-
t_team_name(Teams, Team_name),
team_score(Teams, Team_score),
write(Team_name), write(' '), write(Team_score), nl,
print_scores(T).

print_scores :-
write('***********************************************'), nl,
write('Championship results:'), nl,
all_teams(Teams),
write('Team'), write(' '), write('Score'), nl,
print_scores(Teams),
write('***********************************************'), nl.

:- dynamic(show_teams/0).
% show_teams.

champ :-
start_champ,
all_teams(Teams),
championship(Teams),
!,
stop_champ,
print_scores.

championship([]).
championship([Not_played|T]) :-
play_with_others(Not_played),
championship(T).