Intelligent Qube / Kurushi Puzzle List, Solutions & Stats

Yep, use the nav that's over there → and you'll get a visual representation of all 200 puzzles for the selected size. That's the main point of this after all, oh and most of them have sample solutions listed underneath. These solutions come from this FAQ where a noble chap named Syonyx/BoyOfDestiny went through a lot of pain to achieve what I did by dumping the files. Seriously, read the section on how he did it, dude was motivated.

Apart from this page, this site is generated by a program so that's why it has a, shall we say, minimalist design. All the colours used apart from the cube diagrams are your browser's defaults.

The technical aspects of the actual IQ algorithm can be found here

Other Games: I.Q. Final / Kurushi Final: Mental Blocks - I.Q. Remix+ - I.Q. Mania

Back to main page

General Puzzle Stats

  • Longest Puzzle: 25 turns (7x8 Puzzle 122)
  • Longest Puzzle Group: 17.2 average turns (7x8)
  • Puzzle Group with most forbidden cubes: 7x9 (23.2% of all cubes)
  • Puzzle Group with most advantage cubes: 4x2 (32.1% of all cubes)
  • Average TRN of the 3,400 puzzles: 9.19
  • Total advantage cubes: 18750 (16.22%)
  • Total forbidden cubes: 23359 (20.21%)
  • Average turns to complete the game: 886.075

These next ones are from running the RNG for 12 puzzles (24 random numbers) using each frame from 0-500000 as the seed

  • Puzzle most likely to appear: 118 (30106 / 6000000 = 0.5018%)
  • Puzzle least likely to appear: 191 (29796 / 6000000 = 0.4966%)
  • Puzzle flip chance in the game code: 30% ((Rand() % 100) < 30)
  • Actual flip chance: 30.03% (1801760 / 6000000)
  • Most flipped puzzle: 57 (9193 / 29979 = 30.66%)
  • Least flipped puzzle: 194 (8805 / 29843 = 29.5%)

Turn Speed

This is how long one complete roll advance animation takes. The pause is the time between the end of one advance and the start of the next when no capturing is involved. Holding accelerate and then letting go will change the length of the one-after-next pause by a non-constant amount, even if you hold it again before the second pause happens.

  • Level 0: 47 frames. Pause - 25 frames
  • Level 1: 40 frames. Pause - 22 frames
  • Level 2: 32 frames. Pause - 22 frames
  • Level 3: 27 frames. Pause - 18 frames
  • Level 4: 21 frames. Pause - 16 frames
  • Accelerate / Squashed: 4 frames. Pause - 6 frames

Playing a Specific Puzzle

If you want to practice specific puzzles without waiting for the RNG to help you out, the easist way is to use the correct gameshark code here for your region of the game to enable the debug mode.

  1. Start a game, hold L1 and use the 'Stage Sel' menu to pick the desired stage & wave
  2. Press X to get out of the menu and then select the 'Blocks' menu and use left and right on the Group option to select the puzzle (subtract one from the puzzle numbers on this site)
  3. X out so the game resumes, pause, and use the bottom menu option to go back to the title screen
  4. When you next start a game, you'll be on the stage & wave selected. From here, you just have to change the Blocks→Group option to select the next puzzle (it doesn't change an already active puzzle).
  5. Changing to a different stage & wave requires resetting to the title screen and selecting 1P again

Stage Stats

 Stage
Stat12345678F
Starting Size (Rows) 152827323335353625
Wave 1 Size 6151214181621169
Wave 2 Size 6151514181621189
Wave 3 Size 9181816211824189
Wave 4 Size 12181816211824189
Slack Space 29814111591614

Puzzle RNG

Which puzzles you face in a stage is decided at the start of each stage on the frame before its name appears. At this point the game changes the seed of the standard PlayStation random number generator (see below) to the number of frames the game has rendered since startup.

Then, before each puzzle starts, it calls rand and saves a copy of the number. The random number is then divided by 200 and the result of that is multiplied by 200*. The round tripped number is then subtracted from the original random number producing a result between 0 and 199, this is the number of the puzzle that will appear.

The fun isn't over yet though, at this point another random number is generated and divided by 100. If the remainder of the division is less than 30, then the puzzle is horizontally flipped. This ends all dealings with the RNG until the start of the next puzzle.

* Multiplying and dividing by 200 doesn't always return the same number since these operations are done in integer maths instead of fractional maths. All fractional parts are discarded, for instance 995 divided by 200 produces 4, which when multipled by 200 equals 800. 995 - 800 = puzzle 195 as the chosen puzzle.

The Standard Rand Function (C#)

static int seed = 1; // seed starts off at 1, is changed to the number of frames rendered before a stage starts
static int Rand()
{
    long mulRes = Math.BigMul(seed, 0x41C64E6D); // multiply the seed with this hardcoded number
    int loRes = (int)(mul & 0xFFFFFFFF); // use the low 32 bit of the 64-bit result
    loRes += 0x3039; // add on another hardcoded number
    seed = loRes; // update the seed with this new number so we get a different number next time
    int shRes = loRes >> 16; // use the upper 16 bits of this number
    return shRes & 0x7FFF; // turn off the top bit and give that as the random number. This gives a number between 0 and 32767
}

Puzzle Selection

static int GetNextPuzzlePattern(out bool isFlipped)
{
    int nextVal = g_forcePuzzlePattern;
    if (nextVal == 200) // if the debug mode isn't forcing a specific puzzle, generate one
    {
        int r = Rand(); // get a random number using the function above
        int rDiv200 = r / 200; // divide it by 200

        int rShift31 = r >> 31; // this is done in the game code but is useless since rand only returns a 15 bit number...
        nextVal = rDiv200 - rShift31; // ...so the 31st bit will always be 0, leaving nextVal always equal to rDiv200

        nextVal *= 200; // multiply the divided number by 200
        nextVal = r - nextVal; // the difference between the original number and the divided / multiplied one is used as the puzzle number
    }
    int currentPuzzle = nextVal & 0xff;
    g_currentPuzzle = currentPuzzle;
    isFlipped = ((Rand() % 100) < 30); // another random number is used to determine the flip chance
    return currentPuzzle;
}

Running Between the Cubes

If your position is exactly on the gridlines on the floor, you can freely run between the cubes without getting squashed. This is why at the start of the even puzzle-width stages, your character doesn't start exactly in the middle of the stage. You can see it happening in the TAS I made here

To run between the cubes:

  • On the even puzzle-width stages, the X coordinate has to be 0 (the centre) or a multiple of -/+600
  • On the odd width stages, the X coordinate has to be -/+300 (the sides of the middle column), and then 600 more of less
  • In both cases, to run on the horizontal gridlines, the Y coordinate needs to be a multiple of -/+600.

When running left/right and up/down only, your character moves 40 units per frame. Each frame of diagonal movement is 28 units to the right and 28 up, but 29 to the left and 29 down. So up+right is +28 X and +28Y, but down+right is +28X and -29Y. Using these and the precise movement allowed by an emulator, it is possible to always reposition yourself to run between the cubes

@adeyblue