public loopConfig(squarePos position, vectorDirection dir) { switch (dir) { case vectorDirection.left: startX = position.x - 1; finishX = -1; startY = position.y; finishY = startY + 1; directionX = -1; directionY = 0; break; case vectorDirection.right: startX = position.x + 1; finishX = baseBoard.sizeX; startY = position.y; finishY = startY + 1; directionX = +1; directionY = 0; break; case vectorDirection.up: startY = position.y + 1; finishY = baseBoard.sizeY; startX = position.x; finishX = position.x + 1; directionX = 0; directionY = +1; break; case vectorDirection.down: startY = position.y - 1; finishY = -1; startX = position.x; finishX = position.x + 1; directionX = 0; directionY = -1; break; case vectorDirection.leftup: startY = position.y + 1; startX = position.x - 1; finishY = baseBoard.sizeY; finishX = -1; directionY = +1; directionX = -1; break; case vectorDirection.leftdown: startY = position.y - 1; startX = position.x - 1; finishY = -1; finishX = -1; directionY = -1; directionX = -1; break; case vectorDirection.rightup: startY = position.y + 1; startX = position.x + 1; finishY = baseBoard.sizeY; finishX = baseBoard.sizeX; directionY = +1; directionX = +1; break; case vectorDirection.rightdown: startY = position.y - 1; startX = position.x + 1; finishY = -1; finishX = baseBoard.sizeX; directionY = -1; directionX = +1; break; default: throw new ArgumentOutOfRangeException("dir"); } }
/// <summary> /// Find moves in a given direction, including captures /// </summary> /// <param name="addTo"></param> /// <param name="onThis">The board to move on</param> /// <param name="dir">The vectorDirection to move in</param> /// <returns>A List<move> of moves</returns> public sizableArray<move> getMovesForVector(sizableArray<move> addTo, baseBoard onThis, vectorDirection dir) { if (addTo == null) addTo = new sizableArray<move>(8); loopConfig lcfg = new loopConfig(position, dir); int x = lcfg.startX; int y = lcfg.startY; while ((x != lcfg.finishX) && (y != lcfg.finishY)) { squarePos sqPos = new squarePos(x, y); // If the square is empty, we can move to it.. if (onThis[sqPos].type == pieceType.none) { addTo.Add(new move(onThis[position], onThis[sqPos])); } else { if (onThis[sqPos].colour != colour ) { // the square is occupied by an enemy piece. we can move to it, // but no further. addTo.Add(new move(onThis[position], onThis[sqPos])); } break; } x += lcfg.directionX; y += lcfg.directionY; } return addTo; }
protected void getSquaresCoveredForVector(sizableArray<square> addTo, baseBoard onThis, vectorDirection dir) { if (addTo == null) addTo = new sizableArray<square>(8); loopConfig lcfg = new loopConfig(position, dir); int x = lcfg.startX; int y = lcfg.startY; while ((x != lcfg.finishX) && (y != lcfg.finishY)) { squarePos sqPos = new squarePos(x, y); // If the square is empty, we can move to it.. if (onThis[sqPos].type == pieceType.none) { addTo.Add( onThis[sqPos] ); } else { // the square is occupied by some piece. We are covering it, but we cannot go any further. addTo.Add( onThis[sqPos] ); break; } x += lcfg.directionX; y += lcfg.directionY; } return; }
public void testVectorMovement(List<squarePos> expectedPos, vectorDirection dir) { DoktorChessAIBoard ourBoard = new DoktorChessAIBoard(gameType.queenAndPawns, boardSearchConfig.getDebugConfig()); squarePos srcSquare = new squarePos(3, 3); ourBoard.addPiece(pieceType.queen, pieceColour.white, srcSquare.x, srcSquare.y); queenSquare queenie = (queenSquare)ourBoard[srcSquare]; List<move> expectedmoves = new List<move>(expectedPos.Count); foreach (squarePos thisPos in expectedPos) expectedmoves.Add(new move((square) queenie, ourBoard[thisPos])); sizableArray<move> possibleMoves = queenie.getMovesForVector(null, ourBoard, dir); testListsAreOfSameMoves(expectedmoves, possibleMoves); }