private void updateCurSpot (final char[][] newMap,
            final boolean[][] newIsFalling, final Point pos) {
        final char curSpot = getSpot(pos, DIRECT_NONE);
        if (curSpot == ROCK) {
            final Point newPosOfRock = new Point(pos);
            boolean isRockMoved = true;
            if (fallDownTest(pos)) {
                // Spot under the rock is empty, rock will fall down
                moveSpot(newMap, pos, DIRECT_DOWN);
                movePos(newPosOfRock, DIRECT_DOWN);
            } else if (slideRightDownTest(pos)) {
                // Rock falls to the right down
                moveSpot(newMap, pos, DIRECT_RIGHTDOWN);
                movePos(newPosOfRock, DIRECT_RIGHTDOWN);
            } else if (slideLeftDownTest(pos)) {
                // Rock falls to the left down
                moveSpot(newMap, pos, DIRECT_LEFTDOWN);
                movePos(newPosOfRock, DIRECT_LEFTDOWN);
            } else if (minerCrushedTest(pos)) {
                // The miner is crushed. So do not move rock, and game over.
                setSpot(newMap, pos, DIRECT_NONE, curSpot);
                isRockMoved = false;
                gameOver(STATE_FAILED);
            } else {
                // Rock do not move
                setSpot(newMap, pos, DIRECT_NONE, curSpot);
                isRockMoved = false;
            } // if (fallDownTest(curPos)) {

            if (isRockMoved) {
                // If the rock is falling down, record it.
                newIsFalling[newPosOfRock.x][newPosOfRock.y] = true;
            }
        } else if (curSpot == LIFT) {
            if (noGoldTest()) {
                // All golds are collected, lift opens
                setSpot(newMap, pos, DIRECT_NONE, OPEN);
            } else {
                // Lift remains
                setSpot(newMap, pos, DIRECT_NONE, curSpot);
            }
        } else {
            // All other item remains
            setSpot(newMap, pos, DIRECT_NONE, curSpot);
        }
    }