public bool LoadGame(out Board board, out Rules rules, out int player1, out int player2, out int loadUkazatel, out int loadTahuBezSkoku) { using (StreamReader sr = new StreamReader(@"save.txt")) { board = new Board(); rules = new Rules(board); player1 = 0; player2 = 0; loadTahuBezSkoku = 0; string prvniRadek = sr.ReadLine(); //načtení prvniho radku char hrac1 = prvniRadek[8]; //načtení znaku z prvnihoradku player1 = (int)(hrac1 - '0'); //převod charu na int string druhyRadek = sr.ReadLine(); char hrac2 = druhyRadek[8]; player2 = (int)(hrac2 - '0'); string tretiRadek = sr.ReadLine(); char ptr = tretiRadek[8]; loadUkazatel = (int)(ptr - '0'); List <int[]> seznam = new List <int[]>(); string historieTahu; while ((historieTahu = sr.ReadLine()) != null) { int[] celyPohyb = new int[0]; for (int i = 0; i < historieTahu.Length; i += 4) { int[] castPohybu = new int[] { (historieTahu[i] - 'a'), (historieTahu[i + 1] - '1'), CharToStone(historieTahu[i + 2]), CharToStone(historieTahu[i + 3]) }; celyPohyb = celyPohyb.Concat(castPohybu).ToArray(); } seznam.Add(celyPohyb); } foreach (int[] skok in seznam) { if (skok.Length == 8) { loadTahuBezSkoku++; } else { loadTahuBezSkoku = 0; } } if (player1 < 0 || player1 > 4) { return(false); } if (player2 < 0 || player2 > 4) { return(false); } if (loadUkazatel > seznam.Count) { return(false); } rules.InitBoard(); rules.InitPlayer(); foreach (int[] pohyb in seznam) { rules.MovesGenerate(); bool pohybNalezen = false; //proměná bool pro nalezení pohybu foreach (int[] tahListu in rules.ListMove) //pro každý int[] v ListMove { if (pohyb.SequenceEqual(tahListu)) //Srovnání zda se pohyb ze seznamu == tahListu z ListMove { board.Move(pohyb, true, false); //ano provede se tah pohybNalezen = true; //nastaví se na true break; //ukončí se cyklus } } if (pohybNalezen) //true { rules.ChangePlayer(); //provede se změna hráče } else { return(false); } } return(true); } }
/// <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; } }