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()); } }
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()); }
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()); }
/// <summary> /// returns array of arrays, sized Nx3 /// </summary> /// <param name="board"></param> /// <returns></returns> public virtual int[][] GetAvailableMoves(Board3D board) { return(new int[0][]); }