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; } }
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); }