92 lines
2.1 KiB
C#
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;
|
|
}
|
|
}
|
|
} |