; definicija igralnih stopenj make "stopnje [ ; 1. stopnja [[[0 7] [1 7] [2 7] [3 7] [4 7] [11 7] [12 7] [13 7] [14 7]] ;zidovi [[1 13] [13 1]]] ;cilji ; 2. stopnja [[[5 8] [5 7] [6 7] [7 7] [8 7] [9 7] [9 8] [7 6] [7 5] [7 4] [7 3] [7 2] [7 1] [7 0]] ;zidovi [[6 8] [7 8] [8 8]]] ;cilji ; 3. stopnja [[[0 7] [1 7] [2 7] [4 7] [5 7] [6 7] [7 7] [8 7] [9 7] [10 7] [12 7] [13 7] [14 7] [7 0] [7 1] [7 2] [7 4] [7 5] [7 6] [7 7] [7 8] [7 9] [7 10] [7 12] [7 13] [7 14]] ;zidovi [[3 3] [11 3] [3 11] [11 11]]] ;cilji ; 4. stopnja [[[0 7] [2 7] [3 7] [4 7] [5 7] [6 7] [7 7] [8 7] [9 7] [10 7] [11 7] [12 7] [14 7] [7 6] [7 5] [7 4] [7 3] [7 2] [7 1] [7 0] [4 8] [4 9] [4 10] [4 12] [4 13] [4 14] [10 8] [10 9] [10 10] [10 12] [10 13] [10 14]] [[3 3] [11 3] [1 13] [13 13] [7 9]]] ;cilji ] ; ----- DIALOGI ----- ; -- nastavitve -- to dialog_nastavitve dialogcreate "root "wnd_nastavitve "Nastavitve 20 20 185 110 [dialog_nastavitve_nastavi] end to dialog_nastavitve_nastavi staticcreate "wnd_nastavitve "static1 [Izberi stopnjo:] 5 5 90 10 groupboxcreate "wnd_nastavitve "group_stopnja 5 12 90 52 radiobuttoncreate "wnd_nastavitve "group_stopnja "rbtn_stopnja1 [1. stopnja (2 paketa)] 10 20 80 10 radiobuttoncreate "wnd_nastavitve "group_stopnja "rbtn_stopnja2 [2. stopnja (3 paketi)] 10 30 80 10 radiobuttoncreate "wnd_nastavitve "group_stopnja "rbtn_stopnja3 [3. stopnja (4 paketi)] 10 40 80 10 radiobuttoncreate "wnd_nastavitve "group_stopnja "rbtn_stopnja4 [4. stopnja (5 paketov)] 10 50 80 10 if equalp :stopnja 1 [radiobuttonset "rbtn_stopnja1 "true] if equalp :stopnja 2 [radiobuttonset "rbtn_stopnja2 "true] if equalp :stopnja 3 [radiobuttonset "rbtn_stopnja3 "true] if equalp :stopnja 4 [radiobuttonset "rbtn_stopnja4 "true] staticcreate "wnd_nastavitve "static2 [Izberi težavnost:] 100 5 75 10 groupboxcreate "wnd_nastavitve "group_tezavnost 100 12 75 52 radiobuttoncreate "wnd_nastavitve "group_tezavnost "rbtn_tezavnost1 [Števila do 20] 105 20 65 10 radiobuttoncreate "wnd_nastavitve "group_tezavnost "rbtn_tezavnost2 [Števila do 100] 105 30 65 10 radiobuttoncreate "wnd_nastavitve "group_tezavnost "rbtn_tezavnost3 [Števila do 500] 105 40 65 10 radiobuttoncreate "wnd_nastavitve "group_tezavnost "rbtn_tezavnost4 [Števila do 1000] 105 50 65 10 if equalp :tezavnost 1 [radiobuttonset "rbtn_tezavnost1 "true] if equalp :tezavnost 2 [radiobuttonset "rbtn_tezavnost2 "true] if equalp :tezavnost 3 [radiobuttonset "rbtn_tezavnost3 "true] if equalp :tezavnost 4 [radiobuttonset "rbtn_tezavnost4 "true] buttoncreate "wnd_nastavitve "btn_vredu "Vredu 45 75 35 15 [nastavitve_potrdi] buttoncreate "wnd_nastavitve "btn_preklici "Prekliči 100 75 35 15 [dialogdelete "wnd_nastavitve] end to nastavitve_potrdi if radiobuttonget "rbtn_stopnja1 [make "stopnja 1] if radiobuttonget "rbtn_stopnja2 [make "stopnja 2] if radiobuttonget "rbtn_stopnja3 [make "stopnja 3] if radiobuttonget "rbtn_stopnja4 [make "stopnja 4] if radiobuttonget "rbtn_tezavnost1 [make "tezavnost 1] if radiobuttonget "rbtn_tezavnost2 [make "tezavnost 2] if radiobuttonget "rbtn_tezavnost3 [make "tezavnost 3] if radiobuttonget "rbtn_tezavnost4 [make "tezavnost 4] dialogdelete "wnd_nastavitve make "zamenjaj "true end ; -- nadzorna plosca -- to nadzorna_plosca windowcreate "root "wnd_navigator [Nadzorna plošča] 10 10 100 170 [] buttoncreate "wnd_navigator "btn_gor "GOR 35 5 30 30 [make "tipka 56 akcija_tipka] buttoncreate "wnd_navigator "btn_levo "LEVO 5 35 30 30 [make "tipka 52 akcija_tipka] buttoncreate "wnd_navigator "btn_desno "DESNO 65 35 30 30 [make "tipka 54 akcija_tipka] buttoncreate "wnd_navigator "btn_dol "DOL 35 65 30 30 [make "tipka 50 akcija_tipka] buttoncreate "wnd_navigator "btn_ponovi [Ponovi stopnjo] 10 100 80 12 [make "tipka 112 akcija_tipka] buttoncreate "wnd_navigator "btn_nastavitve [Nastavitve] 10 113 80 12 [make "tipka 110 akcija_tipka] buttoncreate "wnd_navigator "btn_pomoc [Pomoč] 10 126 80 12 [winhelp "prafaktorji] buttoncreate "wnd_navigator "btn_izhod [Izhod] 10 139 80 12 [windowdelete "wnd_navigator make "tipka 120 akcija_tipka] buttoncreate "wnd_navigator "btn_x [x] 87 0 10 10 [windowdelete "wnd_navigator make "nadzornaplosca_odprta "false] make "nadzornaplosca_odprta "true end ; ----- INICIALIZACIJSKE PROCEDURE ----- ;nalozi slike in pripravi ostale parametre to inicializacija setpencolor [0 0 0] setpensize [1 1] pu ht bitload "prafaktorji.bmp for [i 0 7 1][ setbitindex :i bitcut 30 30 rt 90 fd 30 lt 90 ] cs ;indeksi slik make "IMG_PRAZNO 0 make "IMG_ZID 1 make "IMG_PRAPAKET 2 make "IMG_PAKET 3 make "IMG_CILJ 4 make "IMG_KONEC 5 make "IMG_MOZIC 6 make "IMG_MOZIC_CILJ 7 make "IMG_BACKUP 100 ;ostale lastnosti make "PSIZEX 15 ;velikost igralne povrsine make "PSIZEY 15 end ;narise igralno povrsino to igralna_povrsina setscreencolor [0 0 0] pu ;narisemo zid okoli polja setbitindex 1 bk 250 lt 90 fd 250 rt 90 repeat 17 [bitpaste fd 30] bk 30 rt 90 fd 30 repeat 16 [bitpaste fd 30] bk 30 rt 90 fd 30 repeat 16 [bitpaste fd 30] bk 30 rt 90 fd 30 repeat 15 [bitpaste fd 30] ;narisemo notranjost setbitindex 0 bk 30 rt 90 fd 30 repeat 15 [ repeat 15 [bitpaste fd 30] rt 90 fd 30 lt 90 bk 450 ] ;zelva v izhodisce bk 1 lt 90 fd 450 rt 90 fd 1 end ;zbrise ekran in nastavi privzete lastnosti to ocisti_graficno_okno cs setscreencolor [255 255 255] setpencolor [0 0 0] setpensize [1 1] pd st end ; ----- PROCEDURE ZA DELO Z IGRALNIMI POLJI ----- ; polje (array PSIZEX PSIZEY) ; format vrednosti: AaaaBbbb ; A - tip tal ; aaa - vsebina tal ; B - objekt ; bbb - vsebina objekta ; nabor vrednosti A: ; 0 - prazna tla ; 1 - cilj ; nabor vrednosti B: ; 0 - prosto polje ; 1 - zid ; 2 - prapaket ; 3 - sestavljeni paket ; 4 - dokoncan paket ;vrne true, ce sta koordinati x in y znotraj ustreznih mej polja to znotraj_meja :x :y if greaterp :x :PSIZEX-1 [output "false] if lessp :x 0 [output "false] if greaterp :y :PSIZEY-1 [output "false] if lessp :y 0 [output "false] output "true end ;zgradi prazno/izprazni igralno polje to ocisti_polja make "polje (array :PSIZEY 0) for [y 0 :PSIZEY-1 1][ make "vrstica (array :PSIZEX 0) for [x 0 :PSIZEX-1 1] [setitem :x :vrstica 0] setitem :y :polje :vrstica ] ;zgradi backup polje make "polje_backup (array :PSIZEY 0) for [y 0 :PSIZEY-1 1][ make "vrstica (array :PSIZEX 0) setitem :y :polje_backup :vrstica ] end ;na pozicijo s koordinatama x,y narise sliko z indeksom image_idx to risi_polje :x :y :image_idx fd :y*30 rt 90 fd :x*30 setbitindex :image_idx bitpaste bk :x*30 lt 90 bk :y*30 end ;cez sliko zapise se stevilo to risi_polje_ex :x :y :image_idx :stevilo setlabelfont [[Arial] -15 0 0 900 0 0 0 0 900 900 900 0] setpencolor [0 0 255] make "size labelsize :stevilo make "sizex item 1 :size make "sizey item 2 :size fd :y*30 rt 90 fd :x*30 setbitindex :image_idx bitpaste lt 90 fd 14+:sizey/2 rt 90 fd 15-:sizex/2 label :stevilo bk 15-:sizex/2 lt 90 bk 14+:sizey/2 rt 90 bk :x*30 lt 90 bk :y*30 end ;v tabelo polje na mesto (x,y) zapise vrednost :idx to postavi_polje :x :y :idx if not (znotraj_meja :x :y) [stop] make "vrstica item :y :polje setitem :x :vrstica :idx setitem :y :polje :vrstica end ;vrne (x,y) element v tabeli polje to beri_polje :x :y if not (znotraj_meja :x :y) [output 1000] make "vrstica item :y :polje output item :x :vrstica end ;na polje nakljucno postavi elemente to nastavi_elemente :postavitev :max_stevilo make "zidovi item 1 :postavitev make "cilji item 2 :postavitev generiraj_pakete count :cilji :max_stevilo ;postavi ciljna polja make "cnt count :cilji for [i 1 :cnt 1] [ make "x item 1 (item :i :cilji) make "y item 2 (item :i :cilji) postavi_polje :x :y (1000+(item :i :produkt_grupe))*10000 risi_polje_ex :x :y :IMG_CILJ item :i :produkt_grupe ] ;postavi zidove make "cnt count :zidovi for [i 1 :cnt 1] [ make "x item 1 (item :i :zidovi) make "y item 2 (item :i :zidovi) postavi_polje :x :y 1000 risi_polje :x :y :IMG_ZID ] ;postavi pakete make "rnd_x 100 make "rnd_y 100 make "st_paketov count :paketi for [paket_idx 1 :st_paketov 1] [ while [not primerno_prosto :rnd_x :rnd_y] [ make "rnd_x random :PSIZEX make "rnd_y random :PSIZEY ] make "vsebina (item :paket_idx :paketi)+2000 postavi_polje :rnd_x :rnd_y :vsebina risi_polje_ex :rnd_x :rnd_y :IMG_PRAPAKET (item :paket_idx :paketi) ] ;postavi mozica make "rnd_x random :PSIZEX make "rnd_y random :PSIZEY while [not equalp (beri_polje :rnd_x :rnd_y) 0] [ make "rnd_x random :PSIZEX make "rnd_y random :PSIZEY ] make "mozic_x :rnd_x make "mozic_y :rnd_y risi_polje :mozic_x :mozic_y :IMG_MOZIC ;shrani narisano sliko polja (sliko potrebujemo v primeru, da stopnjo ponovimo) setbitindex :IMG_BACKUP bitcopy :PSIZEX*30 :PSIZEY*30 end ;vrne true, ce je polje prosto ter okoli njega dovolj prostora to primerno_prosto :x :y if (not znotraj_meja :x :y) [output "false] for [i -1 1 1] [ for [j -1 1 1] [ if not equalp (beri_polje :x+:i :y+:j) 0 [output "false] ] ] output "true end ;vrne indeks ustrezne slike za polje x,y to ustrezna_slika :x :y make "vred beri_polje :x :y make "tip_tal int quotient :vred 10000000 make "tip_obj int quotient (remainder :vred 10000) 1000 ifelse equalp :tip_obj 0 [ ;ni objekta ifelse equalp :tip_tal 0 [output :IMG_PRAZNO] [output :IMG_CILJ] ][ if equalp :tip_obj 1 [output :IMG_ZID] if equalp :tip_obj 2 [output :IMG_PRAPAKET] if equalp :tip_obj 3 [output :IMG_PAKET] if equalp :tip_obj 4 [output :IMG_KONEC] ] end ;na ekran narise sliko polja glede na vrednosti v tabeli polje to kopiraj_polje :source :destination for [y 0 :PSIZEY-1 1][ for [x 0 :PSIZEX-1 1][ make "vrstica item :y :source make "element item :x :vrstica make "vrstica item :y :destination setitem :x :vrstica :element setitem :y :destination :vrstica ] ] end ; ----- MATEMATICNE PROCEDURE ----- ;najde prastevila do max - po zagonu procedure imamo na voljo tabeli ;sito - true/false za vsako stevilo do max ;prastevila - seznam prastevil to najdi_prastevila :max make "sito (array :max 1) for [i 1 :max 1] [setitem :i :sito "true] setitem 1 :sito "false ;precrtamo 1 make "konec "false ;ko ni vec precrtanih stevil, koncamo preiskovanje make "st 1 ;trenutno stevilo while [not :konec] [ make "nasel "false while [and (not :konec) (not :nasel)] [ ;poiscemo prvo neprecrtano stevilo make "st :st+1 ifelse greaterp :st :max [make "konec "true] ;prisli smo do konca [if item :st :sito [make "nasel "true]] ] make "faktor 2 ;faktor, s katerim mnozimo stevilo make "vsi_precrtani "false while [and (not :konec) (not :vsi_precrtani)] [ ;skozi vso sito po produktih ifelse greaterp :st*:faktor :max [make "vsi_precrtani "true] [setitem :st*:faktor :sito "false] ;precrtamo produkt make "faktor :faktor+1; ] ] ;poberemo neprecrtana stevila (prastevila) iz sita make "count 0 for [i 1 :max 1] [if item :i :sito [make "count :count+1]] ;prestejemo stevila make "prastevila (array :count 1) make "idx 0 for [i 1 :max 1] [ if item :i :sito [ make "idx :idx+1 setitem :idx :prastevila :i ] ] end ;razbije stevilo na prafaktorje in vrne tabelo prafaktorjev to razbij_stevilo :stevilo make "st :stevilo make "pralist [] make "pra_idx 1 while [greaterp :st 1] [ make "pra item :pra_idx :prastevila ifelse equalp (remainder :st :pra) 0 [ ;nasli smo prakaktor push "pralist :pra make "st quotient :st :pra make "pra_idx 1 ] [make "pra_idx :pra_idx+1] ;nismo nasli, naslednji prafaktor ] output :pralist end ;nakljucno izbere prafaktorje in sestavljena stevila ;nakljucno izberemo 4 stevila in jih razbijemo na prafaktorje ;rezultat: produkt_grupe, paketi, dokoncani_paketi to generiraj_pakete :st_paketov :max_stevilo make "produkt_grupe (array :st_paketov 1) make "paketi [] make "dokoncani_paketi [] najdi_prastevila :max_stevilo for [grupa 1 :st_paketov 1] [ ;nakljucno stevilo make "rnd_stevilo 2 while [memberp :rnd_stevilo :prastevila] ;vsaj dva prafaktorja [make "rnd_stevilo (random :max_stevilo-2)+2] setitem :grupa :produkt_grupe :rnd_stevilo make "prafak razbij_stevilo :rnd_stevilo while [greaterp (count :prafak) 0] [ make "el pop "prafak push "paketi :el ] ] end; ; ----- RUNTIME ----- to akcija_tipka if or (equalp :tipka 110) (equalp :tipka 78) [ ;tipka n - nastavitve dialog_nastavitve ] if or (equalp :tipka 107) (equalp :tipka 75) [ ;tipka k - nadzorna plosca if not :nadzornaplosca_odprta [nadzorna_plosca] ] if or (equalp :tipka 120) (equalp :tipka 88) [ ;tipka x - konec igre make "izhod "true ] if or (equalp :tipka 112) (equalp :tipka 80) [ ;tipka p - ponovi stopnjo ;postavimo spremenljivke na vrednosti kot so bile na zacetku stopnje kopiraj_polje :polje_backup :polje make "mozic_x :mozic_x_backup make "mozic_y :mozic_y_backup make "dokoncani_paketi [] ;narisemo sliko igralne povrsine, kot je bila na zacetku stopnje setbitindex :IMG_BACKUP bitpaste ] make "dx 0 make "dy 0 if equalp :tipka 52 [make "dx -1] ;tipka 4 - levo if equalp :tipka 54 [make "dx 1] ;tipka 6 - desno if equalp :tipka 56 [make "dy 1] ;tipka 8 - gor if equalp :tipka 50 [make "dy -1] ;tipka 2 - dol make "x :mozic_x make "y :mozic_y make "x1 :x+:dx make "y1 :y+:dy make "x2 :x1+:dx make "y2 :y1+:dy if not (znotraj_meja :x1 :y1) [stop] ;zelimo cez rob make "vrednost beri_polje :x :y ;trenutno polje make "vrednost1 beri_polje :x1 :y1 ;naslednje polje make "vrednost2 beri_polje :x2 :y2 ;polje za naslednjim make "tla (int quotient :vrednost 10000) make "tla1 (int quotient :vrednost1 10000) make "tla2 (int quotient :vrednost2 10000) make "objekt (remainder :vrednost 10000) make "objekt1 (remainder :vrednost1 10000) make "objekt2 (remainder :vrednost2 10000) make "tla_tip (int quotient :tla 1000) make "tla_vseb (remainder :tla 1000) make "obj_tip (int quotient :objekt 1000) make "obj_vseb (remainder :objekt 1000) make "tla_tip1 (int quotient :tla1 1000) make "tla_vseb1 (remainder :tla1 1000) make "obj_tip1 (int quotient :objekt1 1000) make "obj_vseb1 (remainder :objekt1 1000) make "tla_tip2 (int quotient :tla2 1000) make "tla_vseb2 (remainder :tla2 1000) make "obj_tip2 (int quotient :objekt2 1000) make "obj_vseb2 (remainder :objekt2 1000) if equalp :obj_tip1 1 [stop] ;na poti je zid if equalp :obj_tip1 4 [stop] ;na poti je dokoncan objekt ifelse (equalp :obj_tip1 0) [ ;gremo na polje, kjer ni nobenega objekta ;trenutno ni nobene operacije ][ ;pred nami je objekt if equalp :obj_tip2 1 [stop] ;za objektom je zid (oz. rob) if equalp :obj_tip2 4 [stop] ;za objektom je dokoncan paket if equalp :obj_tip2 0 [ ;za paketom je prosto polje ;ali bo paket na ustreznem ciljnem mestu? ifelse equalp :obj_vseb1 :tla_vseb2 [ ;dokoncan paket je na ustreznem ciljnem mestu make "nova_vred :vrednost2+4000+:obj_vseb1 push "dokoncani_paketi :obj_vseb1 ][ make "nova_vred :vrednost2+:objekt1 ] postavi_polje :x2 :y2 :nova_vred ;na drugo polje dodamo objekt s prvega risi_polje_ex :x2 :y2 (ustrezna_slika :x2 :y2) :obj_vseb1 postavi_polje :x1 :y1 :tla1*10000 ;s prvega polja zbrisemo objekt ifelse equalp :tla_tip1 0 [risi_polje :x1 :y1 (ustrezna_slika :x1 :y1)] ;prvo polje ima prazna tla [risi_polje_ex :x1 :y1 (ustrezna_slika :x1 :y1) :obj_vseb1] ;prvo polje ima na tleh vrednost ] if or (equalp :obj_tip2 2) (equalp :obj_tip2 3) [ ;za objektom je paket (pra ali sestavljeni) if greaterp (:obj_vseb1*:obj_vseb2) 999 [stop] ;produkt paketov bi bil prevelik ;ali bo na tem mestu paket dokocan? ifelse equalp (:obj_vseb1*:obj_vseb2) :tla_vseb2 [ ;paket je dokoncan in na pravem mestu make "tip_paketa 4000 push "dokoncani_paketi :obj_vseb1*:obj_vseb2 ][ make "tip_paketa 3000 ] postavi_polje :x2 :y2 (:tla2*10000)+:tip_paketa+(:obj_vseb1*:obj_vseb2) ;tla ostanejo ista, paket je sestavljen risi_polje_ex :x2 :y2 (ustrezna_slika :x2 :y2) :obj_vseb1*:obj_vseb2 postavi_polje :x1 :y1 :tla1*10000 ;s prvega polja zbrisemo objekt ifelse equalp :tla_tip1 0 [risi_polje :x1 :y1 (ustrezna_slika :x1 :y1)] ;prvo polje ima prazna tla [risi_polje_ex :x1 :y1 (ustrezna_slika :x1 :y1) :obj_vseb1] ;prvo polje ima na tleh vrednost ] ] ;prestavimo mozica ifelse equalp :tla_tip 0 [risi_polje :x :y :IMG_PRAZNO] [risi_polje_ex :x :y :IMG_CILJ :tla_vseb] ;zbrisemo mozica ifelse equalp :tla_tip1 0 [risi_polje :x1 :y1 :IMG_MOZIC] [risi_polje :x1 :y1 :IMG_MOZIC_CILJ] ;narisemo mozica] make "mozic_x :x1 make "mozic_y :y1 ;ali smo sestavili vse pakete? if equalp (count :dokoncani_paketi) (count :produkt_grupe) [make "igra "false] end to igra :l_stopnja :max_stevilo ocisti_polja nastavi_elemente (item :l_stopnja :stopnje) :max_stevilo ;shranimo zacetne nastavitve za primer, da ponovimo stopnjo kopiraj_polje :polje :polje_backup make "mozic_x_backup :mozic_x make "mozic_y_backup :mozic_y keyboardon [make "tipka keyboardvalue akcija_tipka] make "igra "true make "tipka 0 while [and (:igra) and (not :izhod) (not :zamenjaj)][wait 1] keyboardoff end ;zacetek izvajanja to start cleartext setfocus [MSWLogo screen] inicializacija nadzorna_plosca make "stopnje_tez [20 100 500 1000] make "konec_igre "false make "izhod "false make "zamenjaj "false make "stopnja 1 make "tezavnost 1 while [and (not :izhod) (not :konec_igre)][ ocisti_graficno_okno ht igralna_povrsina igra :stopnja item :tezavnost :stopnje_tez if not or :izhod :zamenjaj [wait 30] ifelse :zamenjaj [ ;v nastavitvah smo zamenjali stopnjo/tezavnost make "zamenjaj "false ] [ ;dokoncali smo stopnjo make "stopnja :stopnja+1 if greaterp :stopnja count :stopnje [ make "stopnja 1 make "tezavnost :tezavnost +1 if greaterp :tezavnost count :stopnje_tez [make "konec_igre "true] ] ] ] cleartext ocisti_graficno_okno if :nadzornaplosca_odprta [windowdelete "wnd_navigator] end make "startup [start]