public void Game() { // volba nastavení hráče na tahu usCom.VypisZpravu("Nastavení hráčů. Zadej 0 pro hráče, nebo 1..4 jako hodnotu inteligence PC", false, ConsoleColor.Green); inteligenceBileho = -1; while (inteligenceBileho == -1) { inteligenceBileho = usCom.GetPlayerSettings("Nastav bílého hráče \"x\": "); if (inteligenceBileho == -1) { usCom.VypisZpravu("Nesprávně nastavená hodnota!", false, ConsoleColor.Red); } } inteligenceCerneho = -1; while (inteligenceCerneho == -1) { inteligenceCerneho = usCom.GetPlayerSettings("Nastav černého hráče \"o\": "); if (inteligenceCerneho == -1) { usCom.VypisZpravu("Nesprávně nastavená hodnota!", false, ConsoleColor.Red); } } while (!gameRules.IsGameFinished(Nard)) { usCom.ConsoleClear(); usCom.VypisBoard(Nard); usCom.VypisZpravu(vypisTahu, false, ConsoleColor.Yellow); // "false" -> protože tady není žádoucí čekat na Enter (=UserCommunication-VypisZpravu-bool cekaNaVstup) + "vypisTahu -> MainController-ProvedTah-VypisTahu if ((hracNaTahu == 1 && inteligenceBileho > 0) || (hracNaTahu == -1 && inteligenceCerneho > 0)) // inteligence1,2 > 0 ....... hraje PC { Thread.Sleep(300); // časová prodleva před tahem počítače, aby tahy nebyly moc rychlé brain = new ArtificialIntelligence(Nard, hracNaTahu > 0 ? inteligenceBileho : inteligenceCerneho, hracNaTahu); // <= pokud je na řade s tahem počítač, vytvoří se nová instance "brain", kde se nastaví inteligence podle toho, jak je daný hráč nastaven..... bestMoveCountTask = new Thread(brain.VypocitejNejlepsiTah); // ..... spustí se výpočet a výsledek se provede a SEPARÁTNÍ VLÁKNO se uloží do proměnné -> "bestMoveCountTask" bestMoveCountTask.Start(); Console.Write("\n"); while (bestMoveCountTask.IsAlive) { Console.Write("."); // během trvání výpočtu se budou vypisovat tečky (do console) } Console.Write("\n"); int[] vybranyTah = brain.NejlepsiTah; Nard.VykonejTah(vybranyTah); // vykonam na šachovnici ten ------> vybrany tah vypisTahu = string.Format("{0}{1} → {2}{3}, počet tahů bez zajetí: {4}", (char)(vybranyTah[1] + 'A'), (char)(vybranyTah[0] + '1'), (char)(vybranyTah[5] + 'A'), (char)(vybranyTah[4] + '1'), Nard.PocetTahuBezZajeti()); //vypisTahu = Convert.ToChar(vybranyTah[1] + 65) + (vybranyTah[0] + 1).ToString() + " → " + Convert.ToChar(vybranyTah[5] + 65) + (vybranyTah[4] + 1).ToString(); // místo TahOdkud a TahKam musím zadávat indexy "vybranéhoTahu" // tah se vypiše ...... souřadnice reprezentující písmena se převedou na písmena; čísla zůstanou jen se zvětší o +1, aby odpovídala hodnotám sloupců hracNaTahu = -hracNaTahu; // ....... VÝMĚNA HRÁČE NA TAHU ????????????? } else { bool provedenTah; while (!UzivatelskeVolby(out provedenTah, out bool potlacitChybu)) // pokud plati NEGACE TRUE, tzn. nastává false, vypíše se zpráva // ...... DOVYSVĚTLIT !!!!!!!!!!!! { if (!potlacitChybu) { usCom.VypisZpravu(" -------> Error - Tah neni platny ", false, ConsoleColor.Red); // "false" -> protože tady není žádoucí čekat na Enter (=UserCommunication-VypisZpravu-bool cekaNaVstup), ..... // .....aby se provedl další krok, tady chci rovnou vypsat tu zprávu } } if (provedenTah) { hracNaTahu = -hracNaTahu; } } } Nard.PocetFigur(out int pocetBilych, out int pocetCernych); if (pocetBilych > pocetCernych) { usCom.VypisZpravu("Hra skončila. Vyhrál BÍLÝ hráč.", true, ConsoleColor.Green); } else if (pocetCernych > pocetBilych) { usCom.VypisZpravu("Hra skončila. Vyhrál ČERNÝ hráč.", true, ConsoleColor.Green); } else { usCom.VypisZpravu("Hra skončila remízou.", true, ConsoleColor.Green); } }
// Volby: move, help, generalHelp, ondo, redo, load, save public bool UzivatelskeVolby(out bool provedenTah, out bool potlacitChybu) // <----- pomocí výstupního bool parametru( "out bool provedenTah" ) si z metody UzivatelskeVolby vytáhneme informaci o tom, jestli byl proveden tah........ { // ........ ta proměnná bude true pouze, pokud bude skutečně proveden tah ==> pokud nebyl proveden tah, nezmění se hráč, který je na tahu provedenTah = false; potlacitChybu = false; // ......... DOVYSVĚTLIT !!!!!!!!!!!!!!! int[] Tah; // do promenne 'command' se vlozi "return Command.Move"(=táhni) nebo "return Command.GeneralHelp" + do promenne 'int[] Tah' se vlozi TAH z "out int[] Vlozeno_coords" (<--- všechno viz UserCmmunication metoda Volba()) UserCommunication.Command command = usCom.Volba(hracNaTahu == 1, out Tah); // provede se to, co je v podmince metody Volba, ale hodnota(1 V -1) pro tu metodu se vezme tady z r11 switch (command) { case UserCommunication.Command.Move: provedenTah = ProvedTah(Tah); return(provedenTah); case UserCommunication.Command.GeneralHelp: usCom.VypisZpravu("\n Zadán požadavek o nápovědu všech tahů", false, ConsoleColor.Green); // ....... DOVYSVĚTLIT CELÉ !!!!!!!!!!!!!!!!! brain = new ArtificialIntelligence(Nard, 5, hracNaTahu); brain.VypocitejNejlepsiTah(); int[] vybranyTah = brain.NejlepsiTah; usCom.VypisZpravu(string.Format(" Nejlepší možný tah je: {0}{1} -> {2}{3}\n", (char)(vybranyTah[1] + 'A'), (char)(vybranyTah[0] + '1'), (char)(vybranyTah[5] + 'A'), (char)(vybranyTah[4] + '1')), false, ConsoleColor.Green); potlacitChybu = true; return(false); case UserCommunication.Command.Undo: { bool proveden = Nard.TahZpet(); potlacitChybu = true; if (proveden) { vypisTahu = "Proveden tah zpět"; provedenTah = true; } else { usCom.VypisZpravu("Již nelze provádět tahy vpřed. Jsme na začátku hry.", false, ConsoleColor.Red); } return(proveden); } case UserCommunication.Command.Redo: { bool proveden = Nard.TahVpred(); potlacitChybu = true; if (proveden) { vypisTahu = "Proveden tah vpřed"; provedenTah = true; } else { usCom.VypisZpravu("Již nelze provádět tahy vpřed. Jsme na začátku hry.", false, ConsoleColor.Red); } return(proveden); } case UserCommunication.Command.Load: if (files.LoadGame("default.xml", out Board newBoard, out int newPlayerOnMove, out int player1, out int player2)) // přidáno použití této metody, která je vytvořena ve Files.cs { Nard = newBoard; hracNaTahu = newPlayerOnMove; inteligenceBileho = player1; inteligenceCerneho = player2; usCom.VypisZpravu("Hra byla načtena", true, ConsoleColor.Green); // tato zpráva se vypíše po: 1.načtení Desky, 2.načtení Hráče na TAHU, 3.-4. načtení KDO hraje za Bílé a za Černé } else { usCom.VypisZpravu("Uloženou hru se nepodařilo načíst", true, ConsoleColor.Red); } return(true);