プロ生ちゃんの mahjong.js
-
プロ生ちゃんの mahjong.js | マスコットアプリ文化祭
https://mascot-apps-contest.azurewebsites.net/Works/623Twitterやっていないのでこちらで良いですか?
不適切でしたらこの投稿は削除してください。おもしろそうですが、気になったところを挙げます。
https://light.dotup.org/uploda/light.dotup.org14754.jpg1枚目:ロンできず自分の牌を何か捨てなければならない(牌が1枚少なくなってしまう)
2枚目:リーチできない
3枚目:2枚目の続き ツモにならずリーチが表示される
4枚目:3枚目の続き ノーテンになる| 774 | 返信 -
https://light.dotup.org/uploda/light.dotup.org14769.jpg
原因は前の投稿と同じかもしれませんが。
1枚目:あがれない
2枚目:リーチが点数にならない
3枚目:ノーテンになる| 774 | 返信 -
遊んでくれてありがとうございます。
みんなで楽しむプログラミングのお祭りということで、正月休みの余興として麻雀を勉強しながら開発してみましたw
リーチできない、あがれない、ノーテンになる、は結構発生しますね。テンパイの判定が難しくて挫折してしまいました。
プログラミングのお勉強のためのコミュニティなもので、ゲーム本編よりも初心者が JavaScript だけで麻雀ゲームを作ってみたところ、MIT ライセンスのオープンソースなところ、GitHub の使い方や Markdown の書き方を学んだところがウリですが、いやぁ、バグが多くて申し訳ないです ^^;
一応、GitHub の Issue にもその旨は記載しています。
https://github.com/haijinboys/mahjong.js/issues/1ついでに免責事項。
https://github.com/haijinboys/mahjong.js#readmeちなみに私は麻雀のルールも知りませんでした…w でも、ゲームで遊んでくれてプログラミングに少しでも興味を持っていただけると嬉しいです。
すでに締め切りが終わって審査期間に入っているので、下手に修正して壊れてしまうとアレなので修正や改良は先になると思いますが、Mery のユーザーさんから反応をいただけて嬉しかったです。
| Kuro | 返信 -
失礼しました。
しっかりと書いてありますね。> 一応、GitHub の Issue にもその旨は記載しています。
> https://github.com/haijinboys/mahjong.js/issues/1
GitHub の Issue の存在を初めて知りました。> ついでに免責事項。
> https://github.com/haijinboys/mahjong.js#readme
ここは目を通しましたが見落としていたみたいです。
失礼しました。| 774 | 返信 -
いえいえ、わざわざご連絡いただきありがとうございました。
> GitHub の Issue の存在を初めて知りました。
私も最近知りましたが、このバグはツッコミが入りそうな気がしたので先手を打っておきました。(というより締め切りに間に合わなかった…)
直し方が分かるかたがいらっしゃったらご協力いただけると嬉しいです。
などと言いつつ GitHub の使い方も良く分かっていないので、他の人が直してくれたりできるのかも分かりませんが…。
| Kuro | 返信 -
ご返信ありがとうございます。
素人考えですが、待ちによってリーチがかけられなかったりあがれなかったりするのは何か違うような気がします。
実際にどのように判定しているか分かりませんが、待ちのパターン(両面待ちとか単騎待ちとか)から判断しているとすると、そのパターンをすべて考慮する必要がありムリがあると思います。
的外れでしたら、申し訳ありません。自分なら、処理の重さとかプログラミングの面倒くささを無視した考えになってしまいますが、国士無双と七対子を除くと、下記のように考えるかなと思いました。
Cとか ActionScript なら多少は分かる程度で、麻雀ゲームに関してはまったくの素人のあさはかな考えだと思いますが。
手持ち13枚+ツモった1枚あるいは他が捨てた1枚の計14枚を、その都度3枚・3枚・3枚・3枚・2枚の組み合わせにできるか判断して、組み合わせることがことができたら「あがり」(当然、何かの役が必要ですが)。
手持ち13枚+牌の全34種類のうちの1種類の計14枚を、3枚・3枚・3枚・3枚・2枚の組み合わせにできるか牌34種類に対して判断して、組み合わせることがことができるものがあったら「聴牌」、34通りの中で組み合わせることがことができた牌が「待ち牌」。他の数ある麻雀ゲームがどのように判定しているか分かりませんが、きっともっと良い方法があるんだろうなと思います。
ちょっと興味があったので、「麻雀ゲーム ソース」でググってみても、GitHub での見方がよく分からなかったり、内容がよく分からなかったり。ひとつ見つけたもの、シャンテン数の算出みたいなのでちょっと違うような気がしますが、3枚・3枚・3枚・3枚・2枚の組み合わせを見つけるにしても面倒だなと思いました。
それに加えて役を判断するとなると、かなり面倒そうですね。
【麻雀】Javascriptで通常手のアガリとシャンテン数を算出する麻雀プログラムを作る
https://mahjong.org/program_009/
【麻雀】Javascriptで通常手のアガリとシャンテン数を算出する麻雀プログラムを作る(再帰呼び出し版)
https://mahjong.org/program_019/長文、駄文、失礼しました。
| 774 | 返信 -
> 実際にどのように判定しているか分かりませんが、待ちのパターン(両面待ちとか単騎待ちとか)から判断しているとすると、そのパターンをすべて考慮する必要がありムリがあると思います。
おっしゃるとおり、待ちのパターンを計算して判定に使用していますが、3枚・3枚・3枚・3枚・2枚の組み合わせを調べた結果を基準にしています。
> 3枚・3枚・3枚・3枚・2枚の組み合わせを見つけるにしても面倒だなと思いました。
そうなんですよね。どうもこの組み合わせを見つける処理に問題があって、トイツの 2 枚がシュンツを構成する 1 枚としても解釈できるときに判定をミスってしまうようです。
Issue には "嵌張待ちだとあがれない?" と書きましたが、そもそも3枚・3枚・3枚・3枚・2枚の組み合わせを見つけるのに失敗しているのが原因で嵌張待ちという判定もされなくなっちゃてるような感じだと思います。
情報ありがとうございます。JavaScript でアガリとシャンテン数のチェックは参考になりそうです。
つい mahjong.js のソースを引っ張り出してきてバグ修正に挑戦してしまいましたが、今日のところは敗北…。やっぱり難しい~!
| Kuro | 返信 -
おっしゃられる通り、待ちから判断するにしても牌の組み合わせを考えなければなりませんね。
そして、その組み合わせを判定するのが難しかったのですね。
余計なコメント失礼しました。| 774 | 返信