ProjectGrid/Logic/AI/TicTacTocBrain.cs

92 lines
2.1 KiB
C#

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<int> _prio;
public TicTacTocBrain(TicTacTocBoard board, int player)
{
_board = board;
_player = player;
var rand = new Random();
_prio = (new List<int> { 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;
}
}
}