WSN追加案: ランダム多岐分岐

Issue #449 resolved
k4nagatsuki repo owner created an issue

CWで2の乗数以外の方向のランダム分岐を作る事はかなり難しい事が知られています。これは、ランダム分岐が一定確率の成功か失敗の2方向への分岐しかサポートしていないためです。

このような状況で、例えば3方向に等確率で分岐させたい場合には、以下のような手順を踏む必要があります。

  1. まず33%で2方向分岐を作る
  2. 失敗側を50%で2方向分岐させる

しかもこれは完全な等確率ではありません(33%・33.5%・33.5%になる)。完全な3方向等確率分岐とするにはさらに複雑な事をせねばならず、考えるのをやめる程度には困難です。

4方向へ分岐させて、最後の1方向へ行ってしまった場合は最初からやり直す方が遥かに簡単なほどです。まして7方向だとか13方向だとかフラグ判定を絡めたりとかし始めると、やり直し以外の方法では人間の手に負えるレベルを超えます。


考えられる解決方法の1つは、複数の後続コンテントを持ち、それぞれに等確率でランダム分岐する新しいイベントコンテントを設ける事です。

仕様衝突の危険や複雑な問題は何も無いと思います。

Comments (15)

  1. req

    コンテントの確率で分岐しているところのソースでどういう実装されているのか 読んでないので言うのも何ですが、 便利そうですね!

    変更点は、 XEditorでその新規コンテントを配置出来るようにする→ その後ろにコンテントを置いた数だけ100から割った確率で分岐。 新規コンテントのIDの決定・XML出力。 CWPyでの新規コンテントのIDに対応した分岐の内部処理。

    ってところですか?

  2. k4nagatsuki reporter

    そういうところです。

    厳密にいうと100分率を使う必要はなく、後続コンテントが7個あれば0~6または1~7の乱数を使えばよいだけです。もちろんフラグ判定やステップ判定で到達できなくなっている分岐先は判定前に除かれる事になります。

  3. req

    本当は自分はこういった数学寄りな内容の方を得意としてますし、 内容的にも入門的で軽い部類なので、 一部でも手伝いたい気持ちはあります。

    ただこの内容だと、長月さんなり慣れた方がやってしまった方が速いのかなあとも 思います。

    新規コンテントということは、XEditorのCWXスクリプトのコード決定、 コード入出力とかもあるんでしょうか?

  4. k4nagatsuki reporter

    手伝っていただけるなら、もちろん大歓迎です。機能を実装する過程でコードについて学ぶ事ができますので、色々とプラスになると思います。結果はレビューしますから、何かまずい事があっても指摘する事ができます。

    新しいイベントコンテントを実装するには、大体以下の手順を踏んでいます。

    1. イベントコンテント名とパラメータ名を決める(今回は、これまでの名付けの傾向を踏まえてBranch-MultiRandomのようになるでしょう)。
    2. 機能を実装(cw/content.py)
    3. 逆変換にチェック処理を追加(変換不可なので例外を投げる)

    WSN追加案の一覧には実際に機能を実装した時のPull Requestへのリンクがありますから、それを見ればより参考になるでしょう。

    cwxeditor側では:

    1. 新しいイベント定義を追加(cwx/event.dcwx/types.dなど)
    2. 新しいイベントダイアログを実装(cwx/editor/gui/dwt/eventdialog.d他。今回はパラメータがないので不要)
    3. CWXスクリプトでの名前とパラメータを決める(これまでの傾向を踏襲してbrrandommか)
    4. CWXスクリプトのコンパイラ部分(cwx/script.d)を更新
    5. CWXスクリプトのリファレンスマニュアルを更新(cwxscript.html)

    実例として、コミットログが参考になるはずです。例えばクーポン多岐分岐コンテントの実装のコミットなど(後続コンテント名の種類に「クーポン名」という新しい概念が入ったので、だいぶ込み入っていますが……)。


    上記の中でやってみたい事はありますか? こうした一通りの作業は一人で一貫して行った方がやりやすいという面があるのですが、分業する事も可能なはずです。

    もちろん一括してやってみるというのも歓迎です。分からない事があれば私がアドバイスできると思います。お訊ねください。

  5. req

    cwxeditorをフォークしてクローンして32bit版(rdmd build)ビルドして 動作出来たところです。 cwxeditorは、自分で動作確認するときは64bit(rdmd build -m64)でも動作確認したほうが よろしいでしょうか?

    64ビット版のライブラリの作成 rdmd build base swt -m64 というのをまだやってないのですが、同じところでやって衝突したりはしないのですか?

    d言語もpythonも暗中模索ですが、dの方がC,C#寄りなので若干読みやすいです。 リファレンスマニュアルの更新あたりからぼちぼちやっていいですか?


    逆変換とはどういうことをしているのですか?

  6. k4nagatsuki reporter

    64ビット版のライブラリの作成 rdmd build base swt -m64 というのをまだやってないのですが、同じところでやって衝突したりはしないのですか?

    結果は同じファイル名なので衝突します。ですから32bit版と64bit版のそれぞれで別にライブラリを用意する必要があります。

    64bit版の環境を整えるのは簡単ではないので(Qiitaに資料があった気もしますが)、とりあえず開発するだけなら32bit版だけでもいいと思います。64bit対応を始めた当初は特有の問題が結構ありましたが、最近はめっきり見なくなりました。配列の長さなどがsize_t型なのでintなどにそのまま代入しようとするとエラーになったりする事にだけ気をつければ、ほとんど問題はないはずです。size_tなどの問題は踏んでもコンパイル時に検出できるので、すぐ修正できます。

    逆変換とはどういうことをしているのですか?

    CWPyには、宿をCW 1.28~1.50の宿データへ変換する機能があります。CW→CWPyの変換の逆方向という事で逆変換と呼んでいます。

    具体的にはcw/binary以下にある各モジュールのunconvメソッドで処理を行っています。ランダム多岐分岐コンテントはCWには存在しないので、逆変換はできません。そのため、それを使用時イベントに含むカードは単純に弾いてしまう必要があります。具体的にはf.check_wsnversion()とある処理がそれです。

  7. k4nagatsuki reporter

    pull request #1754

    特に議論するような内容のある機能でもありませんので、上記Pull Requestをマージしました。このイベントコンテントの実装は@namereqさんの仕事です。ありがとうございました。

    対応するエディタはcwxeditorの20170201版以降です。

  8. k4nagatsuki reporter

    コードに直接貢献をいただいたので、pull request #1756でReadMe.txtに@namereqさんの名前を記載しました。問題があったらお伝えください。

  9. req

    pull request #1754 を改めてみていて、 cw/content.pyランダム多岐分岐コンテント になっていないといけない文言が ランダム多肢分岐コンテント に2か所なっているので、修正お願いいたします。

  10. k4nagatsuki reporter

    pull request #1758で修正しました。

    マージ作業には今のところそんなに手間は取られていないので、この程度の些細な事でPull Requestを出していただいても大丈夫ですよ。

  11. req

    了解しました。これからはこういった場合、プルリクエストすることにします。 ありがとうございます。

  12. Log in to comment