m-piskvorky

Vice moznosti nez sachy? XDDD
klidně vymýšlejte, kdybych měl, tak zahrnu :]
nepracuje s retezci ale s polem, ja kdysi v C piskvorky psal takze o tom neco vim, retezec by byl neprakticky i kdyz by se dal vyuzit pri zadavani ruznych fint s tim, ze by musel byt dalsi algoritmus ktery by retezec umel lamat do 2 rozmeru s rotaci, flipovanim apd. To uz je ale dosti slozite...
To jakym zpusobem jsem AI piskvorek resil kdyz jsem je delal kdysi tu muzu klidne popsat kdyz budete chtit
No pokud to není tvé know-how tak to tu napiš <bezironie>aspoň se na tomhle fóru po dlouhé době objeví něco užitečného a zajímavého.</bezironie>
Richard:
Nípal říkal "algoritmus na vyhledávání řetězů", ne řetězců. (jenom pro úplnost)

Jen to napiš, aspoň se něco přiučíme.
Ještě než to tady bude plný algoritmů, napadlo mě uspořádat turnaj (až se to ještě trochu odladí, takže někdy po velikonocích). Šli byste do toho?
milster: Asi jo,záleží kdy :)
<HTML>Bylo by to na dlouhe povidani tak prozacatek zakladni princip:
Vytvorime 3 rozmerne pole:
pole[x][y][3]
kde 3 rozmer ma 3 indexy a znamenaji:
index 0: oznaceni zda-li je tam proveden tah (0-neni, 1-clovek, 2-pc)
index 1: obrane cislo
index 2: utocne cislo

Tohle je zaklad...
Nyni si musime zvolit typ pocitani posobe jdoucich tahu
muze pouzit napr. kruhove prochazeni (dynamicke), nebo konstatni ve 4 smerech (tedy rekneme za pomoci 4 cyklu (4c)):
- (vodorovne)
| (svisle)
/ (pravy horni roh, levy spodni roh)
\ (levy horni roh, pravy spodni roh)

Pro demonstraci pouziju metodu 4c:
Rekneme ze obsah herni plochy vypada napr. takto:
* * * * * * * *
* 1 1 1 * * * *
* * * * 1 * * *
* * * * * * * *

(* - prazdne policko, tedy 0 bez zadneho tahu)
(1 - znacuje ze to jsou tahy cloveka)

nejprve nam prvni cyklus (vodorovny) bude klasicky prochazet pole radek po radku a sloupec po sloupci:
(for x++)
(for y++)
...

jakmile ale narazi na tah cloveka* (hodnota 1 v 3 rozmeru na indexu 0)
(* protoze prave pocitame cloveka, jen pro ujasneni z tahů cloveka vypocitavame obranu, jelikoz my jako PC se proti nemu branime, cily cely proces prochazeni vsech smeru provedeme 2, poprve pro pocitani obrany tedy vyhledavame tahy cloveka, podruhe pro vypocet utoku, tedy vyhledavame tahy PC = nase)
Dalsi cyklus prevezme prozatimni veleni a bude pokracovat od X a Y pozice nalezeno tahu s tim ze bude pocitat kolik jich je posobe jdoucich (stale se pohybujeme jen ve vodorovnem smeru)
Jakmile narazi na posledni cloveci tah v dane posobe jdouci rade tahu, skoci jeste o jedno policko dale v teze smeru, zjisti zdali je prazdne (hodnota 0 v 3 rozmeru na indexu 0) a zapise tam pocet nalezenych po sobe jdoucich tahu jako obrane cislo (tedy do 3 rozmeru na index 1).
Nyni se vrati o dany pocet tahu zpet tak, aby byl na policku pred zacinajicim prvnim tahem z posobe jdouci rady, opet zjisti zdali je volne, pokud ano zapise pocet nalezenych tahu po sobe.

Z naseho prikladu:
* * * * * * * *
* 1 1 1 * * * *
* * * * 1 * * *
* * * * * * * *

ke budeme predpokladat ze jednicka patrici cloveku hrala za krizky, budou tedy takto vypadat obrana cisla:

* * * * * * * *
3 X X X 3 * * *
* * * 1 X 1 * *
* * * * * * * *

Jak vidite pocitani je jen z jednoho smeru (vodorovneho), podobne se pak provedou ostatni smery s tim, ze do daneho indexu s obranym cislem se cislo nepriradi ale pricita pokud tam jiz nejake je...

Z toho co nyni mame nam staci jen projit pole a zjistit kde je nejvetsi obranne cislo a tam udelat tah (v pripade ze by nam do zacatku PC umelo jen branit)

takze opet prikladem kdy uz nam budou fungovat vsechyn smery budou obrana cisla takovato:

1 2 3 2 1 * * *
3 X X X 3 1 * *
1 2 3 3 X 1 * *
* * * 1 1 2 * *

Jsou to vlastne takove updatovane miny z windows ;)
Jak ale vidite problematika je sirsi, protoze nejvyssi obrane cislo je 3 a to i tam kde by byl pripadne nami udelany tah uplne tupy v teto situaci....

Jestli se nekdo chyta muzu to rozebrat dal, pripadne ptejte se...</HTML>
jestli jsem spravne pochopil, vypadalo by to takhle

1 2 3 2 1 * * *
3 X X X 4 1 * *
1 2 3 3 X 1 * *
* * * 1 1 2 * *

tj tah by byl spravny
kazdopadne je potreba nadradit hodnoty policek v jedne lajne nad ty sesbirane z vice smeru
a ještě by mě zajímalo, jak funguje kruhové procházení?
<HTML>ale porad tam ty i ja mame chybu, spravne je to:
1 2 4 2 1 * * *
3 X X X 4 1 * *
1 2 3 3 X 1 * *
* * * 1 1 2 * *


>>kazdopadne je potreba nadradit hodnoty policek v jedne lajne nad ty sesbirane z vice smeru
- nevim jak to myslis.. ??

jinak mas pravdu mel jsem tam nezamernou chybu...
nicmene chtel jsem tim ukazat a mene a vice dulezite policka muzou mit stejnou hodnotu....
resit se to da tak, ze posobe jdouci tahy secteme (jako doposud) a VYNASOBIME sama sebou, takze napr.:
3 po sobe hodi cislo 9,
2 po sobe hodi 4,
1 hodi 1, ...
tim zvyraznime tahy po sobe v rade oproti souctum vsech okolo viz priklad v praxi:

1 2 6 2 1 * * *
9 X X X 10 1 * *
1 2 3 3 X 1 * *
* * * 1 1 4 * *

cili se da timto docilit lepsiho a presnejsiho rozliseni dulezitosti</HTML>
"tim zvyraznime tahy po sobe v rade oproti souctum vsech okolo"

jj, tohle jsem myslel
takhle uz to vypada celkem slibne
zpracoval jsem ten algoritmus, k vidění je na http://m-piskvorky.wz.cz/ai/

klikáním na herní plochu pokládáš značku, v okolních políčkách se ti zobrazí obranné číslo
Obranné číslo 529 nemá konkurenci! :)
Ty jsi mi ale hračička :]
No jo, to jsem cely ja:) Ale nebudu vam tady narusovat vasi algoritmovou diskusi...
http://m-piskvorky.wz.cz/ai2/

Tady si to můžeš vyzkoušet v praxi. Hra je sice nekonečná, ale na ukázku to stačí.
Chce to dávat ještě bonusový bodíky důležitosti k otevřeným řadám. Ale to snad radši až zítra..
sákra, hodně zajímavý. oblbnul sem ho jednou, a to ho trápim asi půl hodiny. už mě to nebaví, du spát.....

zzzZzzzzzZzzzzZZzzz.....
este sem prisel na to, ze kdyz mam rozehranou hru, a zacnu davat krizky nekam nesmyslne, treba do rohu, tak ten skript postupne vyplnuje ty obranny cisla, nediva se kolik ma kolecek v rade. takze vyhraje jenom nahodou. ja vim, je to ve fazi vyvoje, ale to vis, sou skoro 4 a ja nemam co delat. tak ja fakt du. dobrou noc WZ!
Já ho oblbnul dostkrát. Souhlasím s tím, že to chce bonusové bodíky. Především by to ale mělo poznat, jestli náhodou nedostal příležitost k útoku. Ale zatím to celkem jde, ten algoritmus je v podstatě správný.
Jinak nejvyšší obranné číslo je 1728. Všiml jsem si, že když je sloupec dost široký, už se tam vejdou i kolečka :) To doufám nenastane :D
milster:
to bylo rychle, vyborne...
prejdeme tedy dal...
meli bychom urcit prioritni cisla pro zname spatne stavy.. jako 3 tahy v rade posobe volne z obou stran.. v takovem pripade bych pricetl ne pocet tahu po sobe v rade (TP - to bude skratka TahuPosobe [v rade] at to porad nepisu) ale nejakou konstantu treba 100 a to jen v pripade ze je rada volna z obou stran... v pripade ze je to rada 4 TP dal bych 1500 ....
opet to bude o neco inteligentnejsi...
Zatim bych resil pouze obranu.. jak to bude s utokem to zatim neni dulezite.
Bylo by ale dobre psat ten source tak, aby se stejny obrany algoritmus dal pouzit i na utocny nejak jednoduse nez ho opisovat.. treba dat ho do funkci,ale ted bereme teorii...
Take muzeme casem poresit pocitani tahu dopredu, ale to uz si moc nepamatuji takze budu muset znova premyslet :)

Jeste na zaver dodam, ze by bylo dobre vsechny nejvetsi hodnoty pokud jich je vice ulozit do pole a vybrat jednu z nich nahodne aby PC nehralo porad stejne
milster> neslo by to napsat, tak aby tam byly ruzne druhy obtiznosti?

protoze az dokoncite ty bonusove bodiky k radam a utok - tak nebudu mit sanci:)))))))
Různé druhy obtížnosti by to chtělo, možná by to chtělo nějaký rozptylový či ignorační faktor, např. že si třeba občas nevšimne obranného čísla 8 apod. (obranné číslo 8 je příprava na vytvoření dvojité trojky)

Každopádně souboj s robotem by neměl být započítáván do normálních zápasů, ale spíš by to měl být nějaký trénink.