5パズルを使ったプログラミング実習(試用版)

15パズル  皆さんは,「15パズル」を知っていますか?
 正しくは,スライディング・ブロック・パズルと言って,右図のように4×4の16マスに,15個のコマが入っていて,コマをスライドさせながら,正しい配置に並び替えるパズルです.
 ここでは,パズルのコマ数をぐ〜んと減らした「5パズル」を,プログラミング実習に使います.

↑これが目指すパズル配置(正解)です

正解のパズル配置
 5パズルは,左図のように,2×3の6マスの中に5個のコマが入っているパズルです.コマ数の少ないパズルですが,やってみると意外と苦戦します.  

*とにかく一度苦戦してみたい人は→【こちら】
(使い方は「マニュアル版の操作方法」参照)

 問題は,5問用意しています.どの問題も,左図のコマ配置のように,左上から順番に1〜5のコマを並べるのを目標(正解)にしてコマを動かします.
 各問題には,マニュアル版とプログラム版があります.
 マニュアル版は,ボタンをクリックすると1コマずつ移動するので,手動でコマを操作して,正解のパズル配置にします.プログラム版は,コマを移動させる命令文を適切に並べると,自動でコマが移動して正解のパズル配置になります.マニュアル版で解法を考えて,それをプログラム版で実現するようにしてください.

マニュアル版の操作方法

問題1マニュアル版(ボタン付き)  マニュアル版には,右図のように,5パズルの下に4つのボタンがあります.ボタンは,左から順に,「左(左回り)」「左(右回り)」「右(左回り)」「右(右回り)」です.左側の2つのボタンは,5パズルの左側4マスにあるコマを動かすために使い,右側の2つのボタンは,5パズルの右側4マスにあるコマを動かすために使います.
 たとえば,一番右側にあるボタン「右(右回り)」をクリックすると,下表の右の図のように,右側4マスにある3個のコマが右回りに1コマだけ移動します.ただし,右側4マスに空マスがない場合はコマは移動しません.その他のボタンも同様の動作をします.下表を参考にしてください.
 なお,初めからやり直したいときは,ブラウザの更新ボタンをクリックします.

ボタン 左(左回り) 左(右回り) 右(左回り) 右(右回り)
移動するコマ 右側のコマ移動 右側のコマ移動
動作 左側4マスの中に空マスがあるときだけ,1コマ移動します 右側4マスの中に空マスがあるときだけ,1コマ移動します
回る向き 左回り
(上図の反対向き)
右回り
(上図の同じ向き)
左回り
(上図の反対向き)
右回り
(上図の同じ向き)
操作履歴 LL LR RL RR

マニュアル版の操作履歴(Internet Explorerのみ)

 マニュアル版のボタンをクリックすると,クリックしたボタンに対応した記号(上表のLL, LR, RL, RR)が,操作履歴として5パズルの右側に表示されます.正解にたどりついたとき,この操作履歴を参考にして,プログラム版を動作させます.ですから,プログラム版を動かすまで,マニュアル版のウィンドウを閉じないでください.また,ブラウザの更新ボタンをクリックすると,パズルが初めの配置に戻ると同時に,操作履歴は消えます.


プログラム版の操作方法

 プログラム版は,マニュアル版のボタン操作の代わりに,プログラムの命令文でコマを移動させます.コマを移動させるために,下表の4つの関数(小さなプログラムをまとめたもの)を用意しています.それらは,下表のようにマニュアル版の4つのボタンに対応しています.
命令文 パズルの動作 注意事項
LL(n);
ボタン「左(左回り)」をn回続けてクリックしたのと同じ LとR は,必ず半角大文字.
( )も必ず半角.
n には,半角数字を入れる.
最後に必ず半角セミコロン「;」を入れる.
LR(n);
ボタン「左(右回り)」をn回続けてクリックしたのと同じ
RL(n);
ボタン「右(左回り)」をn回続けてクリックしたのと同じ
RR(n);
ボタン「右(右回り)」をn回続けてクリックしたのと同じ


 たとえば,

LR(3);
は,左側4マスにあるコマを,3回右回りに移動させます.

 これらの命令文を組み合わせて,マニュアル版の各問題にあるプログラム記入欄(テキストエリア)にプログラムを書き込みます.書き終えたら,ボタン「実行」をクリックしてください.
 すると,別ウィンドウが開いて,書き込んだ命令文に従って,パズルのコマが移動します.プログラムが正しくできていれば,正解のパズル配置になって,移動が止まります.
 プログラムの最も簡単な作り方は,マニュアル版で正解のパズル配置にたどりついたときの操作履歴を見て,それに対応した命令文を書いていく方法です.まず,この方法でプログラミングに挑戦してください.

発展的なプログラミング

 これまで説明してきたことだけを使って,プログラム版を正しく動作させることができます.この「発展的なプログラミング」は,時間的に余裕があったときに読んでください.

 さて,命令文を書いていると,同じ命令文が繰り返し出てくることがあります.
たとえば,
    RR(4);
    LL(4);
    RR(4);
    LL(4);
    RR(4);
    LL(4);
のような具合です.
このような場合,次のように格好よく書き換えることができます.

for( i=0; i<3; i++ ){
    RR(4);
    LL(4);
}
これは,
    RR(4);
    LL(4);
の組み合わせを3回繰り返すことを示しています.

一般的に,同じ命令文の組み合わせをn回繰り返すとき,以下のように書きます.
for( i=0; i < n; i++ ){
   (ここに,n回繰り返す命令文の組み合わせを書く)
}


さあ,始めましょう

説明は,これで終わりです.少し長い説明でしたね.
でも,パズルですから,かたく考えずに楽しくやりましょう.

全部で5問用意しています.1問ずつ1ページで表示され,左側にマニュアル版があり,右側にプログラム版があります.マニュアル版で解法を考えて,見つけた解法をプログラム版で実行してみてください.

【 第 1 問 】に進む




この教材を学校で使用される場合は,村田()までご一報ください.授業時間中サーバが正常動作するよう努めます. また,中学生用のワークシートや,学習記録をサーバに保存して評価に使うことができるようにするプログラムも用意していますので,合わせてご相談ください.

福岡教育大学大学院 村田育也研究室