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

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

.PL
Скачиваний:
11
Добавлен:
01.05.2014
Размер:
11 Кб
Скачать
/*	Лабораторная работа №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).