/// <summary> /// Check how many neighbors and callback max neighbors /// </summary> /// <param name="data">Board Data</param> /// <param name="start">Start base</param> /// <param name="length">length of scan</param> /// <param name="callback">callback of max</param> /// <returns>Max neighbor scan</returns> public static int CheckNeighbors(this BDat[,] data, BDat start, int length, Action <int, BDat> callback) { var dirs = new List <int>(); for (var i = 0; i < typeof(ScanDirection).GetEnumNames().Length; i++) { var dir = (ScanDirection)i; var amount = data.CheckDirection(start, dir, length); dirs.Add(amount); } var max = dirs.Max(); callback?.Invoke(max, start); return(max); }
private static int CheckDirection(this BDat[,] data, BDat start, ScanDirection dir, int length) { var maxSizeX = data.GetLength(1); var maxSizeY = data.GetLength(0); var total = 0; var s = new Vector2(start.X, start.Y); switch (dir) { case ScanDirection.Up: for (var i = 0; i < length; i++) { // Take bounds into consideration if (0 > s.Y - i) { continue; } var next = data[s.Y - i, s.X]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.Down: for (var i = 0; i < length; i++) { // Take bounds into consideration if (maxSizeY <= s.Y + i) { continue; } var next = data[s.Y + i, s.X]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.Left: for (var i = 0; i < length; i++) { // Take bounds into consideration if (0 > s.X - i) { continue; } var next = data[s.Y, s.X - i]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.Right: for (var i = 0; i < length; i++) { // Take bounds into consideration if (maxSizeX <= s.X + i) { continue; } var next = data[s.Y, s.X + i]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.DiagLeftDown: for (var i = 0; i < length; i++) { // Take bounds into consideration if (0 > s.X - i || 0 > s.Y - i) { continue; } var next = data[s.Y - i, s.X - i]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.DiagLeftUp: for (var i = 0; i < length; i++) { // Take bounds into consideration if (maxSizeY <= s.Y + i || 0 > s.X - i) { continue; } var next = data[s.Y + i, s.X - i]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.DiagRightDown: for (var i = 0; i < length; i++) { // Take bounds into consideration if (0 > s.Y - i || maxSizeX <= s.X + i) { continue; } var next = data[s.Y - i, s.X + i]; if (next.StateChar != start.StateChar) { break; } total++; } break; case ScanDirection.DiagRightUp: for (var i = 0; i < length; i++) { // Take bounds into consideration if (maxSizeY <= s.Y + i || maxSizeX <= s.X + i) { continue; } var next = data[s.Y + i, s.X + i]; if (next.StateChar != start.StateChar) { break; } total++; } break; } return(total); }
public static void CallWinnerSelected(BDat state) => OnWinnerSelected?.Invoke(null, state);
public static void CallPlaceChanged(BDat state) => OnPlaceChanged?.Invoke(null, state);