implement main open core constants className = "com/visual-prolog/main". classVersion = "$JustDate: $$Revision: $". class facts kletki:(unsigned32 Nomer_kletki,unsigned8 Chto_v_kletke, integer X,integer Y,integer Imeet_koloriy,integer Kogda_poslediy_raz_hodilo). pole:(integer X,integer Y). t:integer:=0. class facts shiftix:(integer X). shiftiy:(integer Y). dobicha:(unsigned32 N,unsigned8 Chvk,integer X,integer Y). trava:(unsigned32 N,unsigned8 Chvk,integer X,integer Y). pusto:(integer X,integer Y). class facts -harakteristiki harakteristiki_togo_chto_v_kletke:(unsigned8 Chto_v_kletke, /*внимание! хищники всегда красные(0..39;199..239), травоядные синие(119..198), трава зелёная(40..118), а всякий рельеф (240..255)*/ integer Vrema_na_dvigenie_na_odu_kletku_vpered, integer Virabativaemoe_ili_pogloschaemoe_kolichestvo_koloriy_za1tik,integer Maksimalniy_zapas_koloriy,integer Koloriynost_esli_ego_edat). class predicates r1: (inputStream)determ. shag:(). shag_rab:()nondeterm. ogladetsa:(integer X,integer Y)nondeterm(i,i). ohota:(unsigned32 N,unsigned8 Chvk,integer X,integer Y,integer Ik,integer MaxKol)nondeterm(i,i,i,i,i,i). vipas:(unsigned32 N,unsigned8 Chvk,integer X,integer Y,integer Ik,integer MaxKol)nondeterm(i,i,i,i,i,i). poyti:(unsigned32 N,unsigned8 Chvk,integer X,integer Y,integer Ik)nondeterm(i,i,i,i,i). smert:(unsigned32 N,unsigned8 Chvk,integer Ik)nondeterm(i,i,i). viz:(integer X,integer Y,unsigned8 Tip,integer Koloriy)nondeterm(i,i,o,o) language stdcall as "viz". zagruzka_pola:(unsigned32 Nomer_kletki,unsigned8 Chto_v_kletke, integer X,integer Y, integer Imeet_koloriy)nondeterm(i,i,i,i,i) language stdcall as "zagruzka_pola". zagruzka_harakteristik:()nondeterm () language stdcall as "zagruzka_harakteristik". clauses classInfo(className, classVersion). shiftix(-1). shiftix(0). shiftix(1). shiftiy(-1). shiftiy(0). shiftiy(1). %процедура выполняющая просчёт шага shag():- shag_rab(), t:=t+1,!; t:=t+1 . ogladetsa(X,Y):- ( retract(pusto(_,_)),fail; retract(trava(_,_,_,_)),fail; retract(dobicha(_,_,_,_)),fail ) ; (%1111111 shiftix(Xshift),shiftix(Yshift),%нам надо перебрать все клетки в окрестности (%xxxxxxxx if((Xshift=Yshift) and (Yshift=0)),! then%кроме той на которой стоим fail else (%22222 pole(X+Xshift,Y+Yshift), (%aaaaaaaaaa not(kletki(N1,Chvk1,X+Xshift,Y+Yshift,_,_)), assert(pusto(X+Xshift,Y+Yshift));%значит запомним что там пусто kletki(N1,Chvk1,X+Xshift,Y+Yshift,_,_), (%33333 (Chvk1>=119,Chvk1<=198),%если там травоядное которыми питаются хищники assert(dobicha(N1,Chvk1,X+Xshift,Y+Yshift));%значит запомним что там добыча (Chvk1>=40,Chvk1<=118),%если там трава assert(trava(N1,Chvk1,X+Xshift,Y+Yshift))%значит запомним что там трава )%33333 )%aaaaaaaaaaa )%22222 end if )%xxxxxxxx , fail )%11111111 ; succeed() . poyti(N,Chvk,X,Y,Ik):- (%111111 math::randomInit(t), ( pusto(Xd,Yd),%проверим есть ли незанятые клетки retract(pusto(Xd,Yd)),%даже если не удастся буду пытатся уже на других ( Test=math::random(2),%а идти хочеся? Test=1,%ну а если удалось retract(kletki(N,_,_,_,_,_)),%значит там где я был меня не будет assert(kletki(N,Chvk,Xd,Yd,Ik,t)),!%и перейду на новое место ) , fail,! ) ; ( trava(N1,Chvk1,Xd,Yd),%проверим есть ли клетки с травой retract(trava(N1,Chvk1,Xd,Yd)),%даже если не удастся буду пытатся уже на других ( Test=math::random(2),%или может потраве? Test=1,%ну а если удалось retract(kletki(N,_,_,_,_,_)), kletki(N1,Chvk1,Xd,Yd,Kolx,Lt1), assert(kletki(N1,Chvk1,X,Y,Kolx,Lt1)),%на той клетке где стояли мы теперь то что было там куда мы шли retract(kletki(N1,_,_,_,_,_)), assert(kletki(N,Chvk,Xd,Yd,Ik,t)),!%вот мы и перешли ) , fail,! ) , retract(kletki(N,_,_,_,_,_)), assert(kletki(N,Chvk,X,Y,Ik,t)), succeed()%в крайнем случае просто ничего не будем менять )%111111 . ohota(N,Chvk,X,Y,Ik,MaxKol):- math::randomInit(t), ogladetsa(X,Y); (%111111 (%222222222222 dobicha(N1,Chvk1,Xd,Yd), (%333333333 retract(dobicha(N1,Chvk1,Xd,Yd)),%даже если не удастся буду пытатся уже на других Test=math::random(2),%а удалась ли охота Test=1,%ну а если удалось retract(kletki(N1,_,_,_,_,_)),%значит сожру harakteristiki_togo_chto_v_kletke(Chvk1,_,_,_,Koloriynost),%аш вот стока retract(kletki(N,_,_,_,_,_)),%когда приду к добыче ( Maxkol<Ik+Koloriynost, Kol1=MaxKol,!;%а шо нэ зъим то панадкусываю Kol1=Ik+Koloriynost ) , assert(kletki(N,Chvk,Xd,Yd,Kol1,t))%и останусь там стоять )%33333333 %, %fail )%222222222222 ,!; poyti(N,Chvk,X,Y,Ik)%ну а если совсем непруха на охоте то просто перейду на свободную клетку )%111111 . vipas(N,Chvk,X,Y,Ik,MaxKol):- %math::randomInit(X), (%111111 ogladetsa(X,Y),!, Test=math::random(2),%как насчёт поесть? ( trava(N1,Chvk1,Xd,Yd), retract(trava(N1,Chvk1,Xd,Yd)),%даже если не удастся буду пытатся уже на других Test=1,%ну а если удалось retract(kletki(N1,_,_,_,_,_)),%значит жуём траву harakteristiki_togo_chto_v_kletke(Chvk1,_,_,_,Koloriynost),%аш вот стока retract(kletki(N,_,_,_,_,_)),%пучка больше нет ( Maxkol<Ik+Koloriynost, Kol1=MaxKol,!;%а шо нэ зъим то панадкусываю Kol1=Ik+Koloriynost ) , assert(kletki(N,Chvk,Xd,Yd,Kol1,t))%и останусь там стоять ) , fail,!; poyti(N,Chvk,X,Y,Ik)%ну если жрать неахота то прогуляюсь )%111111 . smert(N,Chvk,Ik):- not((Chvk>=40,Chvk<=118)/*;(Chvk>=240,Chvk<=255)*/),%если не трава Ik<=0,%а не пора ли сдохнуть от голода retract(kletki(N,_,_,_,_,_)),!%ну вот и дохни . %shag_rab(N):- %not(kletki(N,_,_,_,_,_)),! %. shag_rab():- %math::randomInit(123),%инициализировать рандом kletki(N,Chvk,X,Y,Kol,Lt), harakteristiki_togo_chto_v_kletke(Chvk,Vndn1kv,Kzt,MaxKol,_),%загрузили содержимое клетки и его характеристики Kol1=Kol+Kzt, (%111111111111111 not(smert(N,Chvk,Kol1)), Vndn1kv>0,%эта хрень в клетке ходить умеет? math::abs(t-Lt)>=Vndn1kv,%а ей сейчас пора ходить? %then (%222222222222 ( (Chvk>=0,Chvk<=39); (Chvk>=199,Chvk<=239) ),%если хищник ohota(N,Chvk,X,Y,Kol1,MaxKol),!;%попробуем поохотиться (Chvk>=119,Chvk<=198),%если там травоядное vipas(N,Chvk,X,Y,Kol1,MaxKol),!%попробуем попастись )%222222222222 )%111111111111 , fail; succeed() . %конец процедуры выполняющей просчёт шага %math::random(2)=1, %процедура выводящая графику на отрисовку viz(X,Y,Tip,Koloriy):- %Strout=0x01990199 kletki(NomK,Tip,X,Y,Kol,_), harakteristiki_togo_chto_v_kletke(Tip,_,_,MaxKol,_), Koloriy=math::round(Kol/(Maxkol/240)),!; pole(X,Y), Tip=255, Koloriy=0,!; Tip=255, Koloriy=0, X<0, Y<0, shag(),!; Tip=255, Koloriy=0 . % конец процедуры выводящей графику на отрисовку %проседура грузящая поле на котором живут клетки zagruzka_pola(N,ChVK,X,Y,Ik):- harakteristiki_togo_chto_v_kletke(Chvk,_,_,MaxKol,_), Ikr=math::round((Maxkol/240)*Ik), assert(kletki(N,ChVK,X,Y,Ikr,0)), assert(pole(X,Y)), !; assert(pole(X,Y)) . %конец проседуры грузящей поле на котором живут клетки %проседура грузящая характеристики для каждого встечающегося в начальных данных цвета из файла "harakteristiki.txt" zagruzka_harakteristik():- %console::init(), StandartInput=stdio::getInputStream(), In=inputStream_file::openFile8("harakteristiki.txt"), r1(In), %file::save("harakteristikiPr.txt",harakteristiki,false()) math::randomInit(123456789) . r1(In):-In:endOfStream(),!. r1(In):- S=In:readLine(), string::fronttoken(S,Sa,Sr), string::fronttoken(Sr,Sa1t,Sr1), ( Sa1t="-", string::fronttoken(Sr1,St,Sr1x), Sa1=string::concat(Sa1t,St),!; Sa1=Sa1t, Sr1x=Sr1 ) , string::fronttoken(Sr1x,Sa2t,Sr2), ( Sa2t="-", string::fronttoken(Sr2,St1,Sr2x), Sa2=string::concat(Sa2t,St1),!; Sa2=Sa2t, Sr2x=Sr2 ) , string::fronttoken(Sr2x,Sa3t,Sr3), ( Sa3t="-", string::fronttoken(Sr3,St4,Sr3x), Sa3=string::concat(Sa3t,St4),!; Sa3=Sa3t, Sr3x=Sr3 ) , string::fronttoken(Sr3x,Sa4t,Sr4), ( Sa4t="-", string::fronttoken(Sr3,St2,Sr4x), Sa4=string::concat(Sa4t,St2),!; Sa4=Sa4t, Sr4x=Sr4 ) , assert(harakteristiki_togo_chto_v_kletke(math::tryToUnsigned(Sa),math::tryToInteger(Sa1),math::tryToInteger(Sa2),math::tryToInteger(Sa3), math::tryToInteger(Sa4))), r1(In) . %конец проседуры грузящей характеристики clauses run():- console::init(), zagruzka_harakteristik(), zagruzka_pola(1,1,0,0,240), zagruzka_pola(2,130,0,1,240), zagruzka_pola(3,255,1,0,240), zagruzka_pola(4,255,1,1,240), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(-1,-1,_,_), viz(0,0,_,_), viz(0,1,_,_), viz(1,1,_,_), !; succeed(). % place your own code here end implement main goal mainExe::run(main::run).