プログラミング 第8回 サイコロを使ったゲームを作ってみよう

 前回の問題の解答

まずは第1問の解答です。


「||」は「または」と入力してもOKです。

次は第2問の解答です。

 
 N=3とN=6のとき,N=8以降で和が表示されていませんね。
 N=8以降は「N=8ならば抜ける」や「和>30ならば抜ける」などで表示させないことができますね。
 N=3とN=6のときは、N=7は和が表示されているので「抜ける」は使えません。「続ける」を使って「和の表示」をパスします。
 N=3もN=6も3の倍数なので、「N%3=0ならば続ける」としてもいいし、直接的に「(N=3)||(N=6)ならば続ける」としてもいいですね。「||」は「または」と入力してもOKです。

今回学ぶこと

・ 乱数

・ 特殊な変数「それ」

・ 関数「二択」

・ サイコロを使ったいろいろなゲームを作ってみる

 乱数

乱数」というものを見ていきましょう。
例えば、「6の乱数を表示」と入力し実行すると、0から5までの整数が実行ボタンを押すたびにランダムに表示されます。
すなわち、「Nの乱数」とは0から(N-1)までの整数のいずれかということです。

「乱数」の入力の仕方は「(数字)の乱数」の他に、「乱数(数字)」というものもあります。


ちなみに「乱数(6)」は「0,1,2,3,4,5」のいずれかのことなので、サイコロの目を表したい場合は、「乱数(6)+1」や「6の乱数+1」と入力すればOKです。

 特殊な変数「それ」

特別な変数である「それ」について説明します。


変数「それ」には直前で行った関数の結果が代入されます。
あくまで「関数の結果」というのがポイントです。


このように関数が存在しないと代入するものがないのでエラーになってしまいます。


このように関数を使ってやれば問題なく処理されます。


もちろんこのように「それ」を使わなくても表せますが、プログラムが複雑になってくると「それ」を使った方がすっきりする場合もあります。適宜使えるようにしておきましょう。

 「二択」関数

「二択」関数について説明します。


「〇〇」と二択 と入力すると実行ボタンを押した際に別枠(ダイアログ)に「OK」「キャンセル」の選択肢が現れます。
 続けて、条件分岐の制御構文を使い、先ほど学んだ変数「それ」を用いることにより、「OK」のときと「キャンセル」のときの処理を与えることができます。
 プログラムを入力する際に、「OK」は「はい」「キャンセル」は「いいえ」と入力しても大丈夫です。
 先ほど「乱数」の復習ですが、サイコロの目を表すには、「6の乱数+1」または「乱数(6)+1」とすればよかったですね。

二択関数を使えば〇×クイズも作れます。

 サイコロの目を当てるゲーム

 今まで学んだころを踏まえていよいよサイコロを使ったゲームを作っていきます。
まずは、サイコロの目を当てるゲームです。


 繰り返しの制御構文を使いますが、繰り返しの回数はプレイヤーが飽きるまでです。そのため、「〇回繰り返す」「〇から△まで繰り返す」などの形とは相性が悪いです。ではどうすればいいか?プレイヤーが止めるという意思表示をするまで永遠に繰り返すようにプログラムをすればよいのです。「永遠の間繰り返す」とします。
 そして、繰り返すかどうかを二択関数を使って聞き、繰り返す意思がなければ「抜ける」を使ってゲームを終了させます。
 サイコロの目とプレイヤーが予測した目が一致すれば「当たり」、一致しなければ「はずれ」です。この辺りはそれほど難しくないと思います。

このサイコロの目を当てるゲームは、ただ目を当てるだけのストイックなゲームなので点数でもつけようと思います。
例えば、連続で目を当てた回数を点数にすると


 点数は0点から始まり、連続して当てれば+1されていきます。はずれると0点に戻ります。
 サイコロの目の予測は「1から6までの整数」以外を入力した場合は警告文が出るようにしています。これは第5回でやりましたね。
 同じ制御構文のところは同じ色でアンダーラインを引いています。
 繰り返しの制御構文の「続ける」はそれ以降の処理をせずに繰り返しの最初に戻る働きでしたね。 
 「ここまで」は、繰り返しの制御構文の「ここまで」と条件分岐の制御構文の「ここまで」が必要になります。条件分岐の制御構文で処理が2行以上になる場合は「ここまで」が必要でしたね。
 「続けますか?」の問いにキャンセルを選ぶと最終的な点数が表示されます。
 これで「連続してサイコロの目を当てた回数が点数になるゲーム」が完成しましたが、このゲームは2点を取る確率が36分の1、3点を取る確率が216分の1、4点を取る確率が1296分の1なので、高得点を取るのがかなり難しいゲームです(笑)

 サイコロの目が偶数か奇数かを当てるゲーム

 サイコロの目を当てるのは6分の1の確率ですが、偶数か奇数かを当てるだけなら2分の1の確率なので連続して当てるのは何とかなりそうです。そこで、サイコロの目が偶数か奇数かを当てるゲームを作ってみます。


 ベースは先ほどの「サイコロの目を当てるゲーム」と同じです。
 「偶数ですか?」と二択関数で質問し、OKを押せば変数「予測」の値が「0」になり、キャンセルを押せば変数「予測」の値が「1」になります。
 そして、サイコロの目を2で割り、偶数ならば変数「余り」の値が「0」になり、奇数ならば変数「余り」の値が「1」になります。
 したがって、変数「予測」と変数「余り」の値が一致するとき予測が当たったとなります。
 テキストだけで味気ないゲームですが、徐々にバージョンアップしていき、画像を表示したり音楽を鳴らしたりできるようになるといいですね。

サイコロを2つにして、2つのサイコロの目の和が偶数か奇数かを当てるゲームも作れます。


このプログラムは下に記載しますので、コピーして動作を確認してみてください。

「2つのサイコロの目の和が偶数か奇数かをあてるゲームです。連続して正解した回数が点数となります。」と言う

点数=0

永遠の間繰り返す
「あなたの点数は{点数}です。今から振る2つのサイコロの目の和は偶数でしょうか?」と二択

もし、それがOKならば 予測=0
違えば、予測=1

サイコロA=乱数(6)+1
サイコロB=乱数(6)+1
サイコロ=サイコロA+サイコロB
余り=サイコロ%2

もし、予測=余りならば
結果=「当たり」
点数=点数+1

違えば、
結果=「はずれ」
点数=0

ここまで

「サイコロAの目は{サイコロA}、サイコロBの目は{サイコロB}で、目の和は{サイコロ}です。{結果}です。点数は{点数}点です。続けますか?」と二択

もし、それがキャンセルならば、抜ける

ここまで

「あなたの点数は{点数}点です」と言う

 サイコロの目の和を21に近づけるゲーム

トランプのゲームでブラックジャックというものがありますが、それのサイコロ版を作ってみようと思います。
ブラックジャックはトランプをめくって数字の和が21に近い方が勝ちというものです。


 目の合計が21を超えるとゲームオーバーになるので、どこでサイコロを振るのを止めるかが悩みますね。
 それと「ここまで」の使い方がややこしいです。いろいろ試したのですが、明確なルールがいまいち謎です。「どこまでかわかりくい時につける」というのでとりあえずOKかと思います。
 このプログラムは下に記載しますので、コピーして動作を確認してみてください。

値=0
サイコロ=0

「サイコロを振り、目の合計が点数となります。ただし、21を超えるとゲームオーバーです。」と言う

永遠の間繰り返す

「サイコロの目は{サイコロ}で、あなたの点数は{値}です。サイコロを振りますか?」と二択

もし、それがOKならば、
 サイコロ=(乱数(6)+1)
 値=値+サイコロ

違えば、抜ける

もし、値>21ならば、
  「サイコロの目は{サイコロ}です。21を超えました。」と言う
  抜ける

ここまで

ここまで

もし、値<=21ならば、「あなたの点数は{値}です。」と言う
違えば、「ゲームオーバーです。」と言う

 サイコロの目を当てるゲームに点数を賭けるシステムを追加

 最後によりゲームっぽくなるように「持ち点」を導入してみます。
持ち点から点数を賭け、サイコロの目が当たれば「大当たり」として賭けた点数が3倍になる。サイコロの目が偶数か奇数かが当たれば「当たり」として賭けた点数が戻って来る。はずした場合は賭けた点数を失うというルールにしてみます。


 今までで一番長いプログラムですが、新しい知識はなく今まで学んだことを活かせば大丈夫です。
 同じ制御構文のところは同じ色でアンダーラインを引いています。
 繰り返しの制御構文の間にさらに繰り返しの制御構文を入れています。
 このプログラムも下に記載しますのでコピーして動作を確認してみてください。

「サイコロの目を当てるゲームです。目を当てると『大当たり』。賭けた点数が3倍になります。偶数か奇数かが当たれば『当たり』。賭けた点数がそのまま戻ってきます。はずした場合は賭けた点数を失います。」と言う

点数=10

永遠の間繰り返す
「あなたの点数は{点数}です。何点を賭けますか?」と尋ねて賭点に代入

 賭点を整数変換して値に代入

 もし、賭点<>値ならば、
 「点数は整数で入力してください」と言う
  続ける

 違えば、もし、賭点>点数ならば
 「持ち点を超えて賭けることはできません」と言う
  続ける

 違えば、もし、賭点<=0ならば
 「1以上の点数を賭けてください」と言う
  続ける

 ここまで

 永遠の間繰り返す
 「今から振るサイコロの目を予測してください。」と尋ねて予測に代入

 予測を整数変換して値2に代入

 もし、予測<>値2ならば、
 「整数を入力してください」と言う
  続ける

 違えば、もし、(予測<=0)||(予測>6)ならば
 「1から6までの整数を入力してください」と言う
  続ける

 違えば、抜ける

 ここまで

予測余り=予測%2

サイコロ=乱数(6)+1
サイコロ余り=サイコロ%2

 もし、予測=サイコロならば
  結果=「大当たり」
  点数=点数-賭点+賭点*3

 違えば、もし、予測余り=サイコロ余りならば
  結果=「当たり」
  点数=点数-賭点+賭点

 違えば、
  結果=「はずれ」
  点数=点数-賭点

 ここまで

 もし、点数<=0ならば、
 「サイコロの目は{サイコロ}で{結果}です。点数が0点以下になりました」と言う
 抜ける

 ここまで

「サイコロの目は{サイコロ}で{結果}です。点数は{点数}点です。続けますか?」と二択

もし、それがキャンセルならば、抜ける

ここまで

もし、点数<=0ならば、「ゲームオーバーです」と言う
違えば、「あなたの点数は{点数}点です」と言う

それでは今回の課題です。

問題1

〇×クイズをつくってみましょう。問題は3問つくり、最後に正答数を知らせてくれるようにしてください。

下に作り方の例は掲載しておきます。問題は例なので自分のオリジナル問題を作ってみてください。

問題

 サイコロを1つ投げて、「1~3」の目が出るか、「4~6」の目が出るかを当てるゲームを作ってみましょう。当たる確率は2分の1ですね。
 ただ当てるだけのゲームではつまらないので点数もつけましょう。連続で当てた回数を点数にしてもいいですし、最初に持ち点があり点数を賭ける形式にしてもいいです。ゲームの説明など文章の部分は絵文字を使っても大丈夫ですよ。

 いきなりすべてのプログラムを作るのは難しいかもしれませんので、難しいと思う方用にヒントを掲載しておきます。□内に適切なプログラムを追加して完成させてください。

今回までが1つの区切りとなります。第1回から第8回までをしっかり復習しておきましょう。