川渡し問題 初級「オオカミとヤギときゃべつ」
スクラッチで作成した川渡し問題の初級の解答とプログラミングの概要を解説します。
小6の息子がプレイしてくれましたが、1分ぐらいで解いてしまいました。
問題を文章にしないでビジュアルだけで想像させたほうがよかったかなと思ってます。
解答例の動画を作りました
問題の詳細
きゃべつを持った旅人がオオカミとヤギを連れて川を渡ろうとしています。
船は1隻しかありません。
船をこげるのは旅人だけです。
【旅人】
【船】
船には旅人と荷物(オオカミ、ヤギ、きゃべつ)を1つまでしか乗せられません。
【オオカミ】
オオカミはヤギが大好物です。
旅人がいない岸でオオカミとヤギの二匹だけになると、オオカミはヤギを食べてしまいます。
【ヤギ】
ヤギはきゃべつが大好物です。
旅人がいない岸でヤギときゃべつだけになると、ヤギはきゃべつを食べてしまいます。
【きゃべつ】
オオカミはきゃべつを食べません。
荷物(オオカミとヤギとキャベツ)を失わずに反対側の岸へ運ぶことができたら成功です。
解答例
失敗例をまとめると次のようになります。
旅人がいない岸に荷物が2つあるときにヤギがいると失敗になります。
旅人が岸を離れるとき、ヤギは岸に1匹で残るか旅人と船に乗っていないといけないことになります。
なので、1手目は必ずヤギを乗せて川を渡ります。
[オオカミ、きゃべつ] || [旅人、ヤギ]
ヤギに気を付けて荷物を運ぶと後は次のような解答になります。
例:
[旅人、オオカミ、ヤギ、きゃべつ] || []
[オオカミ、きゃべつ] || [旅人、ヤギ]
[旅人、オオカミ、きゃべつ] || [ヤギ]
[きゃべつ] || [旅人、オオカミ、ヤギ]
[旅人、ヤギ、きゃべつ] || [オオカミ]
[ヤギ] || [旅人、オオカミ、きゃべつ]
[旅人、ヤギ] || [オオカミ、きゃべつ]
[] || [旅人、オオカミ、ヤギ、きゃべつ]
プログラム解説
作成したコードは多くないので、直接プロジェクトを開いてみてもらった方が早いと思います。
プロジェクトへのリンクです。
素材を用意する
今回は背景と「オオカミ」「ヤギ」は自前で描きました。
(ちょうどいい素材が無かったので、、)
■スプライト
【船】
「Bowl」を選択して横長に伸ばし、底板を足しました。
【旅人】
「Elf」をそのまま使用しました。
【荷物(オオカミ、ヤギ、きゃべつ】
1つのスプライトにそれぞれコスチュームとして追加しました。
「Button3」を選択して高さを調整し、中に「渡る」のテキストを書きました。
【やり直すボタン】
「Button3」を選択して高さを調整し、中に「やり直す」のテキストを書きました。
【タイトル】
ゲームの初期化や判定を行うオブジェクトになります。
「タイトル」「クリア」「失敗」のコスチュームを追加しました。
※ タイトルは特に何もないので空です
スプライトは全部で8つになります。
※ 「ヤギ」と「きゃべつ」は「オオカミ」をコーディングまで終わってから複製しました
■背景
問題文をずらずら書こうかとおもいましたが、多分読まないので完結にまとめました。
スプライトの絵をコピーして再利用しています。
変数とリスト
■変数
・シーン
ゲームの現在の状態を表す識別文字。
タイトル、ゲーム開始、荷物選択、移動中、成功演出、ゲームクリア、ゲームオーバー
・運ぶ荷物
船に乗っている荷物の名前。
「なし」「オオカミ」「ヤギ」「きゃべつ」
・旅人の位置
旅人がいる岸の位置。
「右」「左」
・回数
船を移動させた回数をカウントする。
■リスト
・左岸
左側の岸にある荷物の名前
「オオカミ」「ヤギ」「きゃべつ」
・右岸
右側の岸にある荷物の名前
「オオカミ」「ヤギ」「きゃべつ」
「タイトル」のコード
■変数とリストの初期化
シーン:「タイトル」
運ぶ荷物:「なし」
旅人の位置:「左」
回数:0
左岸リスト:「オオカミ」「ヤギ」「きゃべつ」
右岸リスト:全て削除
■「判定する」
ゲームオーバー:
左岸か右岸の長さが2でヤギが含まれていること
ゲームクリア:
右岸の長さが3であること
途中:
上記以外
シーン:荷物選択
■「ゲームオーバーした」
シーン:ゲームオーバー
コスチューム:「失敗」
■「ゲームクリアした」
シーン:成功演出
成功演出が終わるのを待つ
コスチューム:「クリア」
シーン:ゲームクリア
「旅人」のコード
■「ゲームを開始」
コスチューム:「elf-a」(普通の顔)
「成功演出」と「ゲームクリア」以外のときは船の上に乗るように座標を合わせ続ける。
■「成功を喜ぶ」
右側の岸におりて振り返る。
コスチューム:「elf-b」(笑顔)
■「旅立つ」
画面右下に向かって歩き出す。
到達したら「リセットする」を送る
「船」のコード
■「ゲーム開始」
座標を左岸につくように移動する。
■「川を渡る」
シーン:移動中
反対側の岸へ1秒で移動する。
「回数」を増やす。
「荷物を下ろす」を送る
「荷物(オオカミ、ヤギ、きゃべつ)」のコード
■「はた押されたとき」
:シーン=「荷物選択」のとき
マウスが押されたら船に「乗せる」「下ろす」「入れ替える」のどれかを行う
:シーン=「ゲームクリア」以外のとき
運ぶ荷物、左岸、右岸 の場所に合わせて座標を変更する
船の上のときは「船」の座標に合わせて座標を調整する
■ 「荷物を船に乗せる」
:「運ぶ荷物」が「なし」のとき
船に乗せる
:「運ぶ荷物」が選択された荷物と同じとき
船から降ろす
:「運ぶ荷物」が選択された荷物と違うとき
船の上の荷物と入れ替える
■「運んだ荷物をおろす」
「運ぶ荷物」を旅人のいる側の岸のリストへ追加する
運ぶ荷物:「なし」
「判定する」を送る
■「旅立つ」
旅人が去っていく方向へついていく。
※「きゃべつ」の場合は旅人に触れたら消える
「渡る」のコード
■「はたが押されたとき」
シーンが「荷物選択」のときだけボタンが有効になる。
マウスが押されたら「川を渡る」を送る
「やり直す」のコード
■「はたが押されたとき」
シーンが「荷物選択」か「ゲームオーバー」のときだけ有効にする。
マウスが押されたら「リセットする」を送る
おわりに
変数やリストも少なく作ることができたのが良かったです。
コードを書く時間は短かったのでクリアしたときの演出を追加してみました。
旅人がにっこり笑うところがお気に入りです。^^
次は中級をつくってみようかな。
他の作品記事もよければ読んでみてください。
「水色のパンダ団」が作ったスクラッチ作品の記事まとめ
スクラッチ作品の作り方や解説をした記事を整理しました。小学生などの初心者やゲームを作りたい中級、上級者などプログラミングのスキル別に作品をまとめています。
0 件のコメント:
コメントを投稿