Esempio n. 1
0
static int start(void)
{
	int i, a, b, c;

	for(i=0; i<blockNum; i++) {
		blocks[i].position = i;
	}

	for(i=0; i<20*blockW; i++) {
		/* the number of shuffling times is a rule of thumb. */
		a = fastrand()%(blockNum-1);
		b = fastrand()%(blockNum-1);
		if(a == b)
			b = (b+1)%(blockNum-1);
		c = blocks[a].position;
		blocks[a].position = blocks[b].position;
		blocks[b].position = c;
	}

	for(i=0; i<blockNum; i++) {
		blockSetSrcOffset(i);
	}

	phase = 0;
	movingBlock = -1;
	spaceBlock = blockNum - 1;
	autoSolveTimer = AUTOSOLVE_WAIT;

	stat = 1;
	return 0;
}
Esempio n. 2
0
static void moveBlock(RGB32 *src, RGB32 *dest)
{
	int sx, sy;
	int dx, dy;
	int x, y;

	sx = movingBlock % blockW;
	sy = movingBlock / blockW;
	dx = spaceBlock % blockW;
	dy = spaceBlock / blockW;

	sx *= blockSize;
	sy *= blockSize;
	dx *= blockSize;
	dy *= blockSize;

	x = dx + (sx - dx) * phase / SLIDING_INTERVAL;
	y = dy + (sy - dy) * phase / SLIDING_INTERVAL;

	copyBlockImage(src + blocks[movingBlock].srcOffset,
			dest + y * video_width + x);

	if(autoSolveTimer == 0) {
		phase--;
	} else {
		phase-=2;
	}
	if(phase < 0) {
		int tmp;
		/* Exchanges positions of the moving block and the space */
		tmp = blocks[movingBlock].position;
		blocks[movingBlock].position = blocks[spaceBlock].position;
		blocks[spaceBlock].position = tmp;

		blockSetSrcOffset(movingBlock);
		blockSetSrcOffset(spaceBlock);

		spaceBlock = movingBlock;
		movingBlock = -1;
	}
}
Esempio n. 3
0
//---------------------------------------------------------------------
// LOCAL METHODs
//---------------------------------------------------------------------
//
int PuzzleTV::setBlockNum(int num)
{
	blockW     = num;
	blockH     = num;
	blockSizeW = video_width  / blockW;
	blockSizeH = video_height / blockH;
	blockNum   = blockW * blockH;
	marginW    = video_width  - blockW * blockSizeW;
	marginH    = video_height - blockH * blockSizeH;

	// Reallocate memory & setup
	if (blocks != NULL) {
		delete[] blocks;
	}
	blocks = new Block[blockNum];
	if (blocks == NULL) {
		return -1;
	}
	for (int y=0; y<blockH; y++) {
		for (int x=0; x<blockW; x++) {
			blocks[y * blockW + x].destOffset =
					blockSizeW * x +
					blockSizeH * y * video_width;
		}
	}
	for (int i=0; i<blockNum; i++) {
		blocks[i].position = i;
	}
	for (int i=0; i<20*blockW; i++) {
		/* the number of shuffling times is a rule of thumb. */
		int a = mUtils->fastrand() % (blockNum - 1);
		int b = mUtils->fastrand() % (blockNum - 1);
		if (a == b) {
			b = (b + 1) % (blockNum - 1);
		}
		int c = blocks[a].position;
		blocks[a].position = blocks[b].position;
		blocks[b].position = c;
	}
	for (int i=0; i<blockNum; i++) {
		blockSetSrcOffset(i);
	}

	//
	phase = 0;
	movingBlock = -1;
	spaceBlock = blockNum - 1;
	autoSolveTimer = AUTOSOLVE_WAIT;

	return 0;
}