OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 28.03.2024, 21:32

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 
Autor Zpráva
 Předmět příspěvku: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 11.08.2018, 12:56 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Včera cestou vlakem mi přišla myšlenka na předělání TNT Bomb vyhodnocení pomocí trasovacího algoritmu. Pak jsem hledal na internetu, jestli něco takového existuje, ale nenašel jsem. Nicméně napadlo mne následující - v bodech:
- každý typ kostky v hracím plánu bude mít jeden bajt obsahující start flag, stop flag, směr vodiče nahoru, dolů, doleva, doprava
- vyhodnocení bude probíhat takto:
Kód:
  1. najde se první kostka se start flagem
  2. podle směru vodiče se vezme vedlejší kostka, udělá se XOR s předchozí, zkontroluje se stop flag:
     - pokud je, jdeme na 3
     - pokud není, musí být nastavený jediný směrový bit
       - pokud je, jdeme na 2
       - pokud není, končíme, protože spoj dál nevede
  3. najde se druhá kostka se start flagem
  4. podle směru vodiče se vezme vedlejší kostka, udělá se XOR s předchozí, zkontroluje se stop flag:
     - pokud je, máme hotovo a spustíme explozi
     - pokud není, musí být nastavený jediný směrový bit
       - pokud je, jdeme na 4
       - pokud není, končíme, protože spoj dál nevede

Máte někdo jiný nápad ?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 11.08.2018, 17:30 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 168
Has thanked: 25 times
Been thanked: 225 times
v pripade ze cesta musi na TNT nadvazovat v naznacenych bodoch (podla obrazka http://www.8bity.cz/wp-content/uploads/ ... scr_02.png ) a nie kdekolvek na okraji, by som povedal, ze treba trochu zreorganizovat bod 2 (a rovnako bod 4):
vaclavpe píše:
Kód:
  2. podle směru vodiče se vezme vedlejší kostka, udělá se XOR s předchozí, zkontroluje se stop flag:
     - pokud je, jdeme na 3
     - pokud není, musí být nastavený jediný směrový bit
       - pokud je, jdeme na 2
       - pokud není, končíme, protože spoj dál nevede


by som zmenil na:
Kód:
  2. podle směru vodiče se vezme vedlejší kostka, udělá se AND se směrem a zkontroluje se výsledek:
     - pokud je výsledek ANDu = 0, končíme, protože spoj dál nevede
     - pokud je výsledek ANDu nenulový, zkontroluje se stop flag
       - pokud není, nový směr dostaneme jako XOR starého směru a vedlejší kostky a jdeme na 2
       - pokud je, jdeme na 3



este by som vsak upozornil (a to bez ohladu na to, ci sa bod 2 ma zmenit alebo moze zostat) na jednu podstatnu vec (pri zistovani ci cesta nadvazuje a pocitani novej cesty), a to, ze pred XORom/ANDom s vedlajsim dielikom je treba smer "zrkadlovo obratit" (vlavo<->vpravo, hore<->dolu), totiz, ak z nejakeho dielika cestujeme smerom vlavo, znamena to ze na vedlajsom dieliku potrebujeme otestovat moznost cestovat vpravo.


samozrejme, aby sme nemuseli robit dva cykly (alebo podprogram s cyklom, na ktory by sa skakalo dvakrat), tak sa da cely postup zmenit tak, ze dieliky TNT si v pamati ohodnotime tak, akoby boli sucastou cesty (povedzme, podla obrazka by boli dva spodne dieliky ohodnotene ako dieliky vlavo-vpravo) a potom by sa urobil len jeden cyklus, ktory by zacal v bateria+ a netestoval by koniec cesty ako "pritomnost tnt" ale ci sa nachadza v dieliku bateria-. samorejme, pritomnost tnt by aj tak bolo treba pocas cyklu testovat a kladny vysledok si niekam zaznacit, aby sa nakoniec vyhodnotil pri prichode do bateria- (aby pouzivatel len jednoducho nezoskratoval bateriu bez zapojenia tnt do obvodu)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 13.08.2018, 19:57 
Offline
Kecálek

Registrován: 28.10.2016, 21:03
Příspěvky: 122
Has thanked: 13 times
Been thanked: 50 times
To, co jste tu vytvořili by fungovalo. Chtěl jsem si to vyzkoušet v malém demo programu,
tak přikládám Tcl implementaci pro vyzkoušení funkčnosti.

Konvence pro zápis levelu:
level se zapíše jako text naformátovaný do řádků a sloupců
parametr width - počet sloupců (= šířka matice levelu)

obsazení jednotlivých políček se uvede pomocí dvojznakových zkratek
sl sr - počátek cesty směrem vlevo a vpravo (start-left, start-right)
el er - konec cesty zleva a zprava (end-left, end-right)
ul ud ur dl dr lr - dvojice směrů, do kterých se daný dílek připojuje
(up-left, up-down, up-right, down-left, down-right, left-right)
.. neobsazený prostor, nebo zeď

Výstup programu je řetězec "linked" (spojeno) nebo "not linked" (nespojeno).

Při převodu do assembleru by se samozřejmě textová reprezentace nepoužila,
vycházelo by se jen z té číselné, jak jste to předpokládali v příspěvkách
výše. Textový zápis je pouze pro snadnější zadávání levelu a experimenty.

Odkaz ke spuštění online
http://rextester.com/HAS88337 (verze 1, chybná)

http://rextester.com/MBHGDP86018 (opravená verze)

Kód:
# u -up, d -down, l -left, r -right, s -start, e -end

set width 6
set gridtxt {
 .. .. .. .. .. ..
 dr lr el er dl ..
 ur dl .. .. ud ..
 .. ur sl sr ul ..
 .. .. .. .. .. ..
}

lmap "ul ud ur dl dr lr sl sr el er .." "9 10 12 3 6 5 1 4 1 4 0" {}
set grid [lmap x $gridtxt {set $x}]
set linked 0
set starts [lsearch -all $gridtxt s?]
foreach pos $starts {
  set direc [lindex $grid $pos]
  set tile 1; set rot 1
  while {$tile&$rot} {
    if {[lindex $gridtxt $pos] in"el er"} {incr linked; break}
    set move [lindex "0 -1 $width 0 1 0 0 0 -$width" $direc]
    incr pos $move
    set tile [lindex $grid $pos]
    set rot [expr 4*$direc+$direc/4]
    set direc [expr $tile&~$rot]
  }
}

puts [expr {$linked<2?"not ":""}]linked


Naposledy upravil lukz dne 13.08.2018, 20:41, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 13.08.2018, 20:30 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Jj, tohle je pěkně udělané, přemýšlel jsem, jestli mám očekávat třeba více směrů, než dva, ale to asi smysl nemá


Nahoru
 Profil  
 
 Předmět příspěvku: Re: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 13.08.2018, 20:31 
Offline
Kecálek

Registrován: 10.07.2014, 01:57
Příspěvky: 168
Has thanked: 25 times
Been thanked: 225 times
tak aj ja prikladam "demo" implementaciu (hratelnu ;]) v basicu na zx (ospravedlnujem sa za implementaciu na ufonskej platforme, ja sharpu ale nevladnem ;])

ovladanie: Q, A, O, P a Space

a kedze to je v basicu, ktory nema implementovane bitove operacie a je ich treba "workaroundovat", je to kusok pomalsie, konkretne to na tom vyhodnoteni aj poznat, ked uz je cesta dlhsia. ale kedze som implementoval tu verziu, ktora ma len jeden cyklus (cize ide od BAT+ cez TNT az po BAT-), je lepsie cestu stavat "odzadu", cize od BAT-, pretoze priebezne nemusi tolko kontrolovat a tak je to "sviznejsie" ;]

kontrola riesenia je na riadkoch 200-290, v REM poznamkach su aj body z popisu algoritmu v tomto threade (obsahuju znak @, aby sa lahsie vyhladali)

tntb.bas subor sa da "skompilovat" do tapky pomocou:
Kód:
zmakebas -a 10 -o tntb.tap tntb.bas


EDIT: pridana (docasna) linka na tntb.txt kedze OC sa s takym nekamarati
https://sindik.at/~ub880d/tmp/tntb.txt


Přílohy:
tntb.tap [6.25 KiB]
649 krát
tntb.bas [5.91 KiB]
669 krát


Naposledy upravil ub880d dne 13.08.2018, 22:21, celkově upraveno 2
Nahoru
 Profil  
 
 Předmět příspěvku: Re: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 13.08.2018, 20:56 
Offline
Kecálek

Registrován: 04.02.2016, 10:21
Příspěvky: 91
Has thanked: 7 times
Been thanked: 18 times
Tak mi Chrome ten BASICovský kód zakázal stáhnout, prý oldcomp šíří malware. dá se to píchnout někam na pastebin ?


Nahoru
 Profil  
 
 Předmět příspěvku: Re: TNT Bomb Bomb trasovací algoritmus
PříspěvekNapsal: 13.08.2018, 23:53 
Offline
Site Admin
Uživatelský avatar

Registrován: 11.05.2013, 23:48
Příspěvky: 10111
Bydliště: Praha
Has thanked: 1953 times
Been thanked: 1517 times
I FireFox má porblém s BAS, ale dá se přesvědčit, aby ho stáhnul.

_________________
Amiga/Amstrad/Atari/Commodore/Mac/Nintendo/PS/PC/Sega/Tandy/ZX


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
cron
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz