Пример #1
0
        /// <summary>
        /// Metoda pro vytvoření nejlepšího tahu
        /// </summary>
        /// <param name="hloubka"></param>
        /// <returns></returns>
        private List <int[]> GetBestMoves(int hloubka)
        {
            //vytvořime kopii seznamu všech tahů a pak ještě kolekci těch nejlepších tahů, které vrátíme
            List <int[]> nejlepsiTahy = new List <int[]>();
            List <int[]> tahy         = new List <int[]>(); //všechny tahy hráče na tahu, tj.bílého

            foreach (int[] tah in rules.GetMovesList())
            {
                tahy.Add(tah.Clone() as int[]);
            }
            if (tahy.Count <= 1) //Pokud seznam obsahuje jen jeden, nebo žádný tah, tak se rovnou vrátí. Protože je povinost skákat. Tento tah je nejlepší, není potřeba nic prohledávat
            {
                return(tahy);
            }

            int hodnotaNejlepsihoTahu = -MAX;

            //Smyčka projede všechny tahy a provede je
            foreach (int[] tah in tahy)
            {
                board.Move(tah, false, false); //provedení
                rules.ChangePlayer();          //změna hráče
                rules.MovesGenerate();         //generování všech tahů pro hráče na tahu

                /*Tady bude první volání minimaxu, které nám vrátí nejvýhodnější hodnotu v daném směru.
                 * Takže budeme vědět jak moc výhodný je pro nás tento směr.
                 * Pokud je je lepší, než ty co už máme, tak je nahradíme. Pokud je stejný, tak ho k nim přidáme.
                 * Pokud je horší, tak jdem na další z možných tahů...
                 * Tyto Ify
                 */

                int hodnota = -MiniMax(hloubka - 1);

                if (hodnota >= hodnotaNejlepsihoTahu)    //pokud hodnota vrácená hodnota z minimaxu je větší nebo rovna -99, tak true a uloží se do seznamu nejlepších tahů
                {
                    if (hodnota > hodnotaNejlepsihoTahu) //pokud je pouze větší tj. 95 > -99
                    {
                        nejlepsiTahy.Clear();            //seznam se vymaže
                        hodnotaNejlepsihoTahu = hodnota; //a naše vrácená hodnota je nyní naše hodnotaNejlepsihoTahu
                    }
                    nejlepsiTahy.Add(tah.Clone() as int[]);
                }

                board.Move(tah, false, true); //tahy se provedou zpět
                rules.ChangePlayer();         // změní se hráč na tahu
            }
            rules.MovesGenerate();            //vygenerují se zase tahy pro hráče na tahu
            return(nejlepsiTahy);             //náš nejlepšítah je vrácen
        }
Пример #2
0
 /// <summary>
 /// Metoda pro tahVpřed
 /// </summary>
 /// <param name="board"></param>
 /// <param name="rules"></param>
 /// <param name="ui"></param>
 /// <param name="ptrTah"></param>
 /// <param name="posledniTah"></param>
 /// <param name="kolo"></param>
 public void TahVpred(Board board, Rules rules, UI ui, int ptrTah, int[] posledniTah, int 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();
 }
Пример #3
0
        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);
            }
        }
Пример #4
0
        /// <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;
                }
            }