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; }
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; } }
//--------------------------------------------------------------------- // 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; }