「15パズル」の作成③「マスの移動」

学習の目的

  • 1.移動できるか確認する関数

  • 2.マスの移動(スライド)を行う関数

ここでは、マスの移動を実現します。

1.移動できるか確認する関数

「15パズル」は、空きマスの隣のマスのみスライドできます。

指定した場所が空きマスの隣かどうかを確認する関数を作成しましょう。

指定した位置(行と列)を引数として渡し、空きマスと隣接していたら「true」を、

隣接していなければ「false」を返す関数を作成します。

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

def can_move(i, j):
    bi, bj = find_blank()
    # 同じ行で横に1マス差 or 同じ列で縦に1マス差
    return (
        (i == bi and (j == bj + 1 or j  == bj - 1)) or
        (j == bj and (i == bi + 1 or i  == bi - 1))
    )

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

1行目

def can_move(i, j):

関数の定義部分です。

行の番号をi、列の番号をjとして受け取ります。

これで、tiles[i][j]が空きマスと隣接しているか確認します。

2行目

    bi, bj = find_blank()

空きマスの位置を返す関数を使用し、空きマスの行の番号と列の番号を、それぞれbi,bjに格納します。

4行目~7行目

    return (
            (i == bi and (j == bj + 1 or j  == bj - 1)) or
            (j == bj and (i == bi + 1 or i  == bi - 1))
        )

戻り値を返す部分です。条件式を書くことで、trueまたはfalseを返します。


(i == bi and (j == bj + 1 or j == bj - 1))

i == biが成立したら、行の番号が同一ということ。

あとは、列の番号が+1か-1なら、隣接している。という条件です。

(j == bj and (i == bi + 1 or i == bi - 1))

j == bjが成立したら、列の番号が同一ということ。

あとは、行の番号が+1か-1なら、隣接している。という条件です。

上記のどちらかが成立したら、trueが返却されます。

can_move(1,1) 空きマスが隣接しているので、trueが返却される。
can_move(2,1) 空きマスが隣接していないので、falseが返却される。

問題:以下の画像のとき、can_move(i,j)でtrueが返却されるiとjの値を、(行の番号,列の番号)の組み合わせで全て答えてください。

ただし、盤面モデルに存在しない位置の行の番号、列の番号は指定しないでください。

例: (3,1) (2,2) (3,1)

2.マスの移動(スライド)を行う関数

指定した位置と、空きマスを交換する関数を作成します。

交換することで、スライドしたようになるのです。

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

ただし、空欄( a )、( b )、( c )を適切な内容に置き換えてください。

def move_tile(i, j):
    bi, bj = find_blank()
    temp = ( a )
    tiles[i][j] = ( b )
    tiles[bi][bj] = ( c )

これは関数を作成しただけです。実行しても何も表示はされません。

さて、今回のプログラムは空欄があります。何が入るか考えて、プログラムを作成しましょう。

現在の空きマスの位置を、2行目でbi、bjに取得してるね。

ということは、tiles[i][j]と、tiles[bi][bj]を交換すればいいんですね。

データの交換の方法は、整列の時にやったよね。

tempが、退避するための変数だね!

問題 : ( a )、( b )、( c )に何が入りますか?

( a )

( b )

( c )

答え

( a )、( b )、( c )を入れて完成したプログラムを、忘れずに実行してください。

※この再現版では提出は行いません(送信先は未接続です)

Well done!

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

次のステップに進む

← 前のステップにもどる