//toto by malo vracat aktualny tah + diagnosticke data(list poloziek point,score) public static ComputerMove GetComputerMove(int [,] gameMap) { //MINIMAX //v prvom kole prejst vsetky mozne tahy a ohodnotit ich //ak je niekde vyherny tah, pouzit ho //ak su niekde neutralne tahy, rozvinut ich dalej //vytvorit strom protivnikovych tahov //kazdu polozku stromu dalej ohodnotit //vytvorenie noveho stromu so vsetkymi tahmi podla aktualneho stavu AItree root = new AItree(gameMap); int maxScore = -1000; int index = 0; //prejst vsetkych hlavnych potomkov korena stromu for (int i = 0; i < root.tree.Count; i++) { //vybrat potomka s najvyssim skore, ak je ale skore protivnika vyssie, vybrat to if (root.tree[i].score > maxScore || Math.Abs(root.tree[i].score) > maxScore) { maxScore = root.tree[i].score; index = i; } } //protivnik ma vyssie skore, treba branit maxScore = -1000; if (maxScore < 0) { index = 0; for (int i = 0; i < root.tree.Count; i++) { if (root.tree[i].score > maxScore) { maxScore = root.tree[i].score; index = i; } } } //zahrat tah s najlepsim skore ComputerMove move = new ComputerMove { finalPosition = root.tree[index].position }; foreach (AItree leaf in root.tree) { MoveData data = new MoveData() { coords = leaf.position, score = leaf.score }; move.allMoves.Add(data); } return(move); }
/// <summary> /// Tah protivnika /// </summary> private async void ComputerMove() { await Task.Delay(200); //zahrat tah s najlepsim skore ComputerMove allData = GameEngine.GetComputerMove(gameMap); Point move = allData.finalPosition; ShowGameData(allData.allMoves); int row = (int)move.X; int column = (int)move.Y; Button opponentButton = (Button)GetGridElement(GameGrid, row, column); opponentButton.Content = (playerSymbol == PlayerSymbol.O) ? PlayerSymbol.X : PlayerSymbol.O; opponentButton.Foreground = (playerSymbol == PlayerSymbol.X) ? Brushes.LightBlue : Brushes.LightPink; opponentButton.Background = Brushes.DarkGreen; gameMap[row, column] = 2; isPlayerTurn = true; CheckEndGame(); }