「15パズル」の作成⑤「盤面モデルのシャッフル」

学習の目的

  • ・盤面モデルのシャッフル

ここでは、盤面モデルをシャッフルする関数を作成しましょう。

盤面モデルのシャッフル

さて、ここで盤面モデルをゲーム開始の状態にシャッフルしますが注意が必要です。

もしかして、さっき言っていた「クリアができないパターン」のことですか?

そうか、何も考えずにシャッフルすると、クリアできないパターンができるかもしれないんだ。

その通りです。なので、以下の手順でシャッフルを行います。

シャッフルの方法

・クリアの状態を作る。

・空きマスと隣接するマスからランダムで一つ選択し、空きマスと交換する。

・上記の交換を、十分に多い回数繰り返す。

なるほど、クリアの状態から、スライドするのと同じように移動を繰り返してできた盤面モデルなら、クリアする事も可能であるって事なんですね。

それでは、プログラムを作成しましょう。

盤面モデルをシャッフルする関数を作成します。

以下のプログラムを新しいセルに入力して実行してください。

import random
# 盤面モデルをシャッフル
def shuffle():
    for _ in range(500):
        bi, bj = find_blank()
        options = []
        #空きマスの上が盤面モデルの中
        if bi - 1 >= 0:
            options.append([bi-1, bj])
        #空きマスの下が盤面モデルの中
        if bi + 1 < 4:
            options.append([bi+1, bj])
        #空きマスの左が盤面モデルの中
        if bj - 1 >= 0:
            options.append([bi, bj-1])
        #空きマスの右が盤面モデルの中
        if bj + 1 < 4:
            options.append([bi, bj+1])

        ni, nj = random.choice(options)
        move_tile(ni, nj)

プログラムを確認しましょう。

4行目

    for _ in range(500):

以下の処理を500回繰り返します。

500回という回数に意味はあるんですか?

特に理由はありません。

多ければ多いほどシャッフルされます。500は多いかもしれませんが、念の為です。

5行目

        bi, bj = find_blank()

現在の空きマスを取得します。

空きマスの行番号がbiに、列番号がbjに格納されます。

6行目

        options = []

空のリストを、optionsに作成します。

7行目〜

        #空きマスの上が盤面モデルの中
        if bi - 1 >= 0:
            options.append([bi-1, bj])
        #空きマスの下が盤面モデルの中
        if bi + 1 < 4:
            options.append([bi+1, bj])
        #空きマスの左が盤面モデルの中
        if bj - 1 >= 0:
            options.append([bi, bj-1])
        #空きマスの右が盤面モデルの中
        if bj + 1 < 4:
            options.append([bi, bj+1])

4つのif文で、空きマスの上下左右が、盤面モデルの中(行と列、ともに0以上4未満)かを確認し、盤面モデルの中であれば、リストoptionsにその位置(行,列)を追加する。

20・21行目

        ni, nj = random.choice(options)
        move_tile(ni, nj)

optionsに入っている座標から一つランダムで選択し、交換する。

これで、ランダムでシャッフルすることができました。

いよいよ次は、ゲームを動かします!!

Well done!

次のステップに進みましょう!

次のステップに進む

← 前のステップにもどる