using ProjectGrid.Models; using ProjectGrid.TicTacToc; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; namespace ProjectGrid.AI { public class TicTacTocBrain { private TicTacTocBoard _board; private int _player; private List _prio; public TicTacTocBrain(TicTacTocBoard board, int player) { _board = board; _player = player; var rand = new Random(); _prio = (new List { 0, 1, 2, 3, 4, 5, 6, 7, 8 }).OrderBy(i => rand.Next()).ToList(); } public int Turn() { if (_board.Field[4] == (int)Player.EMPTY) { //_board.SetFieldValue(_player, 5); return 4; } int blocking = -1; for (int x = 0; x < TicTacTocBoard._winning.GetLength(0); x++) { var _1 = _board.Field[TicTacTocBoard._winning[x, 0]]; var _2 = _board.Field[TicTacTocBoard._winning[x, 1]]; var _3 = _board.Field[TicTacTocBoard._winning[x, 2]]; // any field set? if (_1 + _2 + _3 == 0) continue; var result = MatchWinning(_1, _2, _3); if (result.Item1 >= 0) return TicTacTocBoard._winning[x, result.Item1]; if (result.Item2 >= 0) blocking = TicTacTocBoard._winning[x, result.Item2]; } if (blocking >= 0) return blocking; foreach (var i in _prio) if (_board.Field[i] == 0) return i; Debug.Fail("Brain found no valid move!"); return -1; } private (int win, int block) MatchWinning(int _1, int _2, int _3) { (int win, int block) result = (-1, -1); if (_1 == _2 && _1 != 0 && _3 == 0) { if (_1 == _player) result.win = 2; else result.block = 2; } else if (_1 == _3 && _1 != 0 && _2 == 0) { if (_1 == _player) result.win = 1; else result.block = 1; } else if (_2 == _3 && _2 != 0 && _1 == 0) { if (_1 == _player) result.win = 0; else result.block = 0; } return result; } } }