예제 #1
0
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;
	}
}