サイコロを振って、アルゴリズムを考える。
授業ネタ、簡単なゲームを使ってアルゴリズムを構築していこうの巻。 試しにFlashでちょろっと作ってみた。
サイコロゲーム I
使うもの: サイコロ5個 (10個あるとやりやすい) チップ5個+α
ゲームの目的は、サイコロを振った目で勝負し、チップをなるべく沢山増やす事です(曖昧)
ゲームは、複数回のラウンドからなります。 開始時にチップを5枚(何枚でもいいんだけど)貰います。
ラウンドの開始 ・サイコロを5個振ります。 ・次に、貴方が取りうる行動は2通りです。 1) このラウンドをなかった事にして、次のラウンドへ(チップ±0枚) 2) サイコロを振りなおして、より大きな数を出す、ように努力する。
2を選んだ場合、サイコロを振りなおします。 (前の数を覚えておくのが大変なので、もう5個あると良い)
サイコロを振りなおした結果 最初に振った5個のサイコロの目の和よりも大きな数になった ( チップ+1枚) 同様に、小さくなってしまった (チップ -1枚) 同じ数が出た (チップ±0枚)
次のラウンドへ。
まだ単純だ、ある程度の数よりも小さければより高い目を期待して振りなおす。 そうでなければパスすれば良さそうなのにはすぐ気付く。
サイコロゲーム II
サイコロゲーム II では、サイコロゲーム Iをベースにルールに若干の改良が加えられている。
サイコロを振りなおす場合に、5個全てを振りなおすのではなくて、次のいずれかを選ぶ A) 5つの目のうち、最小と最大のサイコロ2つだけを振りなおす B) それ以外の3つを振りなおす 最小、最大の目が2個以上出ても、1つだけを対象にする。 例えば 1, 1, 2, 3, 3 の場合、Aに該当するのは 1 と 3, Bに該当するのは 1, 2, 3 だ。
今度は、振りなおすという選択の後、どちらを降り直した方が得なのか、考えなきゃいけない。
まだ、分かりやすいよね。
サイコロゲーム III
サイコロゲーム II で導入した振りなおしのルールはそのままに、点数の計算方法が変わる。
サイコロゲーム I, II では単純に5つの目の和が点数になった。 サイコロゲーム III では、同じ目が2つ、3つになると、それぞれボーナスでそれらの目が2倍、3倍になる。
例えば、1, 1, 3, 4, 6 と出た場合には、 1 × 2個 × 2倍(ゾロ目ボーナス) + 3 + 4 + 6 = 17 点となります。
3, 4, 5, 5, 5 ならば、 3 + 4 + 5 * 3 * 3 = 72 点、 2, 2, 3, 6, 6 なら 同様に 35 点です。
# for(i = 1..6){ sum += i * (iの出た数)^2 }
振りなおしのルールはそのままなので、ゾロ目を切るような振り方は損なような気がするね? でも、振りなおしで新たにゾロ目が揃うかもね?
これは、ちょっと、難しいかもしれないよ?
計算とか大変なのでFlashでちょっと作ってみた、バグが残ってるかもしんないけど。 # アニメーション(Timer)の扱いとか、ちょっと慣れてないので上手い方法がよく分からん。
カウンタリセットが無いとか、サイコロクリックで振りなおし出来た方が良いよねとかは気が付かなかった事にする。 しかし、Flashdevelop 使いやすい。 パワポスライドとか、ただの図とかも作り直してインタラクティブな教材にしたいな。
で、もちろん「ゲームやってみれ、何点になった?」って話じゃなくて 良い戦略を考えて、それを文書化(例えば他人にそれを見せれば同じ振り方をするように)する。 つまるところ、コードを書かないで、アルゴリズムを考えてプログラミングだ。 色々と、曖昧な要素や「コレってアレじゃね?」みたいなアレがあったりするが そこは、そういうモノとして作ってあるので、そういう事で
さて、どんなレポートが出てくるかな?