private static List <Move> GetPawnMoves(IGameBoardState gameBoard, IPieceState piece) { List <Move> moves = new List <Move>(); int moveDirection = GetPawnMoveDirection(piece); int pawnStartRow = GetPawnStartRow(gameBoard, piece); int possibleDistance; //check one space ahead, two spaces ahead if on starting row if (piece.GetSpaceState().GetRow() == pawnStartRow) { possibleDistance = 2; } else { possibleDistance = 1; } int[] vOffsets = { -1, 0, 1 }; foreach (int vOffset in vOffsets) { for (int i = 1; i <= possibleDistance; i++) { ISpaceState cSpace = gameBoard.GetSpaceState(piece.GetSpaceState().GetLevel() + vOffset, piece.GetSpaceState().GetRow() + moveDirection * i, piece.GetSpaceState().GetCol()); if (cSpace != null && cSpace.IsOccupied()) { break; } else if (cSpace != null) { moves.Add(new Move(piece, cSpace, Move.MoveType.nocap)); } } } //check diagonals for possible capture int[] cOffsets = { -1, 1 }; foreach (int vOffset in vOffsets) { foreach (int cOffset in cOffsets) { ISpaceState cSpace = gameBoard.GetSpaceState(piece.GetSpaceState().GetLevel(), piece.GetSpaceState().GetRow() + moveDirection, piece.GetSpaceState().GetCol() + cOffset); if (cSpace != null && cSpace.IsOccupied() && cSpace.Occupier().GetPlayer() != piece.GetPlayer()) { moves.Add(new Move(piece, cSpace, Move.MoveType.cap)); } } } //TODO: check for en passant return(moves); }
public GameBoardState Clone() { GameBoardState newGbs = new GameBoardState(this.levels, this.rows, this.cols); IGameBoardState igbs = this; for (int lvl = 0; lvl < (igbs.GetNumLevels()); lvl++) { for (int row = 0; row < (igbs.GetNumRows()); row++) { for (int col = 0; col < (igbs.GetNumCols()); col++) { ISpaceState iss = igbs.GetSpaceState(lvl, row, col); newGbs.spaces[lvl][row][col].occupied = iss.IsOccupied(); IPieceState ips = iss.Occupier(); if (ips != null) { PieceState ps = ips.CreatePieceState(); newGbs.spaces[lvl][row][col].occupier = ps; newGbs.AlivePieces.Add(ps); ps.space = newGbs.spaces[lvl][row][col]; } } } } foreach (IPieceState piece in DeadPieces) { newGbs.DeadPieces.Add(piece.CreatePieceState()); } return(newGbs); }
public void RenderBoard(IGameBoardState gameBoard) { int levels = gameBoard.GetNumLevels(); int rows = gameBoard.GetNumRows(); int cols = gameBoard.GetNumCols(); for (int i = 0; i < levels; i++) { for (int j = 0; j < rows; j++) { for (int k = 0; k < cols; k++) { Image img = squareLookup[i][j][k]; if (img != null) { if (gameBoard.GetSpaceState(i, j, k).IsOccupied()) { Piece.PieceType pieceType = gameBoard.GetSpaceState(i, j, k).Occupier().GetPieceType(); img.sprite = PieceSprites[pieceType]; img.color = gameBoard.GetSpaceState(i, j, k).Occupier().GetPieceTint(); img.Desaturate(); } else { img.sprite = BlankSprite; img.color = Color.white; } } else { Debug.Log("Error: image not found at index " + i + " " + j + " " + k); } } } } }
private static List <Move> GetMovesInDirection(IGameBoardState gameBoard, IPieceState piece, int levelDirection, int rowDirection, int colDirection, int max = 99) { List <Move> moves = new List <Move>(); int levelChange = levelDirection; int rowChange = rowDirection; int colChange = colDirection; for (int i = 0; i < max; i++) { ISpaceState cSpace = gameBoard.GetSpaceState(piece.GetSpaceState().GetLevel() + levelChange, piece.GetSpaceState().GetRow() + rowChange, piece.GetSpaceState().GetCol() + colChange); if (cSpace == null) { break; } if (cSpace.IsOccupied() && cSpace.Occupier().GetPlayer() != piece.GetPlayer()) { //last move in the sequence is a cap move moves.Add(new Move(piece, cSpace, Move.MoveType.cap)); break; } if (cSpace.IsOccupied() && cSpace.Occupier().GetPlayer() == piece.GetPlayer()) { break; } if (!cSpace.IsOccupied()) { moves.Add(new Move(piece, cSpace, Move.MoveType.nocap)); //amplify move for next iteration levelChange += levelDirection; rowChange += rowDirection; colChange += colDirection; } } return(moves); }