今週末、クッキークリッカーのグリモア自動ツールを作りました。
乱数が難しかった。
あ、今回、プログラミングできる人じゃないとついていけない話かもしれないです。
作ったツールの流れなんですが、
-
「Force the Hand of Fate」(ゴールデンクッキーを呼ぶ)の結果が
「sweet」だったらそれにする。
そして砂糖入手。 - 魔法を失敗することが決まっているが、
「Force the Hand of Fate」の結果が「Elder Frenzy」の時があるので
その時は「Force the Hand of Fate」を放つ。 - 魔法が失敗するときは、「Diminish Ineptitude」を放つ。
ただし、逆効果で魔法を失敗しやすいときは打たない。 - 上記に当てはまらないなら、Frenzy中に「Conjure Baked Goods」を放つ。
という感じです。
公開は、haskellを学んだうえで中身を清書(リファクタリング)してからじゃないとやりません。
で、乱数には2種類ある。
1つは、サイコロみたいな、本当にでたらめな乱数。
もう1つは、特定の値から作る乱数。この乱数は、特定の値が同じなら結果も同じになる。マイクラのシード値みたいな感じ。
で、普通のゴールデンクッキーができるときは、でたらめな乱数を使う。
しかし、魔法を打つときはシード値っぽい乱数を使う。
しかし、両方とも同じ機能(関数)を使うので、機能を切り替える必要がある。
その処理が他のところに影響しまくり。
こういうのをプログラマーは「副作用がある」というらしい。
「Force the Hand of Fate」を打つ時の流れはこんな感じ。
- シード値っぽい乱数を生成するよう、乱数生成機能を切り替える
- 成功するかどうかを決める。
- ゴールデンクッキーの機能の候補を決める。
- ゴールデンクッキーの機能を選択。
- ゴールデンクッキーを呼ぶ
- 乱数生成の設定を戻す。
しかし、成功するかどうかを決めるのにシード値っぽい乱数を使うのはいい。
しかし、普通のゴールデンクッキーと同じような処理の部分も、
シード値っぽい乱数が使われている。
普通のゴールデンクッキーは、普通の乱数を使うのに。
だから、これは本当に作者の望み通りなのだろうかと思ってしまった。
ま、使えるものは使うけど。