Šachy ve WPF

C# .NET WPF Zdrojákoviště Šachy ve WPF

Známá desková hra pro dva hráče, ve které se hráči snaží logickým umem a strategií přehrát soupeře. Možnost trénovat proti počítači se třemi úrovněmi obtížnosti.

Hra je určena pro Windows 10, 8.1, 8, a 7; 32-bit i 64-bit (je nutné mít nainstalovaný NET Framework 4.6.1).

Grafické uživatelské rozhraní jsem se snažil vytvořit co nejvíce intuitivní a přehledné. Nastavení hry je dynamické, zobrazuje se tedy pouze nastavení, které je užitečné pro daný mód hry (módy = hráč vs hráč, hráč vs ai, ai vs ai).

Aplikace umí dále
ukládat a nahrávat šachové hry
pohybovat se zpět a vpřed v historii provedených tahů
nastavit oběma stranám, zda za figurky bude hrát hráč nebo ai
nastavit, aby ai hrálo samo proti sobě a to s odlišnou obtížností ("inteligencí")
nastavit minimální délku tahu, protože některé ai tahy mohou být velmi rychlé
přenastavit i právě probíhající hru
využívat moderní hardware neboli potenciálu vícejádrových procesorů

Algoritmus pro vyhledávání nejlepších tahů (ai) je minimax. Snažil jsem se ho vylepšit na algoritmus "alfa-beta ořezávání", bohužel neúspěšně. Pokud má někdo s tímto algoritmem zkušenosti, rozhodně ocením každou radu nebo typ, jak ho implementovat. Prostředí by na to mělo být plně připravené.


Galerie

Hra byla vytvořena v roce 2016.

 

Stáhnout

Staženo 143x (2.02 MB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (5)

Hru pro vás napsal Shakul
Avatar
Autor se věnuje převážně vývoji aplikací na platformě .NET.

Jak se ti líbí článek?
Celkem (4 hlasů) :
4.754.754.754.754.75


 



 

 

Komentáře
Zobrazit starší komentáře (12)

Avatar
lastp
Redaktor
Avatar
lastp:

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  -1 15. března 15:12
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na lastp
Jan Vargovský:

Co bys chtěl na propertě optimalizovat?

 
Odpovědět  +1 15. března 20:13
Avatar
Shakul
Redaktor
Avatar
Odpovídá na lastp
Shakul:
  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. března 7:53
Avatar
lastp
Redaktor
Avatar
Odpovídá na Shakul
lastp:

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  +1 16. března 14:35
Avatar
coells
Redaktor
Avatar
Odpovídá na Shakul
coells:

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  +2 16. března 15:27
Avatar
lastp
Redaktor
Avatar
Odpovídá na Jan Vargovský
lastp:

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  +1 17. března 22:16
Avatar
lastp
Redaktor
Avatar
lastp:

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  +1 17. března 22:27
Avatar
Lukáš Hypša:

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

Odpovědět 24. března 18:58
I když se programování učím jenom z interetu, velmi mě baví a doufám, že se tím jednou budu i živit.
Avatar
Jan Řehák
Člen
Avatar
Jan Řehák:

na páána :)

 
Odpovědět  +1 5. dubna 18:27
Avatar
Martin Bruna
Člen
Avatar
Martin Bruna:

Pokud by ses někdy pouštěl do další optimalize douporučuji se podívat na stockfish jde o jeden z nej šachových enginů a je opensource (https://github.com/…sh/Stockfish)

 
Odpovědět 20. června 11:43
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 22. Zobrazit vše