1 2 3 4 5 6 7 8 9 | public class BoardCell extends Cell { private Piece piece = null; public Piece getPiece() { return piece; } public void setPiece(Piece piece) { this.piece = piece; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | public class Board { public static final int NUMBEROFCELLS = 50; public static final int NUMBEROFCELLSINROW = 5; private BoardCell[] boardCells = new BoardCell[NUMBEROFCELLS]; public Board() { for (int i = 0; i < NUMBEROFCELLS; i++) { boardCells = new BoardCell(); } for (int i = 0; i < NUMBEROFCELLS; i++) { initializeBoardCell(boardCells, i); } } /** * Initialize the neighbours of the given boardCell at the given * index on the board */ private void initializeBoardCell(BoardCell boardCell, int index) { int row = index/NUMBEROFCELLSINROW; // Check if cell is in last or first column boolean isFirst = (index%NUMBEROFCELLSINROW == 0); boolean isLast = ((index+1)%NUMBEROFCELLSINROW == 0); if (row%2 == 0) { // Even rows if (row != 0) { // Northern neighbours if (!isFirst) { boardCell.setNeighbour(Cell.NORTHWEST, boardCells[index-6]); } boardCell.setNeighbour(Cell.NORTHEAST, boardCells[index-5]); } if (row != ((NUMBEROFCELLS/NUMBEROFCELLSINROW)-1)) { // Southern neighbours if (!isFirst) { boardCell.setNeighbour(Cell.SOUTHWEST, boardCells[index+4]); } boardCell.setNeighbour(Cell.SOUTHEAST, boardCells[index+5]); } } else { // Uneven rows // Northern neighbours if (!isLast) { boardCell.setNeighbour(Cell.NORTHEAST, boardCells[index-4]); } boardCell.setNeighbour(Cell.NORTHWEST, boardCells[index-5]); // Southern neighbours if (row != ((NUMBEROFCELLS/NUMBEROFCELLSINROW)-1)) { if (!isLast) { boardCell.setNeighbour(Cell.SOUTHEAST, boardCells[index+6]); } boardCell.setNeighbour(Cell.SOUTHWEST, boardCells[index+5]); } } // Set the east and west neighbours if (!isFirst) { boardCell.setNeighbour(Cell.WEST, boardCells[index-1]); } if (!isLast) { boardCell.setNeighbour(Cell.EAST, boardCells[index+1]); } } public void findOccupiedBoardCells( ArrayList occupiedCells, PieceCell pieceCell, BoardCell boardCell) { if (pieceCell != null && boardCell != null && !pieceCell.isProcessed()) { occupiedCells.add(boardCell); /* Neighbouring cells can form loops, which would lead to an infinite recursion. Avoid this by marking the processed cells. */ pieceCell.setProcessed(true); // Repeat for each neighbour of the piece cell for (int i = 0; i < Cell.NUMBEROFSIDES; i++) { findOccupiedBoardCells(occupiedCells, (PieceCell)pieceCell.getNeighbour(i), (BoardCell)boardCell.getNeighbour(i)); } } } public boolean placePiece(Piece piece, int boardCellIdx) { // We will manipulate the piece using its first cell return placePiece(piece, 0, boardCellIdx); } public boolean placePiece(Piece piece, int pieceCellIdx, int boardCellIdx) { // We're going to process the piece piece.resetProcessed(); // Get all the boardCells that this piece would occupy ArrayList occupiedBoardCells = new ArrayList(); findOccupiedBoardCells(occupiedBoardCells, piece.getPieceCell(pieceCellIdx), boardCells[boardCellIdx]); if (occupiedBoardCells.size() != Piece.NUMBEROFCELLS) { // Some cells of the piece don't fall on the board return false; } for (int i = 0; i < occupiedBoardCells.size(); i++) { if (((BoardCell)occupiedBoardCells.get(i)).getPiece() != null) // The board cell is already occupied by another piece return false; } // Occupy the board cells with the piece for (int i = 0; i < occupiedBoardCells.size(); i++) { ((BoardCell)occupiedBoardCells.get(i)).setPiece(piece); } return true; // The piece fits on the board } public void removePiece(Piece piece) { for (int i = 0; i < NUMBEROFCELLS; i++) { // Piece objects are unique, so use reference equality if (boardCells.getPiece() == piece) { boardCells.setPiece(null); } } } } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |