Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

Diskusia – Šach vo WPF

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
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? :)

Odpovedať
13.3.2016 15:51
https://www.facebook.com/peasantsandcastles/
Avatar
Lukáš Fusek
Tvůrce
Avatar
Odpovedá 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)

 
Odpovedať
+2
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; }.

 
Odpovedať
-1
15.3.2016 15:12
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá na Petr Laštovička
Jan Vargovský:15.3.2016 20:13

Co bys chtěl na propertě optimalizovat?

 
Odpovedať
+1
15.3.2016 20:13
Avatar
Lukáš Fusek
Tvůrce
Avatar
Odpovedá 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. :-)

 
Odpovedať
16.3.2016 7:53
Avatar
Odpovedá 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.

 
Odpovedať
+1
16.3.2016 14:35
Avatar
coells
Tvůrce
Avatar
Odpovedá 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ů
 
Odpovedať
+3
16.3.2016 15:27
Avatar
Odpovedá 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í.

 
Odpovedať
+1
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.

 
Odpovedať
+1
17.3.2016 22:27
Avatar
Odpovedá 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.

 
Odpovedať
24.3.2016 18:58
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 26.