連載モノ 4thシルエット(違
えてさて連載となると早く次が書きたいとかいう謎なジレンマが発生するもので
でもあまり長い日記はエンターテインメントとしてどうかと思うので、のんびり書くことにしよう
・・・第一回の時点でかなりぶっちぎった気もするが=w=;
えてさて
今日はGENBUシステムの基本アルゴリズムについて考えてみる
とはいうものの、コンピュータは定式化してやらないとなんともできない
コンピュータは思ったとおりには動かないが言ったとおりにしか動かないのだ
コンピュータがやるにはまず人間がどうやってるかを少し考えてみよう
私の考える一般的な捨て牌の傾向は
- 字牌の整理
- 一九牌の整理
- 不要牌の整理
であり、昨日の麻雀ゲームをやっていてもまぁその通りだろう
・・・私は決してこう切らないので皆にキモがられるわけだがw
結局のところ私が捉えている捨て牌の特徴は字牌と一九牌とそれ以外。強いて言うならドラである
どうせコンピュータにやらせるんだから情報として牌の種類も入れよう。これのせいで属性が排他でなくなってしまうが、たぶん何とかなるだろう
さて、私の考えるアルゴリズムは学習型のモノである。
先に教師データとして牌譜を渡して、捨て牌の聴牌情報を生成する
牌の属性は先に述べたとおりだから次のようなクラスにしよう
class Pai { Suit shurui; boolean yaochu; boolean dora; } enum Suit { wan,sou,pin,tsu; }
とりあえずJavaチックに書いたけれど*1別に言語はなんでもよい。
プログラム言語はアルゴリズムを具現化するツールでしかないのです。
同様に聴牌形もクラス化しておこう
あんまりいろいろ定式化してもしょうがないし、分からないと思うから
役数と聴牌形,あと染め手かどうかも入れておくか
class Tenpai { int fan; Machi machi; boolean some; } enum Machi { tanki,ryanmen,shabo; }
ノベタンとか変則待ちは知らん
こうすると牌譜は
class Paifu extends Pair<Vector<Pai>,<TenPai>> { Vector<Pai> sute; TenPai hand; public Paifu (Vector<Pai> v, Tenpai t) { sute = v; hand = t; } }
こんな感じに書ける。Pairクラスは単純に要素が二つあるものと思っておくれ
このPairを食って捨て牌をパスに,ノードにTenpaiを持つようなTrieを実装すると
これが学習データ,人間で言うところの"経験"になるはずだ
Trie構造の実装は実は結構簡単なはず
なんかはてなで書く前に実装しちまったほうが早いんじゃないかという雲行きになってきたが
そんなことは捨て置いて明日に続く
*1:publicとかprivateとかは適当。実装するやつが考えよう