コード例 #1
0
        private void VypocitejNejlepsiTahy()
        {
            rules.GenerujPlatneTahy(nardAI, hracNaTahuAI);            // pomocí pravidel vygeneruju seznam platných tahů a ten seznam si uložíme do proměnné "moves"
            List <int[]> moves = new List <int[]>();                  // <===== objekt TAHy tyou seznam, který je ve formě pole intů

            foreach (int[] oneMove in rules.SeznamPlatnychTahu)       // každy jeden TAH ze seznamu platných tahů NAKLONUJ (jako Typ pole intů).......
            {
                moves.Add(oneMove.Clone() as int[]);                  // ........ a vlož ho do proměnné "moves", která je právě Typu int[]
            }
            // důvodem této akce je: že v minimaxu se ten seznam tahů ve třídě rules bude měnit, ale já potřebuju uchované tyto TAHy, aby jsem je mohl, později, ve smyčce projít jeden po druhém...

            int nejlepsiDosavadniHodnota = -MAX;                    // <----- tuto proměnnou nastavím na nejhorší výsledek; pokud minimax najde lepší, tak tento tah uloží do seznamu a zvedne hodnotu nejlepsiDosavadniHodnota. Pokud najde horší, tak se nikam ukládat nebude

            foreach (int[] move in moves)                           // smyčka, která projde všechny platné tahy ve výchozím postavení - to je to, které hráč vidí na monitoru (do hloubky jde až minimax)
            {
                nardAI.VykonejTah(move);                            // provede se jeden z tahů, otestuje se, jak moc je dobrej ( = zavolá se Minimax ) a na konci se vrátí zpět, aby se mohl vyzkoušet jiný tah
                hracNaTahuAI *= -1;                                 // při každém provedeném tahu se musí změnit hráč na tahu

                int vypocetMinimaxu = -Minimax(hloubkaAI - 1);      // zavolá se výpočet minimaxu, který od daného tahu bude provádět další tahy do hloubky (dle inteligence) a vrátí nějakou číselnou hodnotu, která tomtu tahu bude nějak odpovídat - "jak moc je to výhodný tah"

                // uložení kolekce nejlépe hodnocených tahů
                if (vypocetMinimaxu >= nejlepsiDosavadniHodnota)                   // tady se porovná vypočítaná hodnota tahu. Pokud je stejná, jako ty předchozí, tak se přidá do seznamu. Pokud je lepší, tak se ty horší ze seznamu nejdřív vymažou a pak až se tam uloží tato lepší. Pokud je horší, než ty v seznamu, tak na ni zapomene
                {
                    if (vypocetMinimaxu > nejlepsiDosavadniHodnota)
                    {
                        seznamNejlepsichTahu.Clear();
                        nejlepsiDosavadniHodnota = vypocetMinimaxu;
                    }
                    seznamNejlepsichTahu.Add(move.Clone() as int[]);
                }

                nardAI.TahZpet();
                hracNaTahuAI *= -1;
            }
        }
コード例 #2
0
        public bool LoadGame(string fileName, out Board newBoard, out int playerOnMove, out int player1settings, out int player2settings)
        {
            newBoard        = null;
            player1settings = -1;
            player2settings = -1;

            playerOnMove = 1;
            if (fileName == null)
            {
                return(false);
            }

            int          pointer     = 0;
            List <int[]> loadedMoves = new List <int[]>();

            try
            {
                XmlDocument document = new XmlDocument();
                document.Load(fileName);

                XmlNode root = document.DocumentElement;

                foreach (XmlNode level1node in root)
                {
                    switch (level1node.Name)
                    {
                    case "Players":
                        XmlElement player = (XmlElement)level1node;
                        player1settings = int.Parse(player.GetAttribute("Player1"));
                        player2settings = int.Parse(player.GetAttribute("Player2"));
                        break;

                    case "Moves":
                        XmlElement moves = (XmlElement)level1node;
                        pointer = int.Parse(moves.GetAttribute("Pointer"));
                        foreach (XmlNode level2node in level1node)
                        {
                            XmlElement oneMove = (XmlElement)level2node;
                            int        fromX   = int.Parse(oneMove.GetAttribute("FromX"));
                            int        fromY   = int.Parse(oneMove.GetAttribute("FromY"));
                            int        toX     = int.Parse(oneMove.GetAttribute("ToX"));
                            int        toY     = int.Parse(oneMove.GetAttribute("ToY"));
                            if (ValidateMove(fromX, fromY, toX, toY))
                            {
                                loadedMoves.Add(new int[] { fromX, fromY, toX, toY });
                            }
                            else
                            {
                                return(false);
                            }
                        }
                        break;
                    }
                }
            }


            catch
            {
                return(false);
            }

            if (player1settings < 0 || player1settings > 4 || player2settings < 0 || player2settings > 4)
            {
                return(false);
            }
            if (pointer > loadedMoves.Count)
            {
                return(false);
            }

            newBoard = new Board();
            Rules rules = new Rules();

            rules.NaplnBoard(newBoard);
            foreach (int[] move in loadedMoves)
            {
                bool validMoveFound = false;
                foreach (int[] validMove in rules.GenerujPlatneTahy(newBoard, playerOnMove))
                {
                    if (move[0] == validMove[0] && move[1] == validMove[1] && move[2] == validMove[4] && move[3] == validMove[5])
                    {
                        newBoard.VykonejTah(validMove);
                        playerOnMove  *= -1;
                        validMoveFound = true;
                        break;
                    }
                }
                if (!validMoveFound)
                {
                    return(false);
                }
            }
            while (newBoard.IndexSeznamu > pointer)
            {
                newBoard.TahZpet();
                playerOnMove *= -1;
            }
            return(true);
        }