CheckersState extends TwoDimensionalBoardGameState { @SuppressWarnings("unchecked") @Override public <T extends BoardGameState> Set<T> possibleBoardGameStates(T currentState) { Set<T> possibleNonJump = new HashSet<T>(); Set<T> possibleJump = new HashSet<T>(); List<Point> checkMoves = new ArrayList<Point>(); if(doubleJumpCheck != null){ checkMoves.add(doubleJumpCheck); }else{ for(int i = 0; i < BOARD_WIDTH; i++){ for(int j = 0; j < BOARD_WIDTH; j++){ if(nextPlayer == BLACK_CHECK){ if(boardState[i][j] == BLACK_CHECK || boardState[i][j] == BLACK_CHECK_KING){ checkMoves.add(new Point(i, j)); } }else{ if(boardState[i][j] == RED_CHECK || boardState[i][j] == RED_CHECK_KING){ checkMoves.add(new Point(i, j)); } } } } } for(Point check : checkMoves){ int checkX = (int) check.getX(); int checkY = (int) check.getY(); for(int dX = -1; dX <= 1; dX++){ for(int dY = -1; dY <= 1; dY++){ if(dX != 0 && dY != 0){ int x = checkX + dX; int y = checkY + dY; Point moveTo = new Point(x, y); if(isPointInBounds(moveTo)){ CheckersState temp = (CheckersState) currentState.copy(); if(checkMovement(check, moveTo)){ if(ableToJump(check, moveTo)){ temp.moveDoublePoint(check, moveTo); possibleJump.add((T) temp); possibleNonJump.clear(); }else{ temp.moveDoublePoint(check, moveTo); possibleNonJump.add((T) temp); } } } } } } } if(!possibleJump.isEmpty()){ return possibleJump; }else{ return possibleNonJump; } } CheckersState();  CheckersState(CheckersState state);   CheckersState(int[][] newBoard, int player, List<Integer> win); int getNumPlayers(); List<Integer> getWinners(); @Override boolean endState(); @Override double[] getDescriptor(); @Override boolean moveDoublePoint(Point moveThis, Point moveTo); @SuppressWarnings("unchecked") @Override CheckersState copy(); @SuppressWarnings("unchecked") @Override Set<T> possibleBoardGameStates(T currentState); @Override void setupStartingBoard(); @Override int getBoardWidth(); @Override int getBoardHeight(); @Override char[] getPlayerSymbols(); @Override Color[] getPlayerColors(); @Override boolean moveSinglePoint(Point goTo); @Override boolean moveOnePiece(); static final int BOARD_WIDTH; static final int STARTCHECKS; static final int BLACK_CHECK; static final int BLACK_CHECK_KING; static final int RED_CHECK; static final int RED_CHECK_KING; public Point doubleJumpCheck; }
@Test public void testPossibleBoardGameStates() { Set<CheckersState> startSet = start.possibleBoardGameStates(start); Set<CheckersState> startTest = new HashSet<CheckersState>(); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,E,E,B,E,B,E,B}, {B,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,E,E,B,E,B,E,B}, {E,E,B,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,B,E,E,E,B,E,B}, {E,E,B,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,B,E,E,E,B,E,B}, {E,E,E,E,B,E,E,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,B,E,B,E,E,E,B}, {E,E,E,E,B,E,E,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,B,E,B,E,E,E,B}, {E,E,E,E,E,E,B,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); startTest.add(new CheckersState(new int[][]{{E,B,E,B,E,B,E,B}, {B,E,B,E,B,E,B,E}, {E,B,E,B,E,B,E,E}, {E,E,E,E,E,E,B,E}, {E,E,E,E,E,E,E,E}, {R,E,R,E,R,E,R,E}, {E,R,E,R,E,R,E,R}, {R,E,R,E,R,E,R,E}}, 1, new ArrayList<Integer>())); for(CheckersState state : startSet){ assertTrue(startTest.contains(state)); } Set<CheckersState> test1Set = test1.possibleBoardGameStates(test1); Set<CheckersState> test1Test = new HashSet<CheckersState>(); test1Test.add(new CheckersState(new int[][]{{E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,BK,E ,E ,E ,E ,E}, {E ,E ,E ,E, E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,RK,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}}, 1, new ArrayList<Integer>())); test1Test.add(new CheckersState(new int[][]{{E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,BK,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,RK,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}}, 1, new ArrayList<Integer>())); test1Test.add(new CheckersState(new int[][]{{E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,BK,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,RK,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}}, 1, new ArrayList<Integer>())); test1Test.add(new CheckersState(new int[][]{{E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,BK,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,RK,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}, {E ,E ,E ,E ,E ,E ,E ,E}}, 1, new ArrayList<Integer>())); for(CheckersState state : test1Set){ assertTrue(test1Test.contains(state)); } Set<CheckersState> test2Set = test2.possibleBoardGameStates(test2); Set<CheckersState> test2Test = new HashSet<CheckersState>(); test2Test.add(new CheckersState(new int[][]{{E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,B,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}}, 1, new ArrayList<Integer>())); for(CheckersState state : test2Set){ assertTrue(test2Test.contains(state)); } Set<CheckersState> test4Set = test4.possibleBoardGameStates(test4); Set<CheckersState> test4ATest = new HashSet<CheckersState>(); test4ATest.add(new CheckersState(new int[][]{{E,E,E,E,E,E,E,B}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,B,E,E,E,E,E,E}, {E,E,R,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}}, 0, new ArrayList<Integer>())); for(CheckersState state : test4Set){ assertTrue(test4ATest.contains(state)); } test4.moveDoublePoint(new Point(2,3), new Point(3,2)); test4Set = test4.possibleBoardGameStates(test4); Set<CheckersState> test4BTest = new HashSet<CheckersState>(); test4BTest.add(new CheckersState(new int[][]{{E,E,E,E,E,E,E,B}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,B,E,E,E,E}, {E,E,E,E,E,E,E,E}}, 1, new ArrayList<Integer>())); for(CheckersState state : test4BTest){ assertTrue(test4Set.contains(state)); } Set<CheckersState> test5Set = test5.possibleBoardGameStates(test5); Set<CheckersState> test5Test = new HashSet<CheckersState>(); test5Test.add(new CheckersState(new int[][]{{E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,R,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,R,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,BK,E}}, 1, new ArrayList<Integer>())); test5Test.add(new CheckersState(new int[][]{{E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,R,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,R,E,E,E,E,E}, {E,E,E,E,E,E,E,E}, {E,E,E,E,BK,E,E,E}}, 1, new ArrayList<Integer>())); for(CheckersState state : test5Set){ assertTrue(test5Test.contains(state)); } }