Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 public static void CallWinnerSelected(BDat state) =>
 OnWinnerSelected?.Invoke(null, state);
Exemple #4
0
 public static void CallPlaceChanged(BDat state) =>
 OnPlaceChanged?.Invoke(null, state);