こんばんは、お久しぶりです
社会人になって時間も休日のごく一部しか使えずなかなかプログラミングする時間がとれないのですが
現在数人で二人麻雀ゲームを作っています
メインプログラマとして参加しており、一応お互い18枚ツモって切るという部分までは作りました
(相手は手牌からランダムに切るだけ)
そこで今から山場のひとつ、役判定を作ろうと思い、まず和了形の判定を行おうと思ったのですが苦戦しています
参考にしているのはhttp://www5f.biglobe.ne.jp/~kenmo/progr ... agari.htmlのサイトです
ここで思ったのですが、先に順子より刻子をとった場合、和了形が取得できない場合があると思います
例1)一一一一二二三三三三四四五五
例2)一二二二三三三四四四五六六六
どうすればどのような形でも和了形を取得できるでしょうか
今考えているものは頭を決定し、刻子1個の場合、2個の場合みたいなことを繰り返し、残りは順子、
あがれてなければ頭を変更して同じことを繰り返す、という感じですがどうもすっきりと作れず…
これ以外にもっとオススメの和了判定方法がありましたらそちらもお願いします
また、向聴数も取得できたら、と考えています(七対子、国士は除いて)
牌クラスからは一応牌の種類(萬子、索子、筒子、字牌、三元牌、風牌、老頭牌、中張牌、緑牌、数字など)が取得できます
開発環境はVisual C++ 2008 EEです
よろしくお願いします
麻雀の和了形判定について
-
たいちう
Re:麻雀の和了形判定について
> 今考えているものは頭を決定し、刻子1個の場合、2個の場合みたいなことを繰り返し、残りは順子、
> あがれてなければ頭を変更して同じことを繰り返す、という感じですがどうもすっきりと作れず…
だいたいこの方針で良いと思いますよ。
明日午後は少し時間が取れるはずですのでやってみます。
> あがれてなければ頭を変更して同じことを繰り返す、という感じですがどうもすっきりと作れず…
だいたいこの方針で良いと思いますよ。
明日午後は少し時間が取れるはずですのでやってみます。
-
nayo
Re:麻雀の和了形判定について
なるほど、方針はこれで良かったのですね
お忙しい中わざわざやってみてくれるということで申し訳ないです
ありがとうございます
自分でも時間を見つけてアルゴリズム考えてみようと思います
お忙しい中わざわざやってみてくれるということで申し訳ないです
ありがとうございます
自分でも時間を見つけてアルゴリズム考えてみようと思います
-
たいちう
Re:麻雀の和了形判定について
もう少し丁寧に作ろうかと思ったけど、
麻雀には私の知らないイレギュラーなルールが多そうなので、
手抜きのままにしました。使い物になるように改良してください。
何面待ちかについては、13枚の手牌に1~9までの牌を追加して、
上がりかどうか判定するだけ。
麻雀には私の知らないイレギュラーなルールが多そうなので、
手抜きのままにしました。使い物になるように改良してください。
何面待ちかについては、13枚の手牌に1~9までの牌を追加して、
上がりかどうか判定するだけ。
#include <iostream>
using namespace std;
int buf[10];
int buf2[14];
int answers;
void check(int index) {
if (index == 14) {
answers++;
cout << buf2[0] << buf2[1] << " ";
for (int i = 0; i < 4; i++)
cout << buf2[2 + i * 3] << buf2[2 + i * 3 + 1] << buf2[2 + i * 3 + 2] << " ";
cout << endl;
return;
}
int i = 1;
while (buf == 0 && i <= 9)
i++;
if (i > 9) return;
if (buf >= 3) {
buf2[index] = buf2[index + 1] = buf2[index + 2] = i;
buf -= 3;
check(index + 3);
buf += 3;
}
if (i <= 7 && buf[i + 1] && buf[i + 2]) {
for (int j = 0; j < 3; j++) {
buf2[index + j] = i + j;
buf[i + j]--;
}
check(index + 3);
for (int j = 0; j < 3; j++)
buf[i + j]++;
}
}
void test(int *data) {
cout << "check start! ";
int *p = data;
while (*p) {
cout << *p << " ";
p++;
}
cout << endl;
for (int i = 0; i <= 9; i++)
buf = 0;
p = data;
while (*p) {
buf[*p++]++;
}
answers = 0;
for (int i = 1; i <= 9; i++)
if (buf >= 2) {
buf -= 2;
buf2[0] = buf2[1] = i;
check(2);
buf += 2;
}
cout << answers << " answer(s) found." << endl << endl;
}
int main() {
// 例1)一一一一二二三三三三四四五五
int sample1[/url] = { 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 0 };
test(sample1);
// 例2)一二二二三三三四四四五六六六
int sample2[/url] = { 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6, 0 };
test(sample2);
// 例3)一一二二三三四四五五六六七七
int sample3[/url] = { 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0 };
test(sample3);
// quit
cout << "End." << endl;
cin.get();
return 0;
}-
たいちう
Re:麻雀の和了形判定について
> 以前ブックマークしていたHPに掲載されていましたので、のっけておきます。
nayoさんが既にリンクを貼っているサイトですね。
そのサイトの判定方法は不完全なので、例1)や例2)を誤判定してしまいます。
(私は実行していませんが、フローは不完全に見えます)
nayoさんが既にリンクを貼っているサイトですね。
そのサイトの判定方法は不完全なので、例1)や例2)を誤判定してしまいます。
(私は実行していませんが、フローは不完全に見えます)
-
nayo
Re:麻雀の和了形判定について
たいちう様
動作確認しました
複数の和了形まで出てきて役判定の際もかなり便利そうです
これをベースに作ってみようと思います
この度は本当にありがとうございました
バグ様
既に書いたサイトとはいえ紹介して頂きありがとうございます
なかなか麻雀のプログラムについて細かく書かれたサイトってないんですよね
同人やフリーゲームで麻雀ゲームは数多く見かけるのにちょっと不思議です
自分のプログラムに組み込めたら改めて連絡致します
一応解決ということでチェック入れておきます
また、参考サイトや雑談等ありましたらお願いします
動作確認しました
複数の和了形まで出てきて役判定の際もかなり便利そうです
これをベースに作ってみようと思います
この度は本当にありがとうございました
バグ様
既に書いたサイトとはいえ紹介して頂きありがとうございます
なかなか麻雀のプログラムについて細かく書かれたサイトってないんですよね
同人やフリーゲームで麻雀ゲームは数多く見かけるのにちょっと不思議です
自分のプログラムに組み込めたら改めて連絡致します
一応解決ということでチェック入れておきます
また、参考サイトや雑談等ありましたらお願いします
-
nayo
Re:麻雀の和了形判定について
たいちう様のプログラムを改変することで無事和了判定を行うことができました
また、出来面子をクラス化してさまざまな情報を持たせることで役判定も出来そうです
改めてありがとうございました
麻雀動作部分が完成したらCPの思考ルーチンについてでまた質問にくるかもしれません
そのときはよろしくお願いします
また、出来面子をクラス化してさまざまな情報を持たせることで役判定も出来そうです
改めてありがとうございました
麻雀動作部分が完成したらCPの思考ルーチンについてでまた質問にくるかもしれません
そのときはよろしくお願いします