void RectangleSDL::move(Box2D *limit) { colliding = false; if ( hor ) { if ( getRightSide() + speed >= limit->getRightSide() ) { hor = false; colliding = true; } else { addX(speed); } } else { if ( getLeftSide() - speed <= limit->getLeftSide() ) { hor = true; colliding = true; } else { addX(-speed); } } if ( vert ) { if ( getBottomSide() + speed >= limit->getBottomSide() ) { vert = false; colliding = true; } else { addY(speed); } } else { if ( getTopSide() - speed <= limit->getTopSide() ) { vert = true; colliding = true; } else { addY(-speed); } } }
bool getFromRestPiece(int x, int y) { int iCornor = 0; // id: from 0 to 3 int iSide = 4; // id: from 4 to ((LWR - 1) * 4 - 1) int iCenter = (LWR - 1) * 4; // id: from (LWR - 1) * 4 to LWR * LWR if (puzzle_board[x][y] != 0) { // already have a piece in this position return false; } if (x == 0 && y == 0) { // left-up corner of the board // cannot reach this position cout << "SYSTEM ERROR: DFS error." << endl; exit(-6); } else if (x == 0 && y == LWR - 1) { // right-up corner of the board toast[x][y] = DOWN; for (iCornor = 0; iCornor < 4; iCornor++) { if (isPieceUsed[iCornor]) continue; if (getLeftSide(iCornor, toast[x][y]) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iCornor; isPieceUsed[iCornor] = 1; return true; } } return false; } else if (x == LWR - 1 && y == 0) { // left-down corner of the board toast[x][y] = UP; for (iCornor = 0; iCornor < 4; iCornor++) { if (isPieceUsed[iCornor]) continue; if (getUpSide(iCornor, toast[x][y]) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iCornor; isPieceUsed[iCornor] = 1; return true; } } return false; } else if (x == LWR - 1 && y == LWR - 1) { // right-down corner of the board toast[x][y] = RIGHT; for (iCornor = 0; iCornor < 4; iCornor++) { if (isPieceUsed[iCornor]) continue; if (puzzle_board[x - 1][y] != 0 && getUpSide(iCornor, toast[x][y]) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iCornor; isPieceUsed[iCornor] = 1; return true; } if (puzzle_board[x][y - 1] != 0 && getLeftSide(iCornor, toast[x][y]) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iCornor; isPieceUsed[iCornor] = 1; return true; } } return false; } else if (y == LWR - 1) { // pieces in right sides toast[x][y] = RIGHT; for (iSide = 4; iSide < (LWR - 1) * 4; iSide++) { if (isPieceUsed[iSide]) continue; if (puzzle_board[x - 1][y] != 0 && getUpSide(iSide, toast[x][y]) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iSide; isPieceUsed[iSide] = 1; return true; } if (puzzle_board[x][y - 1] != 0 && getLeftSide(iSide, toast[x][y]) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iSide; isPieceUsed[iSide] = 1; return true; } } return false; } else if (x == LWR - 1) { // pieces in down sides toast[x][y] = UP; for (iSide = 4; iSide < (LWR - 1) * 4; iSide++) { if (isPieceUsed[iSide]) continue; if (puzzle_board[x - 1][y] != 0 && getUpSide(iSide, toast[x][y]) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iSide; isPieceUsed[iSide] = 1; return true; } if (puzzle_board[x][y - 1] != 0 && getLeftSide(iSide, toast[x][y]) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iSide; isPieceUsed[iSide] = 1; return true; } } return false; } else if (x == 0) { // pieces in up sides toast[x][y] = DOWN; for (iSide = 4; iSide < (LWR - 1) * 4; iSide++) { if (isPieceUsed[iSide]) continue; if (( y == 1 || puzzle_board[x][y - 1] != 0) && getLeftSide(iSide, toast[x][y]) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iSide; isPieceUsed[iSide] = 1; return true; } } return false; } else if (y == 0) { // pieces in left sides toast[x][y] = LEFT; for (iSide = 4; iSide < (LWR - 1) * 4; iSide++) { if (isPieceUsed[iSide]) continue; if (puzzle_board[x - 1][y] != 0 && getUpSide(iSide, toast[x][y]) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iSide; isPieceUsed[iSide] = 1; return true; } } return false; } else { // other pieces in the center // toast[x][y] = UP; for (iCenter = (LWR - 1) * 4; iCenter < LWR * LWR; iCenter++) { if (isPieceUsed[iCenter]) continue; for (int it = UP; it < RIGHT; it++) { /*if (puzzle_board[x][y - 1] != 0 && puzzle_board[x - 1][y] != 0) { if (getLeftSide(iCenter, it) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1]) && getUpSide(iCenter, it) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iCenter; toast[x][y] = it; isPieceUsed[iCenter] = 1; return true; } } else if (puzzle_board[x][y - 1] != 0 && getLeftSide(iCenter, it) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iCenter; toast[x][y] = it; isPieceUsed[iCenter] = 1; return true; } else if (puzzle_board[x - 1][y] != 0 && getUpSide(iCenter, it) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iCenter; toast[x][y] = it; isPieceUsed[iCenter] = 1; return true; }*/ if (puzzle_board[x][y - 1] != 0 && getLeftSide(iCenter, it) == getRightSide(puzzle_board[x][y - 1], toast[x][y - 1])) { puzzle_board[x][y] = iCenter; toast[x][y] = it; isPieceUsed[iCenter] = 1; return true; } if (puzzle_board[x - 1][y] != 0 && getUpSide(iCenter, it) == getDownSide(puzzle_board[x - 1][y], toast[x - 1][y])) { puzzle_board[x][y] = iCenter; toast[x][y] = it; isPieceUsed[iCenter] = 1; return true; } } } return false; } }