NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Šachy ve WPF

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Luboš Běhounek Satik:13.3.2016 15:51

Na stredni obtiznost to bylo celkem lehke a na tezkou to trvalo moc dlouho, jak hodnotis tahy? :)

Odpovědět
13.3.2016 15:51
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Fusek
Tvůrce
Avatar
Odpovídá na Luboš Běhounek Satik
Lukáš Fusek:13.3.2016 16:17

Hodnotím zatím 3 faktory (plánuji přidat 4. a tím je ohodnotit pěšáka, který dojde na poslední řádek). Hodnotím všechny možné tahy všech figurek daného hráče na tahu. Každý tah má svojí číselnou hodnotu.
1. Ohodnocení útoku:
Přidá kladnou hodnotu na tah, který sebere nepřátelskou figurku.
2. Ohodnocení matu:
Přidá kladnou hodnotu na tah, kterým způsobí nepříteli mat.
3. Eliminace nepřátelského nejlepšího tahu:
Provedu možný tah (dočasně přesunu figurku) a zkontroluji hodnotu nepřátelského nejlepšího tahu (dle předchozích 2 faktorů). Pokud má kladnou hodnotu, odečtu jí od právě provedeného možného tahu a obnovím dočasně přesunutou figurku.

Příklad ohodnocení tahu:
Ohodnocení útoku: Při přesunutí černé figurky na políčko E5 seberu královnu a proto tah ohodnotím +7 body (hodnota královny).
Ohodnocení matu: Při přesunutí nezpůsobím mat = +0 bodů
Eliminace nepřátelského nejlepšího tahu: při přesunutí zjistím, že nepřátelský nejlepší tah bude sebrat mi věž = -5 bodů (hodnota věže)

 
Odpovědět
13.3.2016 16:17
Avatar
Petr Laštovička:15.3.2016 15:12

Všiml jsem si, že na několika místech používáš metodu ToArray(), která zbytečně kopíruje List do pole. Například funkce MozneTahy by místo Tah[] mohla vracet IList<Tah>.
Také by bylo dobré u všech deklarací odmazat { get; set; }. Kompilátor C# je bohužel dost špatný a neumí to zoptimalizovat. Hlavně hodnoty Radek a Sloupec ve třídě Souradnice mají dost velký dopad na rychlost, pokud je u nich napsáno { get; set; }.

 
Odpovědět
15.3.2016 15:12
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Petr Laštovička
Jan Vargovský:15.3.2016 20:13

Co bys chtěl na propertě optimalizovat?

 
Odpovědět
15.3.2016 20:13
Avatar
Lukáš Fusek
Tvůrce
Avatar
Odpovídá na Petr Laštovička
Lukáš Fusek:16.3.2016 7:53
  1. U přepsání property na field jsem doufal, že rozdíl nebude znatelný. Bohužel opak je pravdou. Po odmazání všech { get; set; } jsem dostal zhruba o 10 % rychlejší tah. Takže moc děkuji.
  2. Co se týče přepsání návratových datových typů z Tah[] na IList<Tah>, tak jsem výkon navíc nezaznamenal. Může to snad být tím, že potom s vrácenými hodnotami pracuji pomocí příkazu foreach a né pouze s for? Přikládám odkaz, kvůli kterého se ptám na tuto otázku.

http://stackoverflow.com/…ays-vs-lists

Každopádně děkuji za pomoc. Zase jsem postoupil o krok vpřed. :-)

 
Odpovědět
16.3.2016 7:53
Avatar
Odpovídá na Lukáš Fusek
Petr Laštovička:16.3.2016 14:35

Příkaz for je skoro stejně rychlý jako foreach, takže to nemá smysl měnit. Spíše bych zkusil použít příkaz yield return, který dělá lazy-evaluation a kromě toho také šetří paměť, protože nepotřebuje žádný List.
Funkci OhodnoceneMozneTahy by bylo lepší spouštět v samostatném threadu. Potom by se mohl odstranit dispatcher.Invoke, který to trochu zpomaluje.

 
Odpovědět
16.3.2016 14:35
Avatar
coells
Tvůrce
Avatar
Odpovídá na Lukáš Fusek
coells:16.3.2016 15:27

Tvůj kód jsem neviděl, ale několik tipů:

  1. zapni si release mode kompilátoru, rozdíl s/bez properties nebude žádný
  2. neřeš foreach nebo for, použij prioritní frontu s greedy heuristikou výběru tahů k analýze
  3. použij hashování na detekci už zpracovaných tahů
 
Odpovědět
16.3.2016 15:27
Avatar
Odpovídá na Jan Vargovský
Petr Laštovička:17.3.2016 22:16

Když člověk nějaký složitý program vytváří několik měsíců a často ho potřebuje ladit, mohou se hodit i takové optimalizace, které se projeví pouze v Debug módu. Když mám nápad na optimalizaci, která mi teď zabere minutu a později mi ušetří mnohem více času, tak se to vyplatí.

 
Odpovědět
17.3.2016 22:16
Avatar
Petr Laštovička:17.3.2016 22:27

Na anglické wikipedii je článek Negamax, kde je popsán algoritmus, který se často používá u logických her. Zajímavý je hlavně odstavec "Negamax with alpha beta pruning and transposition tables". Vypadá to komplikovaně, ale v podstatě je to podobné algoritmu, který je v souboru AI.cs. Jsou tam navíc hodnoty alfa, beta a hashovací tabulka. Místo fukcí Transposition­TableLookup a Transposition­TableStore lze v C# použít třídu Dictionary. Musí se k tomu ale napsat metoda GetHashCode, která z hrací plochy vypočte hash. Věta "node is a terminal node" znamená mat nebo remíza. Věta "the heuristic value of node" je ohodnocení pozice (součet hodnot sebraných figurek). Funkce GenerateMoves jsou možné tahy. Funkce OrderMoves je heuristika výběru výhodných tahů a k tomu lze použít existující funkci OhodnotUtok.

 
Odpovědět
17.3.2016 22:27
Avatar
Odpovídá na GunSpawn
Lukáš Hypša:24.3.2016 18:58

Odlišit to jde ale je pravda že věž bývá menší a širší než dáma.

 
Odpovědět
24.3.2016 18:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 26.