暗カン馬鹿野郎!

暗カンの選択方式はこれしかないと思うんだよな。
ポンを選択させる仕組みと、カンを選択させる仕組みと、チーを選択させる仕組みがそれぞれ別になってしまった。
今日はバルーンを作ってた。ずっとボタンをいじってたから麻雀を作ってる気がしない。副露の選択はこういう操作にするのが最も直感的な気がしてる。つーか動画見て気づいたんだけど鳴いた相手の河の最後の牌が再び鳴ける表示になってんじゃねえか。
バルーン表示の仕組みができたから全てをつなげて動かしてみたら、特定の状況下(ポンとカンとチーの同時発生時)において上手く動かないことが判明した。修正を試みてみたところ、あっちを直すとこっちが動かなくなり、こっちを動かすとあっちがさらに動かなくなるという悪循環が発生し、ついに頭が「イーッ!」ってなった。こういう状況に陥る場合ってだいたい設計の根本でしくじっているから、直すのを諦めて書き直す方が結果的に早かったりするんだよね。。というわけで、今日1日の成果を破棄した。状況を巻き戻せるのはGitのおかげだ。ありがとうギフハフ。
プロとはいえあっという間に麻雀プログラム作っていて凄いです。
こういうの1人工で一年ぐらいかかるものと思っていました。
僕の手がまあまあ早いのは、やっていることが大雑把だからです。「試しに作ってみる」というのを趣味でやってるだけですからね。ちゃんとやれば、しっかり1年掛かると思います。リソースを使わないプロトタイプって、ある程度まではサクサク作れてしまいますからね。喩えるなら登山みたいなもので、上に行くほどしんどくなるのです。5合目までは数日で行けても、6合目までは数週間掛かり、7合目までに数ヶ月掛かり、8合目を目指すに至っては数年掛かってしまうわけです。なお、8合目から先は才能ってやつが大きく関わる領域になるので、時間だけ掛けてもどうにもなりません。要するに何が言いたいかと言いますとね、僕が持っている才能のピークも8合目ってことですよ。
鳴き関連のソースを再び書き直した。バージョン1では2000行あったコードがバージョン2では950行となり、バージョン3に至ってはついに330行まで減らせた。無駄を減らすには何度も書くに限るね(当初は何が無駄か分かってないから)。
つい昨日「コードが減った」とイキったばかりなのに、再びコードが激増した。スマートな実装をしているつもりでいても、後から例外的な挙動に対応しようとするとコードが劇的にクソ化する。柔軟性がないからだ。これ以上は作り直しても意味がないと判断して、デバッガで1ステップずつ誤りを追っている。画的に楽しいものがなくお見せできるものがないのが残念である。そろそろゲームもやりたいのだが、逃げているみたいで癪に障るので、この実装だけは片を付けたい。……というわけで今日はAIに頼ってみたよ! お手伝いをしてくれたのはそれなりに賢いと評判のClaudeSonnet4君だ。問題点を超長文で伝えてあげたら「明確な仕様ですね! さっそく取り掛かります!」と威勢良くコードを書いてくれたよ。読んでみたら、何もかも間違ってたけどね。AIの最高にヤバいところは、動くコードを書いてしまうことだと思う。どうやら現在のAIにはニッチな実装のロジックエラーを正せるような能力がない。そればかりか、ロジックエラーの上にさらにロジックエラーを上塗りしてくる。控え目に言って、ドSだと思う。というわけで、横着するのはやめた。視力と頭が馬鹿になるまでデバッガのウォッチ式を眺め続けるしかない。

人間って頭がぼんやりしてくると自分の捨て牌でポンするようになるんだぜ。

明らかな不具合らしいものは無くなりつつあるのだけれども、こういう挙動を許せずにいる。自動で選択される三萬には、四萬と隣接したものが選ばれるべきだと思う。
【候補の並べ方(現在)】
・捨牌と手牌で作り得る面子を列挙する
・それらの面子で使われる牌のリスト(可能牌リスト)を作成する
・全ての面子で使われる牌のリスト(共通牌リスト)を作成する
・可能牌および共通牌のリストにある牌を実際の手牌の中央に寄るように割り当てる
・さらに手牌の中で可能牌が占めるレンジの中央に寄るように並べ替える
・可能牌リストにない牌を灰色にする
・共通牌リストにない可能牌を白くしてクリックハンドラを割り当てる
・共通牌リストの牌をピンクにする
これではいかんようだ。並び替えを足すか、総当たりで組み合わせを試してブロックの数が最小となるペアを取るかしなきゃならんだろうけど、総当たりをを足すのは気が重い。
ああ、並べ替えの結果が変わらなくなるまでループすりゃいいのかも知れんな。
ついにポン・カン・チーの複合パターンを突破した。僕がやりたかったのはこういうことだよ! あーなんかすんげえ満足したわ。まだ麻雀になってないのに。なお、こんなことをやるために費やしたコードは1300行。めちゃくちゃ無駄が多いとは思うんだけど、減量しようとするとクリティカルな部分をぶっこ抜きかねないのでこのままにしておく。次は小明槓とリーチだが、いい加減にそろそろゲームをやりたい。

小明槓を表示できるようにしないことには小明槓の実装は始まらないので、小明槓を表示できるようにした。こういうのはテキストで表示するだけでも足りるんだけど、それだと気分があがらないので、リアル麻雀の作法通りに牌を積み上げて表示した。……と、簡単に書いているけれど、実のところまあまあ手こずった。僕は根っからの2Dおじさんでスクリーン座標系と共に生きてきたので、この程度の3Dでも苦労するのだ。
小明槓。

リーチ。

ツモ。あとはロンだな。

はいロン! あとは一番最初に作った点数計算クラスに今の状態をぶっこめば点数が出る。残りはチョンボの組み込みと対戦相手の思考ルーチンか? チョンボの組み込みは気合い一つでやれるだろうが、思考ルーチンについてはシャンテン数を減らしていくだとか危険牌テーブルを持つ以上のことをやろうとするとアカデミックな領域に突入するから、僕の手には負えなくなるだろう。というわけで、今回はこんぐらいにしとく。