/// <summary> /// Hlavní herní smyčka /// </summary> public void Game() { rules.InitBoard(); //inicializace desky ui.SelectPlayer(out player1, out player2); //výběr hráče na tahu rules.InitPlayer(); //inicializace hráče na tahu rules.MovesGenerate(); //vygenerování všech tahů pro aktuálního hráče tj. 1-bílý board.tahuBezSkoku = 0; int kolo = 0; //počítadlo kol int ptrTah = board.HistoryMove.Count; //ukazatel na poslední tah v historii tahů int[] posledniTah = null; //uložen poslední tah while (!rules.IsGameFinished()) //cyklus dokud platí že oba hráči mají figurky, jinak konec { Console.Clear(); ui.PocetKol(kolo); ui.PocetTahuBezSkoku(board.tahuBezSkoku); ui.PrintBoard(board); //Tahy počítače if (rules.PlayerOnMove() == 1 && player1 > 0 || rules.PlayerOnMove() == -1 && player2 > 0) //pokud hráč na tahu je 1 a player1 > 0 tak true, provede tah a continue na dalšího hráče { ui.PcInfo(); int[] move = null; Brain brain = new Brain(board, rules); Thread pc = new Thread(() => move = brain.GetBestMove(rules.PlayerOnMove() == 1 ? player1 : player2)); pc.IsBackground = true; pc.Start(); ConsoleKey pressKey = ConsoleKey.A; while (pc.IsAlive && pressKey != ConsoleKey.Escape && pressKey != ConsoleKey.Z) { if (Console.KeyAvailable) { pressKey = Console.ReadKey().Key; } } if (pressKey == ConsoleKey.Escape) { pc.Abort(); Start(); //zobrazení menu Game(); //start hry continue; } if (pressKey == ConsoleKey.Z) { pc.Abort(); ui.SelectPlayer(out player1, out player2); continue; } else { board.Move(move, true, false); } //pokud tah není skok tak se navýší počítadlo TahuBezSkoku if (move.Length == 8) { board.tahuBezSkoku++; } else { board.tahuBezSkoku = 0; } kolo = board.HistoryMove.Count / 2; //přičtení do počítadla kol rules.ChangePlayer(); rules.MovesGenerate(); //Thread.Sleep(1500); continue; } //Tahy Hráče int[] vstup = null; int[] plnyVstup = null; bool platnyVstup = false; while (!platnyVstup) //Dokud je vstup !playtnyVstup tak pokračuje { vstup = ui.InputUser(rules.PlayerOnMove(), board); //pokud -1 tak se podmínka neprovede protože -1 >= 0, pokud 0 tak se provede 0=0 a zkontroluje se platnost tahu //Výpis historie tahu if (vstup[0] == -4) { ui.PrintHelpMove(board.HistoryMove, board); } //Možnost tahu zpět/undo if (vstup[0] == -3) { if (ptrTah > 0) { ptrTah--; posledniTah = board.HistoryMove[ptrTah]; moveServices.TahZpet(board, rules, ui, ptrTah, posledniTah, kolo); //ptrTah--; //posledniTah = board.HistoryMove[ptrTah]; //board.Move(posledniTah, false, true); //rules.ChangePlayer(); //Console.Clear(); //kolo = board.HistoryMove.Count / 2; //ui.PocetKol(kolo); //board.VypocitejTahyBezSkoku(ptrTah); //ui.PocetTahuBezSkoku(board.tahuBezSkoku); //ui.PrintBoard(board); //rules.MovesGenerate(); } } //Možnost tahu vpřed/redo if (vstup[0] == -6) { if (ptrTah < board.HistoryMove.Count && board.HistoryMove.Count > 0) { posledniTah = board.HistoryMove[ptrTah]; moveServices.TahVpred(board, rules, ui, ptrTah, posledniTah, kolo); //board.Move(posledniTah, false, false); //ptrTah++; //rules.ChangePlayer(); //Console.Clear(); //kolo = board.HistoryMove.Count / 2; //ui.PocetKol(kolo); //board.VypocitejTahyBezSkoku(ptrTah); //ui.PocetTahuBezSkoku(board.tahuBezSkoku); //ui.PrintBoard(board); //rules.MovesGenerate(); } } //Pokud hráč do konzole zadá HELP if (vstup[0] == -2) { if (vstup.Length > 1) //Pokud ještě zadá pro jakou figurku chce help { ui.PrintHelpMove(rules.GetMovesList(vstup[1], vstup[2]), board); //pro zadanou figurku } else //Vypíše všechny možné tahy hráče na tahu { ui.PrintHelpMove(rules.GetMovesList(), board); //všechny možné tahy hráče //ui.PrintHelpMove(board.HistoryMove); //všechny možné tahy hráče } } //SPRÁVNĚ if (vstup[0] >= 0) //pokud je zadán správný pohyb tj A2-B3 { plnyVstup = rules.FullMove(vstup); //převedení na kompletní pohyb který se skládá ze 4 souřadnic X,Y, stav před, stav po platnyVstup = plnyVstup[0] != -1; //ověření zda je táhnuto dle pravidel, typ bool ve while cyklu ClearHistoryFromToEnd(ptrTah); if (!platnyVstup) //pokud není vypíše uživately chybu { ui.Mistake(); //chyba } } //Uložení hry if (vstup[0] == -8) { data.SaveGame(player1, player2, ptrTah, board.HistoryMove); } //Načítání hry if (vstup[0] == -9) { Board loadBoard; Rules loadRules; int loadPlayer1, loadPlayer2; if (data.LoadGame(out loadBoard, out loadRules, out loadPlayer1, out loadPlayer2, out int loadUkazatel, out int loadTahuBezSkoku)) { board = loadBoard; rules = loadRules; player1 = loadPlayer1; player2 = loadPlayer2; ptrTah = board.HistoryMove.Count; board.tahuBezSkoku = loadTahuBezSkoku; while (ptrTah > loadUkazatel) //pokud aktuální ukazatel je větší než načtený { ptrTah--; //aktualní se zmenší board.Move(board.HistoryMove[ptrTah], false, true); rules.ChangePlayer(); } Console.Clear(); kolo = board.HistoryMove.Count / 2; ui.PocetKol(kolo); ui.PocetTahuBezSkoku(board.tahuBezSkoku); ui.PrintBoard(board); rules.MovesGenerate(); } else { ui.Mistake(); } } //Zpět do menu if (vstup[0] == -5) { Console.Clear(); Start(); Game(); } } board.Move(plnyVstup, true, false); //pokud je zadáno správně, metoda nastaví pohyb na desce ptrTah = board.HistoryMove.Count; //počítání kol kolo = board.HistoryMove.Count / 2; if (plnyVstup.Length == 8) { board.tahuBezSkoku++; } else { board.tahuBezSkoku = 0; } if (rules.ListMove.Count == 0) //pokud je ListMove prázdnej tak se změní hráč na tahu a vygenerují se pro něj nové možné tahy { rules.ChangePlayer(); rules.MovesGenerate(); } else //pokud v listu stále je možnost, tak pokračuje hráč, vícenásobné skoky { continue; } }