Моделирование объекта странствующие рыцари / Моделирование объекта
.docМоделирование объекта, жизни и толпы.
-
Реализовать объект с не меньше чем 5 свойствами, определить их изменение.
-
Реализовать жизнь одного объекта
-
Реализовать жизнь толпы (не меньше чем 3 объектов)
Выбранный объект: Рыцарь.
У него есть координаты нахождения на карте по оси X и оси Y, уровень жизни HP, опыт XP, а так же уровень развития LVL.
Рыцарь случайным образом выбирает направление движения (вверх, вниз, влево, вправо) и делает шаг. На новой клетке происходит вероятностный выбор одного из возможных событий:
- Найти банку с жизнями (+25 к уровню здоровья) 10%
- Встретить монстра 30%
- Встретить дракона 5%
- Упасть в яму 5%
- Ничего не встретить 50%
При встрече с монстром возможны два исхода
- Быть ударенным монстром 50% - LVL% (нижняя граница 20%)
- Убить монстра 50% + LVL% (верхняя граница 80%)
При уничтожении монстра рыцарь получает опыт XP согласно следующей формуле
XP1=XP+LVL*3
После чего идет перечет уровня рыцаря по формуле
(LVL*3)*(LVL*5) – опыта до следующего уровня.
При исходе «Быть ударенным монстром» рыцарь теряет нанесенный монстром урон из своего уровня жизни. Диапазон урона монстра есть случайная величина (20 ÷ 70), при этом диапазон зависит от уровня следующим образом:
( 20 - LVL ÷ 70 - LVL). (уровень больше 30 рассчитывается как для уровня 20). Далее повторяется событие «Встретить монстра» и так до тех пор пока
- Монстр не будет убит
- Рыцарь не будет убит
Рыцарь умирает, когда его уровень жизни HP становится неположительным.
Если после боя уровень жизни рыцаря ниже чем 50, то объект предпочитает постоять и повысить его не менее чем до 50.
Исход «упасть в яму» означает -35 из уровня жизни объекта единовременно.
Исход «встретить дракона» аналогичен исходу «встретить монстра» за исключением следующих изменений:
- Диапазон урона дракона ( 20 ÷ 100 ) и не зависит от уровня рыцаря.
- При уничтожении дракона формула изменения опыта есть
- Вероятность убить дракона 30% и 70%, что дракон попадет соответственно. Характеристики не зависят от уровня рыцарю
XP1=XP+LVL*5
Правила для толпы:
Толпой считается объединение 3 и более рыцарей, которые находятся друг возле друга в 1 клетке от конкретного положения рассматриваемого рыцаря.
При смерти рыцарь меняет свои координаты на 0, 0 (появляется в другом месте(в городе)), что предусматривает возможность разрушения толпы
Приоритет толпы
- Толпа двигается в одну сторону
- Если не менее половины объектов, входящих в толпу требуют стоять и восстанавливать уровень жизни, вся толпа стоит независимо от того, нужно отдельным объектам или нет.
Таблица, иллюстрирующая законы развития рыцаря
Уровень |
XP за монстра |
XP для следующего уровня |
Количество необходимых монстров для достижения нового уровня (не учитывая драконов) |
1 |
3 |
15 |
5 |
2 |
6 |
60 |
10 |
3 |
9 |
135 |
15 |
Предлагаемый алгоритм.
act(N,HP,XP,X,Y,LVL) :-
random(E),Z is E*100,(Z=<5,write('Dragon!'),nl,battledragon(N,HP,XP,X,Y,LVL);
Z>5,Z=<10,pit(N,HP,XP,X,Y,LVL);
Z>10,Z=<20,potion(N,HP,XP,X,Y,LVL);
Z>20,Z=<50,write('Monster!'),nl,battlemonster(N,HP,XP,X,Y,LVL);Z>50,write('Hm...nothing!'),nl),!.
battledragon(N,HP,XP,X,Y,LVL) :- random(E),Z is E*100,
(Z=<30,killdragon(N,HP,XP,X,Y,LVL);
knockeddragon(N,HP,XP,X,Y,LVL)),!.
killdragon(N,HP,XP,X,Y,LVL) :- write('I killed Dragon!'),nl,XP1 is XP+LVL*5,
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP1,X,Y,LVL)),
ulvl(N,HP,XP1,X,Y,LVL),!.
knockeddragon(N,HP,XP,X,Y,LVL) :- write('I am hited by Dragon!'),nl,random(E),Z is E*100,
(Z=<20,Z1 is 20;Z>=100,Z1 is 100;Z1 is Z),write(' Damage is -'),write(Z1),nl,
(Z1=<HP,HP1 is HP - Z1;HP1 is 0),
(HP1=0,killed(N,HP,XP,X,Y,LVL);
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP1,XP,X,Y,LVL)),
battledragon(N,HP1,XP,X,Y,LVL)),!.
killed(N,HP,XP,X,Y,LVL) :- write('I am killed!'),nl,XP1 is XP-LVL*5,HP1 is 100,
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP1,XP1,0,0,LVL)),
dlvl(N,HP1,XP1,0,0,LVL),!.
battlemonster(N,HP,XP,X,Y,LVL) :- random(E),Z is E*100,
Q is 50+LVL,(Q>80,Q1 is 80;Q=<80,Q1 is Q),
(Z=<Q,killmonster(N,HP,XP,X,Y,LVL);knockedmonster(N,HP,XP,X,Y,LVL)),!.
killmonster(N,HP,XP,X,Y,LVL) :- write('I killed monster!'),nl,
XP1 is XP+LVL*3,
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP1,X,Y,LVL)),
ulvl(N,HP,XP1,X,Y,LVL),!.
knockedmonster(N,HP,XP,X,Y,LVL) :- write('I am hited by monster!'),nl,random(E),Z is E*100,
(LVL>20,L is 20;L is LVL),
(Z=<20-L,Z1 is 20-L;Z>=70-L,Z1 is 70-L;Z1 is Z),write(' Damage is -'),
write(Z1),nl,
(Z1=<HP,HP1 is HP - Z1;HP1 is 0),
(HP1=0,killed(N,HP,XP,X,Y,LVL);
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP1,XP,X,Y,LVL)),
battlemonster(N,HP1,XP,X,Y,LVL)),!.
pit(N,HP,XP,X,Y,LVL) :- write('A PIT!'),nl,HP1 is HP-35,(HP1=<0,killed(N,HP,XP,X,Y,LVL);HP1>0,
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP1,XP,X,Y,LVL))),!.
potion(N,HP,XP,X,Y,LVL) :- write('O, healing!'),nl,HP1 is HP+25,(HP1>=100,HP2 is 100;HP2 is HP1),
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP2,XP,X,Y,LVL)),!.
ulvl(N,HP,XP,X,Y,LVL) :- XP1 is XP-(LVL*3)*(LVL*5),(XP1>0,write('Lvl up!'),nl,HP1 is 100,LVL1 is LVL+1;
XP1=<0,LVL1 is LVL,HP1 is HP),
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP1,XP,X,Y,LVL1)),!.
dlvl(N,HP,XP,X,Y,LVL) :- (XP<0,XP2 is 0,LVL1 is 1;(XP2 is XP,XP1 is XP-((LVL-1)*3*(LVL-1)*5),
(XP1<0,write('Lvl down!'),nl,LVL1 is LVL-1;LVL1 is LVL))),
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP2,X,Y,LVL1)),!.
heal(N,HP,XP,X,Y,LVL) :- write('I heal myself!'),nl,HP1 is HP+10,(HP1>=100,HP2 is 100;HP2 is HP1),
retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP2,XP,X,Y,LVL)),!.
show(N,I) :- knight(N,HP,XP,X,Y,LVL),write('Step #'),write(I),nl,
write('Knight #'),write(N),nl,
write('HP : '),write(HP),nl,
write('XP : '),write(XP),nl,
write('X : '),write(X),nl,
write('Y : '),write(Y),nl,
write('LVL : '),write(LVL),nl.
init :- write('Enter number of knights : '),read(K),nl,(K>0,initilization(K,0);
write('Error#1 : Number of knights cannot be less then 1'),nl),!.
initilization(K,I) :- I1 is I+1,I1=<K,write('Enter X of '),write(I1),write(' knight : '),read(X),
write('Enter Y of '),write(I1),write(' knight : '),read(Y),
assertz(knight(I1,100,0,X,Y,1)),initilization(K,I1),!;write('OK'),nl,start1(K),!.
start1(K) :- randomize,write('Enter the number of steps : '),read(I),start2(K,I),!.
start2(K,I) :- I>0,analization(K,1,I,[]),I1 is I-1,start2(K,I1);I=<0,start,!.
add(E,S,[E|S]).
connect([H|T],C,S) :- connect(T,[H|C],S).
connect([],C,C).
cop(S,S).
analization1(K,N,P,C) :- add(N,C,C1),knight(N,HP,XP,X,Y,LVL),arround(N,X,Y,[],K,0,P,C1),!.
analization(K,N,P,C) :- (N=<K,member1(N,C),knight(N,HP,XP,X,Y,LVL),arround(N,X,Y,[],K,0,P,S),connect(S,C,C1),N1 is N+1,analization(K,N1,P,C1);N=<K,N1 is N+1,analization(K,N1,P,C);1==1),!.
arround(N,X,Y,S,K,I,P,C) :- X1 is X-1,X2 is X+1,Y1 is Y-1,Y2 is Y+1,(knight(NUM,HP,XP,X,Y,LVL);
knight(NUM,HP,XP,X1,Y,LVL);
knight(NUM,HP,XP,X2,Y,LVL);
knight(NUM,HP,XP,X,Y1,LVL);
knight(NUM,HP,XP,X,Y2,LVL);
knight(NUM,HP,XP,X1,Y1,LVL);
knight(NUM,HP,XP,X2,Y2,LVL);
knight(NUM,HP,XP,X1,Y2,LVL);
knight(NUM,HP,XP,X2,Y1,LVL)),member1(NUM,S),I1 is I+1,add(NUM,S,S1),
(I1<K,arround(N,X,Y,S1,K,I1,P,C);(I1>=3,!,go(S1,I1,K,P),cop(S1,C);go1(S1,P),cop(S1,C);1==1,cop(S1,C))),!.
lok(N,S,N2,K) :- (N=<K,(member1(N,S),N2 is N;N1 is N+1,lok(N1,S,N2,K));N2 is N),!.
member1(_,[]) :- 1==1.
member1(N,[H|T]) :- H\=N,member1(N,T).
go(S,I,K,P) :- movec(S,S,I,0,P),!.
go1([N|T],P) :- moven(N,P),go1(T,P).
go1([],P).
moven(N,P) :- knight(N,HP,XP,X,Y,LVL),(HP<50,show(N,P),heal(N,HP,XP,X,Y,LVL),show(N,P);random(E),Z is E*100,
(Z=<25, movehxn(N,HP,XP,X,Y,LVL,P);
Z>25,Z=<50, movehyn(N,HP,XP,X,Y,LVL,P);
Z>50,Z=<75, movelxn(N,HP,XP,X,Y,LVL,P);
Z>75, movelyn(N,HP,XP,X,Y,LVL,P))),!.
movehxn(N,HP,XP,X,Y,LVL,P) :- X1 is X+1,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP,X1,Y,LVL)),act(N,HP,XP,X1,Y,LVL),show(N,P),!.
movehyn(N,HP,XP,X,Y,LVL,P) :- Y1 is Y+1,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP,X,Y1,LVL)),act(N,HP,XP,X,Y1,LVL),show(N,P),!.
movelxn(N,HP,XP,X,Y,LVL,P) :- X1 is X-1,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP,X1,Y,LVL)),act(N,HP,XP,X1,Y,LVL),show(N,P),!.
movelyn(N,HP,XP,X,Y,LVL,P) :- Y1 is Y-1,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),asserta(knight(N,HP,XP,X,Y1,LVL)),act(N,HP,XP,X,Y1,LVL),show(N,P),!.
movec(S,[N|T],I,K,P) :- knight(N,HP,XP,X,Y,LVL),(HP<50,K1 is K+1;K1 is K),movec(S,T,I,K1,P),!.
movec(S,[],I,K,P) :- (K>=I/2,F is 1,move(S,F,P);F is 0,move(S,F,P)),!.
move(S,F,P) :- (F==1,healing(S,P);moving(S,P)).
healing([N|T],P) :- knight(N,HP,XP,X,Y,LVL),heal(N,HP,XP,X,Y,LVL),show(N,P), healing(T,P).
healing([],P).
moving(S,P) :- random(E),Z is E*100,(Z=<25, movehx(S,P);
Z>25,Z=<50, movehy(S,P);
Z>50,Z=<75, movelx(S,P);
Z>75, movely(S,P)),!.
movehx([N|T],P) :- knight(N,HP,XP,X,Y,LVL),X1 is X+1,!,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),
asserta(knight(N,HP,XP,X1,Y,LVL)),act(N,HP,XP,X1,Y,LVL),show(N,P),movehx(T,P),!.
movehx([],P).
movehy([N|T],P) :- knight(N,HP,XP,X,Y,LVL),Y1 is Y+1,!,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),
asserta(knight(N,HP,XP,X,Y1,LVL)),act(N,HP,XP,X,Y1,LVL),show(N,P),movehy(T,P),!.
movehy([],P).
movelx([N|T],P) :- knight(N,HP,XP,X,Y,LVL),X1 is X-1,!,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),
asserta(knight(N,HP,XP,X1,Y,LVL)),act(N,HP,XP,X1,Y,LVL),show(N,P),movelx(T,P),!.
movelx([],P).
movely([N|T],P) :- knight(N,HP,XP,X,Y,LVL),Y1 is Y-1,!,show(N,P),retract(knight(N,HP,XP,X,Y,LVL)),
asserta(knight(N,HP,XP,X,Y1,LVL)),act(N,HP,XP,X,Y1,LVL),show(N,P),movely(T,P),!.
movely([],P).
allretract(N) :- retract(knight(N,HP,XP,X,Y,LVL)),N1 is N+1,allretract(N1);1==1,!.
start :- write('1 - begin ; 2 - clear list of knights ; 3 - exit from start : '),read(C),(C==1, init;C==2, allretract(1),write('DONE'),nl,start;C==3;start),!.
Замечания к алгоритму:
- Запускать следует правило start
- Следует помнить, что при повторном выборе BEGIN, будет происходить инициализация новых (совершено других) объектов с уже существующими номерами.
Поэтому необходимо точно помнить какой объект, где или не забывать перед новым запуском удалять список объектов, что предусмотрено правилом allretract(N), где N это номер рыцаря.
Трассировка важной части.
Сердцем всей программы (самой сложной ее частью является анализирование объектом окружающего его мира (поиск товарищей вокруг себя или на своей позиции.))
Остальные части программы практически линейны и интуитивно понятны.
Для трассировки вводится список рыцарей:
| ?- asserta(knight(1,100,0,0,0,1)).
| ?- asserta(knight(2,100,0,0,0,1)).
| ?- asserta(knight(3,100,0,1,1,1)).
| ?- asserta(knight(4,100,0,55,0,1)).
{trace}
| ?- analization(4,1,1,[]).
1 1 Call: analization(4,1,1,[]) ?
2 2 Call: 1=<4 ?
2 2 Exit: 1=<4 ?
3 2 Call: member1(1,[]) ?
4 3 Call: 1==1 ?
4 3 Exit: 1==1 ?
3 2 Exit: member1(1,[]) ?
5 2 Call: knight(1,_118,_119,_163,_164,_120) ?
5 2 Exit: knight(1,100,0,0,0,1) ?
6 2 Call: arround(1,0,0,[],4,0,1,_204) ?
7 3 Call: _231 is 0-1 ?
7 3 Exit: -1 is 0-1 ?
8 3 Call: _259 is 0+1 ?
8 3 Exit: 1 is 0+1 ?
9 3 Call: _287 is 0-1 ?
9 3 Exit: -1 is 0-1 ?
10 3 Call: _315 is 0+1 ?
10 3 Exit: 1 is 0+1 ?
11 3 Call: knight(_347,_302,_303,0,0,_304) ?
11 3 Exit: knight(2,100,0,0,0,1) ?
12 3 Call: member1(2,[]) ?
13 4 Call: 1==1 ?
13 4 Exit: 1==1 ?
12 3 Exit: member1(2,[]) ?
14 3 Call: _435 is 0+1 ?
14 3 Exit: 1 is 0+1 ?
15 3 Call: add(2,[],_461) ?
15 3 Exit: add(2,[],[2]) ?
16 3 Call: 1<4 ?
16 3 Exit: 1<4 ?
17 3 Call: arround(1,0,0,[2],4,1,1,_519) ?
18 4 Call: _546 is 0-1 ?
18 4 Exit: -1 is 0-1 ?
19 4 Call: _574 is 0+1 ?
19 4 Exit: 1 is 0+1 ?
20 4 Call: _602 is 0-1 ?
20 4 Exit: -1 is 0-1 ?
21 4 Call: _630 is 0+1 ?
21 4 Exit: 1 is 0+1 ?
22 4 Call: knight(_662,_617,_618,0,0,_619) ?
22 4 Exit: knight(2,100,0,0,0,1) ?
23 4 Call: member1(2,[2]) ?
24 5 Call: 2\=2 ?
25 6 Call: 2=2 ?
25 6 Exit: 2=2 ?
24 5 Fail: 2\=2 ?
23 4 Fail: member1(2,[2]) ?
22 4 Redo: knight(2,100,0,0,0,1) ?
22 4 Exit: knight(1,100,0,0,0,1) ?
23 4 Call: member1(1,[2]) ?
24 5 Call: 2\=1 ?
25 6 Call: 2=1 ?
25 6 Fail: 2=1 ?
24 5 Exit: 2\=1 ?
25 5 Call: member1(1,[]) ?
26 6 Call: 1==1 ?
26 6 Exit: 1==1 ?
25 5 Exit: member1(1,[]) ?
23 4 Exit: member1(1,[2]) ?
27 4 Call: _803 is 1+1 ?
27 4 Exit: 2 is 1+1 ?
28 4 Call: add(1,[2],_829) ?
28 4 Exit: add(1,[2],[1,2]) ?
29 4 Call: 2<4 ?
29 4 Exit: 2<4 ?
30 4 Call: arround(1,0,0,[1,2],4,2,1,_887) ?
31 5 Call: _914 is 0-1 ?
31 5 Exit: -1 is 0-1 ?
32 5 Call: _942 is 0+1 ?
32 5 Exit: 1 is 0+1 ?
33 5 Call: _970 is 0-1 ?
33 5 Exit: -1 is 0-1 ?
34 5 Call: _998 is 0+1 ?
34 5 Exit: 1 is 0+1 ?
35 5 Call: knight(_1030,_985,_986,0,0,_987) ?
35 5 Exit: knight(2,100,0,0,0,1) ?
36 5 Call: member1(2,[1,2]) ?
37 6 Call: 1\=2 ?
38 7 Call: 1=2 ?
38 7 Fail: 1=2 ?
37 6 Exit: 1\=2 ?
38 6 Call: member1(2,[2]) ?
39 7 Call: 2\=2 ?
40 8 Call: 2=2 ?
40 8 Exit: 2=2 ?
39 7 Fail: 2\=2 ?
38 6 Fail: member1(2,[2]) ?
36 5 Fail: member1(2,[1,2]) ?
35 5 Redo: knight(2,100,0,0,0,1) ?
35 5 Exit: knight(1,100,0,0,0,1) ?
36 5 Call: member1(1,[1,2]) ?
37 6 Call: 1\=1 ?
38 7 Call: 1=1 ?
38 7 Exit: 1=1 ?
37 6 Fail: 1\=1 ?
36 5 Fail: member1(1,[1,2]) ?
35 5 Redo: knight(1,100,0,0,0,1) ?
35 5 Fail: knight(_1018,_985,_986,0,0,_987) ?
35 5 Call: knight(_1030,_985,_986,-1,0,_987) ?
35 5 Fail: knight(_1018,_985,_986,-1,0,_987) ?
35 5 Call: knight(_1030,_985,_986,1,0,_987) ?
35 5 Fail: knight(_1018,_985,_986,1,0,_987) ?
35 5 Call: knight(_1030,_985,_986,0,-1,_987) ?
35 5 Fail: knight(_1018,_985,_986,0,-1,_987) ?
35 5 Call: knight(_1030,_985,_986,0,1,_987) ?
35 5 Exit: knight(2,100,55,0,1,1) ?
36 5 Call: member1(2,[1,2]) ?
37 6 Call: 1\=2 ?
38 7 Call: 1=2 ?
38 7 Fail: 1=2 ?
37 6 Exit: 1\=2 ?
38 6 Call: member1(2,[2]) ?
39 7 Call: 2\=2 ?
40 8 Call: 2=2 ?
40 8 Exit: 2=2 ?
39 7 Fail: 2\=2 ?
38 6 Fail: member1(2,[2]) ?
36 5 Fail: member1(2,[1,2]) ?
35 5 Redo: knight(2,100,55,0,1,1) ?
35 5 Exit: knight(2,100,0,0,1,1) ?
36 5 Call: member1(2,[1,2]) ?
37 6 Call: 1\=2 ?
38 7 Call: 1=2 ?
38 7 Fail: 1=2 ?
37 6 Exit: 1\=2 ?
38 6 Call: member1(2,[2]) ?
39 7 Call: 2\=2 ?
40 8 Call: 2=2 ?
40 8 Exit: 2=2 ?
39 7 Fail: 2\=2 ?
38 6 Fail: member1(2,[2]) ?
36 5 Fail: member1(2,[1,2]) ?
35 5 Redo: knight(2,100,0,0,1,1) ?
35 5 Fail: knight(_1018,_985,_986,0,1,_987) ?
35 5 Call: knight(_1030,_985,_986,-1,-1,_987) ?
35 5 Fail: knight(_1018,_985,_986,-1,-1,_987) ?
35 5 Call: knight(_1030,_985,_986,1,1,_987) ?
35 5 Fail: knight(_1018,_985,_986,1,1,_987) ?
35 5 Call: knight(_1030,_985,_986,-1,1,_987) ?
35 5 Fail: knight(_1018,_985,_986,-1,1,_987) ?
35 5 Call: knight(_1030,_985,_986,1,-1,_987) ?
35 5 Exit: knight(4,100,0,1,-1,1) ?
36 5 Call: member1(4,[1,2]) ?
37 6 Call: 1\=4 ?
38 7 Call: 1=4 ?
38 7 Fail: 1=4 ?
37 6 Exit: 1\=4 ?
38 6 Call: member1(4,[2]) ?
39 7 Call: 2\=4 ?
40 8 Call: 2=4 ?
40 8 Fail: 2=4 ?
39 7 Exit: 2\=4 ?
40 7 Call: member1(4,[]) ?
41 8 Call: 1==1 ?
41 8 Exit: 1==1 ?
40 7 Exit: member1(4,[]) ?
38 6 Exit: member1(4,[2]) ?
36 5 Exit: member1(4,[1,2]) ?
42 5 Call: _1224 is 2+1 ?
42 5 Exit: 3 is 2+1 ?
43 5 Call: add(4,[1,2],_1250) ?
43 5 Exit: add(4,[1,2],[4,1,2]) ?
44 5 Call: 3<4 ?
44 5 Exit: 3<4 ?
45 5 Call: arround(1,0,0,[4,1,2],4,3,1,_1308) ?
46 6 Call: _1335 is 0-1 ?
46 6 Exit: -1 is 0-1 ?
47 6 Call: _1363 is 0+1 ?
47 6 Exit: 1 is 0+1 ?
48 6 Call: _1391 is 0-1 ?
48 6 Exit: -1 is 0-1 ?
49 6 Call: _1419 is 0+1 ?
49 6 Exit: 1 is 0+1 ?
50 6 Call: knight(_1451,_1406,_1407,0,0,_1408) ?
50 6 Exit: knight(2,100,0,0,0,1) ?
51 6 Call: member1(2,[4,1,2]) ?
52 7 Call: 4\=2 ?
53 8 Call: 4=2 ?
53 8 Fail: 4=2 ?
52 7 Exit: 4\=2 ?
53 7 Call: member1(2,[1,2]) ?
54 8 Call: 1\=2 ?
55 9 Call: 1=2 ?
55 9 Fail: 1=2 ?
54 8 Exit: 1\=2 ?
55 8 Call: member1(2,[2]) ?
56 9 Call: 2\=2 ?
57 10 Call: 2=2 ?
57 10 Exit: 2=2 ?
56 9 Fail: 2\=2 ?
55 8 Fail: member1(2,[2]) ?
53 7 Fail: member1(2,[1,2]) ?
51 6 Fail: member1(2,[4,1,2]) ?
50 6 Redo: knight(2,100,0,0,0,1) ?
50 6 Exit: knight(1,100,0,0,0,1) ?
51 6 Call: member1(1,[4,1,2]) ?
52 7 Call: 4\=1 ?
53 8 Call: 4=1 ?
53 8 Fail: 4=1 ?
52 7 Exit: 4\=1 ?
53 7 Call: member1(1,[1,2]) ?
54 8 Call: 1\=1 ?
55 9 Call: 1=1 ?
55 9 Exit: 1=1 ?
54 8 Fail: 1\=1 ?
53 7 Fail: member1(1,[1,2]) ?
51 6 Fail: member1(1,[4,1,2]) ?
50 6 Redo: knight(1,100,0,0,0,1) ?
50 6 Fail: knight(_1439,_1406,_1407,0,0,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,-1,0,_1408) ?
50 6 Fail: knight(_1439,_1406,_1407,-1,0,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,1,0,_1408) ?
50 6 Fail: knight(_1439,_1406,_1407,1,0,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,0,-1,_1408) ?
50 6 Fail: knight(_1439,_1406,_1407,0,-1,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,0,1,_1408) ?
50 6 Exit: knight(2,100,55,0,1,1) ?
51 6 Call: member1(2,[4,1,2]) ?
52 7 Call: 4\=2 ?
53 8 Call: 4=2 ?
53 8 Fail: 4=2 ?
52 7 Exit: 4\=2 ?
53 7 Call: member1(2,[1,2]) ?
54 8 Call: 1\=2 ?
55 9 Call: 1=2 ?
55 9 Fail: 1=2 ?
54 8 Exit: 1\=2 ?
55 8 Call: member1(2,[2]) ?
56 9 Call: 2\=2 ?
57 10 Call: 2=2 ?
57 10 Exit: 2=2 ?
56 9 Fail: 2\=2 ?
55 8 Fail: member1(2,[2]) ?
53 7 Fail: member1(2,[1,2]) ?
51 6 Fail: member1(2,[4,1,2]) ?
50 6 Redo: knight(2,100,55,0,1,1) ?
50 6 Exit: knight(2,100,0,0,1,1) ?
51 6 Call: member1(2,[4,1,2]) ?
52 7 Call: 4\=2 ?
53 8 Call: 4=2 ?
53 8 Fail: 4=2 ?
52 7 Exit: 4\=2 ?
53 7 Call: member1(2,[1,2]) ?
54 8 Call: 1\=2 ?
55 9 Call: 1=2 ?
55 9 Fail: 1=2 ?
54 8 Exit: 1\=2 ?
55 8 Call: member1(2,[2]) ?
56 9 Call: 2\=2 ?
57 10 Call: 2=2 ?
57 10 Exit: 2=2 ?
56 9 Fail: 2\=2 ?
55 8 Fail: member1(2,[2]) ?
53 7 Fail: member1(2,[1,2]) ?
51 6 Fail: member1(2,[4,1,2]) ?
50 6 Redo: knight(2,100,0,0,1,1) ?
50 6 Fail: knight(_1439,_1406,_1407,0,1,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,-1,-1,_1408) ?
50 6 Fail: knight(_1439,_1406,_1407,-1,-1,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,1,1,_1408) ?
50 6 Fail: knight(_1439,_1406,_1407,1,1,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,-1,1,_1408) ?
50 6 Fail: knight(_1439,_1406,_1407,-1,1,_1408) ?
50 6 Call: knight(_1451,_1406,_1407,1,-1,_1408) ?
50 6 Exit: knight(4,100,0,1,-1,1) ?
51 6 Call: member1(4,[4,1,2]) ?
52 7 Call: 4\=4 ?
53 8 Call: 4=4 ?
53 8 Exit: 4=4 ?
52 7 Fail: 4\=4 ?
51 6 Fail: member1(4,[4,1,2]) ?
45 5 Fail: arround(1,0,0,[4,1,2],4,3,1,_1296) ?
44 5 Call: 3>=3 ?
44 5 Exit: 3>=3 ?
45 5 Call: go([4,1,2],3,4,1) ?
46 6 Call: movec([4,1,2],[4,1,2],3,0,1) ?
47 7 Call: knight(4,_1363,_1317,_1318,_1319,_1320) ?
47 7 Exit: knight(4,100,0,1,-1,1) ?
48 7 Call: 100<50 ?
48 7 Fail: 100<50 ?
48 7 Call: _1398 is 0 ?
48 7 Exit: 0 is 0 ?
49 7 Call: movec([4,1,2],[1,2],3,0,1) ?
50 8 Call: knight(1,_1458,_1412,_1413,_1414,_1415) ?
50 8 Exit: knight(1,100,0,0,0,1) ?
51 8 Call: 100<50 ?
51 8 Fail: 100<50 ?
51 8 Call: _1493 is 0 ?
51 8 Exit: 0 is 0 ?
52 8 Call: movec([4,1,2],[2],3,0,1) ?
53 9 Call: knight(2,_1553,_1507,_1508,_1509,_1510) ?
53 9 Exit: knight(2,100,55,0,1,1) ?
54 9 Call: 100<50 ?
54 9 Fail: 100<50 ?
54 9 Call: _1588 is 0 ?
54 9 Exit: 0 is 0 ?
55 9 Call: movec([4,1,2],[],3,0,1) ?
56 10 Call: 0>=3/2 ?
56 10 Fail: 0>=3/2 ?
56 10 Call: _1640 is 0 ?
56 10 Exit: 0 is 0 ?
57 10 Call: move([4,1,2],0,1) ?
58 11 Call: 0==1 ?
58 11 Fail: 0==1 ?
58 11 Call: moving([4,1,2],1) ?
59 12 Call: random(_1713) ?
59 12 Exit: random(0.4798583984375) ?
60 12 Call: _1743 is 0.4798583984375*100 ?
60 12 Exit: 47.98583984375 is 0.4798583984375*100 ?
61 12 Call: 47.98583984375=<25 ?
61 12 Fail: 47.98583984375=<25 ?
61 12 Call: 47.98583984375>25 ?
61 12 Exit: 47.98583984375>25 ?
62 12 Call: 47.98583984375=<50 ?
62 12 Exit: 47.98583984375=<50 ?
63 12 Call: movehy([4,1,2],1) ?
64 13 Call: knight(4,_1848,_1849,_1850,_1851,_1852) ?
64 13 Exit: knight(4,100,0,1,-1,1) ?
65 13 Call: _1886 is -1+1 ?
65 13 Exit: 0 is -1+1 ?
66 13 Call: show(4,1) ?
67 14 Call: knight(4,_1939,_1940,_1941,_1942,_1943) ?
67 14 Exit: knight(4,100,0,1,-1,1) ?
68 14 Call: write('Step #') ?
Step #
68 14 Exit: write('Step #') ?
69 14 Call: write(1) ?
1
69 14 Exit: write(1) ?
70 14 Call: nl ?
70 14 Exit: nl ?
71 14 Call: write('Knight #') ?
Knight #
71 14 Exit: write('Knight #') ?
72 14 Call: write(4) ?
4
72 14 Exit: write(4) ?
73 14 Call: nl ?
73 14 Exit: nl ?
74 14 Call: write('HP : ') ?
HP :
74 14 Exit: write('HP : ') ?
75 14 Call: write(100) ?
100
75 14 Exit: write(100) ?
76 14 Call: nl ?
76 14 Exit: nl ?
77 14 Call: write('XP : ') ?
XP :
77 14 Exit: write('XP : ') ?
78 14 Call: write(0) ?
0
78 14 Exit: write(0) ?
79 14 Call: nl ?
79 14 Exit: nl ?
80 14 Call: write('X : ') ?
X :
80 14 Exit: write('X : ') ?
81 14 Call: write(1) ?
1
81 14 Exit: write(1) ?
82 14 Call: nl ?
82 14 Exit: nl ?
83 14 Call: write('Y : ') ?
Y :
83 14 Exit: write('Y : ') ?
84 14 Call: write(-1) ?
-1
84 14 Exit: write(-1) ?
85 14 Call: nl ?
85 14 Exit: nl ?
86 14 Call: write('LVL : ') ?
LVL :
86 14 Exit: write('LVL : ') ?
87 14 Call: write(1) ?
1
87 14 Exit: write(1) ?
88 14 Call: nl ?
88 14 Exit: nl ?
66 13 Exit: show(4,1) ?
89 13 Call: retract(knight(4,100,0,1,-1,1)) ?
89 13 Exit: retract(knight(4,100,0,1,-1,1)) ?
90 13 Call: asserta(knight(4,100,0,1,0,1)) ?
90 13 Exit: asserta(knight(4,100,0,1,0,1)) ?
91 13 Call: act(4,100,0,1,0,1) ?
92 14 Call: random(_2564) ?
92 14 Exit: random(0.35028076171875) ?
93 14 Call: _2594 is 0.35028076171875*100 ?
93 14 Exit: 35.028076171875 is 0.35028076171875*100 ?
94 14 Call: 35.028076171875=<5 ?
94 14 Fail: 35.028076171875=<5 ?
94 14 Call: 35.028076171875>5 ?
94 14 Exit: 35.028076171875>5 ?
95 14 Call: 35.028076171875=<10 ?
95 14 Fail: 35.028076171875=<10 ?
94 14 Call: 35.0280 94 14 Exit: 35.028076171875>10 ?
1 14 Call: 35.028076171875=<20 ?
1 14 Fail: 35.028076171875=<20 ?
94 14 Call: 35.028076171875>20 ?
94 14 Exit: 35.028076171875>20 ?
95 14 Call: 35.028076171875=<50 ?
95 14 Exit: 35.028076171875=<50 ?
96 14 Call: write('Monster!') ?
Monster!
96 14 Exit: write('Monster!') ?
97 14 Call: nl ?
97 14 Exit: nl ?
98 14 Call: battlemonster(4,100,0,1,0,1) ?
99 15 Call: random(_2744) ?
99 15 Exit: random(0.89593505859375) ?
100 15 Call: _2774 is 0.89593505859375*100 ?
100 15 Exit: 89.593505859375 is 0.89593505859375*100 ?
101 15 Call: _2804 is 50+1 ?
101 15 Exit: 51 is 50+1 ?
102 15 Call: 51>80 ?
102 15 Fail: 51>80 ?
102 15 Call: 51=<80 ?
102 15 Exit: 51=<80 ?
103 15 Call: _2816 is 51 ?
103 15 Exit: 51 is 51 ?
104 15 Call: 89.593505859375=<51 ?
104 15 Fail: 89.593505859375=<51 ?
104 15 Call: knockedmonster(4,100,0,1,0,1) ?
105 16 Call: write('I am hited by monster!') ?
I am hited by monster!
105 16 Exit: write('I am hited by monster!') ?
106 16 Call: nl ?
106 16 Exit: nl ?
107 16 Call: random(_2953) ?
107 16 Exit: random(0.82281494140625) ?
108 16 Call: _2983 is 0.82281494140625*100 ?
108 16 Exit: 82.281494140625 is 0.82281494140625*100 ?
109 16 Call: 1>20 ?
109 16 Fail: 1>20 ?
109 16 Call: _3010 is 1 ?
109 16 Exit: 1 is 1 ?
110 16 Call: 82.281494140625=<20-1 ?
110 16 Fail: 82.281494140625=<20-1 ?
110 16 Call: 82.281494140625>=70-1 ?
110 16 Exit: 82.281494140625>=70-1 ?
111 16 Call: _3066 is 70-1 ?
111 16 Exit: 69 is 70-1 ?
112 16 Call: write(' Damage is -') ?
Damage is -
112 16 Exit: write(' Damage is -') ?
113 16 Call: write(69) ?
69
113 16 Exit: write(69) ?
114 16 Call: nl ?
114 16 Exit: nl ?
115 16 Call: 69=<100 ?
115 16 Exit: 69=<100 ?
116 16 Call: _3189 is 100-69 ?
116 16 Exit: 31 is 100-69 ?
117 16 Call: retract(knight(4,100,0,1,0,1)) ?
117 16 Exit: retract(knight(4,100,0,1,0,1)) ?
118 16 Call: asserta(knight(4,31,0,1,0,1)) ?
118 16 Exit: asserta(knight(4,31,0,1,0,1)) ?
119 16 Call: battlemonster(4,31,0,1,0,1) ?
120 17 Call: random(_3313) ?
120 17 Exit: random(0.74658203125) ?
121 17 Call: _3343 is 0.74658203125*100 ?
121 17 Exit: 74.658203125 is 0.74658203125*100 ?
122 17 Call: _3373 is 50+1 ?
122 17 Exit: 51 is 50+1 ?
123 17 Call: 51>80 ?
123 17 Fail: 51>80 ?
123 17 Call: 51=<80 ?
123 17 Exit: 51=<80 ?
124 17 Call: _3385 is 51 ?
124 17 Exit: 51 is 51 ?
125 17 Call: 74.658203125=<51 ?
125 17 Fail: 74.658203125=<51 ?
125 17 Call: knockedmonster(4,31,0,1,0,1) ?
126 18 Call: write('I am hited by monster!') ?
I am hited by monster!
126 18 Exit: write('I am hited by monster!') ?
127 18 Call: nl ?
127 18 Exit: nl ?
128 18 Call: random(_3522) ?
128 18 Exit: random(0.174102783203125) ?
129 18 Call: _3552 is 0.174102783203125*100 ?
129 18 Exit: 17.4102783203125 is 0.174102783203125*100 ?
130 18 Call: 1>20 ?
130 18 Fail: 1>20 ?
130 18 Call: _3579 is 1 ?
130 18 Exit: 1 is 1 ?
131 18 Call: 17.4102783203125=<20-1 ?
131 18 Exit: 17.4102783203125=<20-1 ?
132 18 Call: _3635 is 20-1 ?
132 18 Exit: 19 is 20-1 ?
133 18 Call: write(' Damage is -') ?
Damage is -
133 18 Exit: write(' Damage is -') ?
134 18 Call: write(19) ?
19
134 18 Exit: write(19) ?
135 18 Call: nl ?
135 18 Exit: nl ?
136 18 Call: 19=<31 ?
136 18 Exit: 19=<31 ?
137 18 Call: _3758 is 31-19 ?
137 18 Exit: 12 is 31-19 ?
138 18 Call: retract(knight(4,31,0,1,0,1)) ?
138 18 Exit: retract(knight(4,31,0,1,0,1)) ?
139 18 Call: asserta(knight(4,12,0,1,0,1)) ?
139 18 Exit: asserta(knight(4,12,0,1,0,1)) ?
140 18 Call: battlemonster(4,12,0,1,0,1) ?
141 19 Call: random(_3882) ?
141 19 Exit: random(0.858917236328125) ?
142 19 Call: _3912 is 0.858917236328125*100 ?
142 19 Exit: 85.8917236328125 is 0.858917236328125*100 ?
143 19 Call: _3942 is 50+1 ?
143 19 Exit: 51 is 50+1 ?
144 19 Call: 51>80 ?
144 19 Fail: 51>80 ?
144 19 Call: 51=<80 ?
144 19 Exit: 51=<80 ?
145 19 Call: _3954 is 51 ?
145 19 Exit: 51 is 51 ?
146 19 Call: 85.8917236328125=<51 ?
146 19 Fail: 85.8917236328125=<51 ?
146 19 Call: knockedmonster(4,12,0,1,0,1) ?
147 20 Call: write('I am hited by monster!') ?
I am hited by monster!
147 20 Exit: write('I am hited by monster!') ?
148 20 Call: nl ?
148 20 Exit: nl ?
149 20 Call: random(_4091) ?
149 20 Exit: random(0.710479736328125) ?
150 20 Call: _4121 is 0.710479736328125*100 ?
150 20 Exit: 71.0479736328125 is 0.710479736328125*100 ?
151 20 Call: 1>20 ?
151 20 Fail: 1>20 ?
151 20 Call: _4148 is 1 ?
151 20 Exit: 1 is 1 ?
152 20 Call: 71.0479736328125=<20-1 ?
152 20 Fail: 71.0479736328125=<20-1 ?
152 20 Call: 71.0479736328125>=70-1 ?
152 20 Exit: 71.0479736328125>=70-1 ?
153 20 Call: _4204 is 70-1 ?
153 20 Exit: 69 is 70-1 ?
154 20 Call: write(' Damage is -') ?
Damage is -
154 20 Exit: write(' Damage is -') ?
155 20 Call: write(69) ?
69
155 20 Exit: write(69) ?
156 20 Call: nl ?
156 20 Exit: nl ?
157 20 Call: 69=<12 ?
157 20 Fail: 69=<12 ?
157 20 Call: _4299 is 0 ?
157 20 Exit: 0 is 0 ?
158 20 Call: killed(4,12,0,1,0,1) ?
159 21 Call: write('I am killed!') ?
I am killed!
159 21 Exit: write('I am killed!') ?
160 21 Call: nl ?
160 21 Exit: nl ?
161 21 Call: _4404 is 0-1*5 ?
161 21 Exit: -5 is 0-1*5 ?
162 21 Call: _4429 is 100 ?
162 21 Exit: 100 is 100 ?
163 21 Call: retract(knight(4,12,0,1,0,1)) ?
163 21 Exit: retract(knight(4,12,0,1,0,1)) ?
164 21 Call: asserta(knight(4,100,-5,0,0,1)) ?
164 21 Exit: asserta(knight(4,100,-5,0,0,1)) ?
165 21 Call: dlvl(4,100,-5,0,0,1) ?
166 22 Call: -5<0 ?
166 22 Exit: -5<0 ?
167 22 Call: _4579 is 0 ?
167 22 Exit: 0 is 0 ?
168 22 Call: _4604 is 1 ?
168 22 Exit: 1 is 1 ?
169 22 Call: retract(knight(4,100,-5,0,0,1)) ?
169 22 Exit: retract(knight(4,100,-5,0,0,1)) ?
170 22 Call: asserta(knight(4,100,0,0,0,1)) ?
170 22 Exit: asserta(knight(4,100,0,0,0,1)) ?
165 21 Exit: dlvl(4,100,-5,0,0,1) ?
158 20 Exit: killed(4,12,0,1,0,1) ?
146 19 Exit: knockedmonster(4,12,0,1,0,1) ?
140 18 Exit: battlemonster(4,12,0,1,0,1) ?
125 17 Exit: knockedmonster(4,31,0,1,0,1) ?
119 16 Exit: battlemonster(4,31,0,1,0,1) ?
104 15 Exit: knockedmonster(4,100,0,1,0,1) ?
98 14 Exit: battlemonster(4,100,0,1,0,1) ?
91 13 Exit: act(4,100,0,1,0,1) ?
171 13 Call: show(4,1) ?
172 14 Call: knight(4,_4738,_4739,_4740,_4741,_4742) ?
172 14 Exit: knight(4,100,0,0,0,1) ?
173 14 Call: write('Step #') ?
Step #
173 14 Exit: write('Step #') ?
174 14 Call: write(1) ?
1
174 14 Exit: write(1) ?
175 14 Call: nl ?
175 14 Exit: nl ?
176 14 Call: write('Knight #') ?
Knight #
176 14 Exit: write('Knight #') ?
177 14 Call: write(4) ?
4
177 14 Exit: write(4) ?
178 14 Call: nl ?
178 14 Exit: nl ?
179 14 Call: write('HP : ') ?
HP :
179 14 Exit: write('HP : ') ?
180 14 Call: write(100) ?
100
180 14 Exit: write(100) ?
181 14 Call: nl ?
181 14 Exit: nl ?
182 14 Call: write('XP : ') ?
XP :
182 14 Exit: write('XP : ') ?
183 14 Call: write(0) ?
0
183 14 Exit: write(0) ?
184 14 Call: nl ?
184 14 Exit: nl ?
185 14 Call: write('X : ') ?
X :
185 14 Exit: write('X : ') ?
186 14 Call: write(0) ?
0
186 14 Exit: write(0) ?
187 14 Call: nl ?
187 14 Exit: nl ?
188 14 Call: write('Y : ') ?
Y :
188 14 Exit: write('Y : ') ?
189 14 Call: write(0) ?
0
189 14 Exit: write(0) ?
190 14 Call: nl ?
190 14 Exit: nl ?
191 14 Call: write('LVL : ') ?
LVL :
191 14 Exit: write('LVL : ') ?
192 14 Call: write(1) ?
1
192 14 Exit: write(1) ?
193 14 Call: nl ?
193 14 Exit: nl ?
171 13 Exit: show(4,1) ?
194 13 Call: movehy([1,2],1) ?
195 14 Call: knight(1,_5292,_5293,_5294,_5295,_5296) ?
195 14 Exit: knight(1,100,0,0,0,1) ?
196 14 Call: _5330 is 0+1 ?
196 14 Exit: 1 is 0+1 ?
197 14 Call: show(1,1) ?
198 15 Call: knight(1,_5383,_5384,_5385,_5386,_5387) ?