Diskuze: Vedlejší efekt programu hrající piškvorky

C# .NET .NET (C# a Visual Basic) Vedlejší efekt programu hrající piškvorky American English version English version

Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Ahoj, v kódu níže mám takovou podivnost, se kterou si nevím rady. Spustím program, v Mainu do pole nic nepíšu, ale stejně jsou v něm hodnoty. Nevím co dělat, je to strašně divný. Prosím o pomoc.

http://www.itnetwork.cz/dev-lighter/704

 
Odpovědět 29. března 18:42
Avatar
Ondřej Krsička
Redaktor
Avatar
Ondřej Krsička:

Kdyby vás ale napadlo i cokoli jiného k programu, sem s tím! :-)
EDIT: Jo, v názvech je diakritika, i když se říká, že tam nemá být. (ale když je to česky, tak je to snad i jedno...)

Editováno 29. března 18:47
 
Nahoru Odpovědět 29. března 18:44
Avatar
Drahomír Hanák
Tým ITnetwork
Avatar
Odpovídá na Ondřej Krsička
Drahomír Hanák:

Zkoušel jsi program krokovat? Je hodně užitečné naučit se s debuggerem. Zvlášť ve VisualStudiu se s ním pracuje pěkně.

K programu: pole je v C# vždy referenční datový typ. To znamená, že všechny funkce v tvém programu pracují s tou samou pamětí. Funkce Tahni tak v každém kroku Minimaxu změní obsah toho pole, které máš deklarované v Main, což asi není to, co jsi chtěl. Pole můžeš třeba kopírovat (pokud neprohledáváš do nějaké velké hloubky a stav hry je rozumně velký, tak s tím nebude problém) nebo stav hry po tom, co se vrátíš z rekurze, vrátit zpět na původní hodnotu (což je v tomhle případě taky dost jednoduché).

Pokud tě tohle téma zajímá, tak bych ti doporučil přečíst si něco o alfa beta ořezávání (v angličtině "alpha-beta pruning"). Je to o něco těžší na pochopení něž jen klasický minimax, ale ušetří to spoustu práce, pokud budeš prohledávat nějaký větší stavový prostor.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 29. března 19:14
Avatar
Ondřej Krsička
Redaktor
Avatar
Odpovídá na Drahomír Hanák
Ondřej Krsička:

Aha, referenční typ. V tom bude zakopaný pes, díky. Takže by ve fce Tahni mohla vypadat nějak takto?

Táhni(pole, x, y, hraje)
{
     pole2 = pole;
     pole2[x, y] = hraje;
     return pole2;
}

Je to spíš pseudokód, psáno na mobilu.

Editováno 29. března 19:59
 
Nahoru Odpovědět 29. března 19:58
Avatar
Odpovídá na Ondřej Krsička
Luboš Běhounek (Satik):

Pole můžeš zkopírovat třeba přes

Array.Copy();

to je asi nejrychlejší bezpečný způsob, pak už jedině Buffer.BlockCopy() nebo přímo windowsácké CopyMemory().

Nahoru Odpovědět 29. března 20:50
:)
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 6 zpráv z 6.