Exemplo n.º 1
0
        public override int[][] GetAvailableMoves(Board3D board)
        {
            var moves     = new List <int[]>();
            var direction = Side switch
            {
                FigureSide.White => 1,
                FigureSide.Black => - 1,
                _ => throw new InvalidOperationException("only white and black sides now supported")
            };

            for (int i = X - 1; i <= X + 1; i++)
            {
                if (!(board.CellsNum > i && i >= 0))
                {
                    continue;
                }
                for (int k = Z - 1; k <= Z + 1; k++)
                {
                    if (!(board.CellsNum > k && k >= 0 && board.CellsNum > Y + direction && Y + direction >= 0))
                    {
                        continue;
                    }

                    if (k == Z && board.Cells[i, Y + direction, k].Representation == FigureRepresentation.Empty ||
                        k != Z && board.Cells[i, Y + direction, k].Representation != FigureRepresentation.Empty &&
                        board.Cells[i, Y + direction, k].Side != Side)
                    {
                        moves.Add(new [] { i, Y + direction, k });
                    }
                }
            }

            return(moves.ToArray());
        }
    }
Exemplo n.º 2
0
        public override int[][] GetAvailableMoves(Board3D board)
        {
            var moves     = new List <int[]>();
            var maxLength = board.CellsNum - 1;

            for (int i = -1; i <= 1; i++)
            {
                for (int j = -1; j <= 1; j++)
                {
                    for (int k = -1; k <= 1; k++)
                    {
                        if (i == 0 && j == 0 && k == 0)
                        {
                            continue;
                        }
                        if (X + i >= 0 && Y + j >= 0 && Z + k >= 0 &&
                            X + i <= maxLength && Y + j <= maxLength && Z + k <= maxLength &&
                            board.Cells[X + i, Y + j, Z + k].Side != Side)
                        {
                            moves.Add(new [] { X + i, Y + j, Z + k });
                        }
                    }
                }
            }

            return(moves.ToArray());
        }
Exemplo n.º 3
0
        public override int[][] GetAvailableMoves(Board3D board)
        {
            var moves  = new List <int[]>();
            var maxPos = board.CellsNum - 1;

            void LastFloor(int floor)
            {
                if (maxPos >= floor && floor >= 0)
                {
                    if (maxPos >= Y - 1 && Y - 1 >= 0 && board.Cells[floor, Y - 1, Z].Side != Side)
                    {
                        moves.Add(new[] { floor, Y - 1, Z });
                    }
                    if (maxPos >= Y + 1 && Y + 1 >= 0 && board.Cells[floor, Y + 1, Z].Side != Side)
                    {
                        moves.Add(new[] { floor, Y + 1, Z });
                    }
                    if (maxPos >= Z - 1 && Z - 1 >= 0 && board.Cells[floor, Y, Z - 1].Side != Side)
                    {
                        moves.Add(new[] { floor, Y, Z - 1 });
                    }
                    if (maxPos >= Z + 1 && Z + 1 >= 0 && board.Cells[floor, Y, Z + 1].Side != Side)
                    {
                        moves.Add(new[] { floor, Y, Z + 1 });
                    }
                }
            }

            void PreLastFloor(int floor)
            {
                if (maxPos >= floor && floor >= 0)
                {
                    if (maxPos >= Y - 2 && Y - 2 >= 0 && board.Cells[floor, Y - 2, Z].Side != Side)
                    {
                        moves.Add(new[] { floor, Y - 2, Z });
                    }
                    if (maxPos >= Y + 2 && Y + 2 >= 0 && board.Cells[floor, Y + 2, Z].Side != Side)
                    {
                        moves.Add(new[] { floor, Y + 2, Z });
                    }
                    if (maxPos >= Z - 2 && Z - 2 >= 0 && board.Cells[floor, Y, Z - 2].Side != Side)
                    {
                        moves.Add(new[] { floor, Y, Z - 2 });
                    }
                    if (maxPos >= Z + 2 && Z + 2 >= 0 && board.Cells[floor, Y, Z + 2].Side != Side)
                    {
                        moves.Add(new[] { floor, Y, Z + 2 });
                    }
                }
            }

            void MiddleFloor()
            {
                if (maxPos >= Y - 2 && Y - 2 >= 0)
                {
                    if (maxPos >= Z - 1 && Z - 1 >= 0 && board.Cells[X, Y - 2, Z - 1].Side != Side)
                    {
                        moves.Add(new[] { X, Y - 2, Z - 1 });
                    }
                    if (maxPos >= Z + 1 && Z + 1 >= 0 && board.Cells[X, Y - 2, Z + 1].Side != Side)
                    {
                        moves.Add(new[] { X, Y - 2, Z + 1 });
                    }
                }

                if (maxPos >= Y - 1 && Y - 1 >= 0)
                {
                    if (maxPos >= Z - 2 && Z - 2 >= 0 && board.Cells[X, Y - 1, Z - 2].Side != Side)
                    {
                        moves.Add(new[] { X, Y - 1, Z - 2 });
                    }
                    if (maxPos >= Z + 2 && Z + 2 >= 0 && board.Cells[X, Y - 1, Z + 2].Side != Side)
                    {
                        moves.Add(new[] { X, Y - 1, Z + 2 });
                    }
                }

                if (maxPos >= Y + 1 && Y + 1 >= 0)
                {
                    if (maxPos >= Z - 2 && Z - 2 >= 0 && board.Cells[X, Y + 1, Z - 2].Side != Side)
                    {
                        moves.Add(new[] { X, Y + 1, Z - 2 });
                    }
                    if (maxPos >= Z + 2 && Z + 2 >= 0 && board.Cells[X, Y + 1, Z + 2].Side != Side)
                    {
                        moves.Add(new[] { X, Y + 1, Z + 2 });
                    }
                }

                if (maxPos >= Y + 2 && Y + 2 >= 0)
                {
                    if (maxPos >= Z - 1 && Z - 1 >= 0 && board.Cells[X, Y + 2, Z - 1].Side != Side)
                    {
                        moves.Add(new[] { X, Y + 2, Z - 1 });
                    }
                    if (maxPos >= Z + 1 && Z + 1 >= 0 && board.Cells[X, Y + 2, Z + 1].Side != Side)
                    {
                        moves.Add(new[] { X, Y + 2, Z + 1 });
                    }
                }
            }

            // floor 1
            LastFloor(X - 2);

            // floor 2
            PreLastFloor(X - 1);

            // floor 3
            MiddleFloor();

            // floor 4
            PreLastFloor(X + 1);

            // floor 5
            LastFloor(X + 2);


            return(moves.ToArray());
        }
Exemplo n.º 4
0
 /// <summary>
 /// returns array of arrays, sized Nx3
 /// </summary>
 /// <param name="board"></param>
 /// <returns></returns>
 public virtual int[][] GetAvailableMoves(Board3D board)
 {
     return(new int[0][]);
 }