WOODMAKER: Jak píše
DUCATIMONSTER:
U mě to je náhodná "tráva" (zatím buď mezera, nebo speciální znak s tečkou uprostřed).
Stejne tak ovoce se "losuje" z několika různých znaků (hvězdička, plamínek, smajlík, šnek/myš - je vidět na tom spodním).
Jednak to vypadá, jednak to velice pomáhá se správně strefit na řádku/sloupec, kde chci sežrat ovoce, už z dálky a pak ho o jedno pole neminout.
U mě je ta tráva náhodně losovaná a když ji přejede had, tak se zase náhodně vylosuje - mám málo paměti a tak spousta informací je pouze ve videoRAM a nikde jinde. Například z celého hada mám uložené jen hlavu a ocas (x, y a směr), tělo nikoli. (A tělo slouží ocasu jako stopa, kudy se má pohybovat). Ovoce je taky jen v obrazovce a sežrání/nárazy se taky řeší jen z videoRAM :)
Pro demo režim jsem to upravil tak, že tam je jen jedno ovoce, když ho sežere, vygeneruje se náhodně jiné tak, aby bylo na prázdném místě.
Hlava se vždycky podívá, kde to ovoce je (má to uloženo od generování) a kde je ona a určí směry podle vhodnosti, pak se v tom pořadí podívá, jestli tam může jít *) a když ne, zkusí další, dokud ji nezbyde poslední možnost. A v dalším kroku zase. A to je vše :D
*) vlastní tělo je taky překážka, čímž se řeší i couvání (kousnutí se do jazyka)
Tohle demo je takové docela minimalistické, ale ukazuje, co to dovede s videem, takže to používám jako test.
A taky na tom testuju ten vlastnoruční FORTH, pořád ho vylepšuju technicky uvnitř.
Například hadí tělo bylo původně 12 písmenek v řetězci (pro každý směr, kterým může přilézt a každý, kterým může odlézt je jiný kus těla, aby ho ocas zvládnul stopovat)(teda 16, aby se to snadno počítalo).
: body_str S" abc#de#fg#hi#jkl" ;
Pak jsem vymyslel binární řetězec načítaný ze zásobníku, abych mohl snadno používat znaky pod 255:
244 245 246 '#' 247 248 '#' 249 250 '#' 251 252 '#' 253 254 255 16 BINSTR body_str
a pak ještě lepší zápis, kde to můžu generovat po libosti a nemusím to počítat ručně
B{ body_str 244 C, 245 C, 246 C, '#' C, 247 C, 248 C, '#' C, 249 C, 250 C, '#' C, 251 C, 252 C, '#' C, 253 C, 254 C, 255 C, }B Z pohledu hada je to pořád to samé, výsledkem je řetězec použitelný jako pole 4x4, ale z pohledu programátora je poslední řešení zatím nejlepší (a nejpokročilejší). A líbí se mi, jak si ve FORTHu můžu definovat i vlastní syntaxi :)
Taky tam používám spoustu dalších pokročilejších prvků jazyka, jako třeba proměnné pro funkce, které mi umožňují "za běhu" vyměnit vstup od uživatele za výpočet "optimální" cesty pro demo a navíc slouží jako forward deklarace
Takhle se to udělá ve FORTHu
: DEFER CREATE , DOES> @ EXECUTE ;
: IS IMMEDIATE [ ' TO , ] ;
a takhle se to použije pro deklaraci
: nop ;
' KEYpress DEFER get_key
' nop DEFER fruit_fall
pak to použiju v kódu (tohle je hlavní hadí smyčka, kde je vlastně celá hra)
BEGIN
0 TO grow
move_head
move_tail
fruit_fall
show_score
is_demo IF KEYpress IF 3 TO crash THEN THEN
crash UNTIL
a ono to něco dělá. A o něco později napíšu
demo_key IS get_key
add_fruit IS fruit_fall
a hned to dělá něco zcela jiného
(a aby toho chlubeníčka snad nebylo málo, tak ten DOES> by mi tam normálně vůbec neměl fungovat, protože na té atmega2560 se nedá spouštět kód v RAM, ale já si na to upravil engine, že když nastavím v adrese jeden bit, tak se provede dvojitá dereference s přídavkem a tím se dostanu zase na bezpečnou půdu a funguje mi to - podrobný popis těch kejklů mám tady:
http://comp24.gilhad.cz/MHF-002/FORTH/DOES_Explained.html )
V původním hadovi byly jen jednoduché techniky, teď tam cpu co nového vymyslím, líp se testuje správnost honěním si hada, než psaním technických testů :)