麻雀の和了形判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nayo

麻雀の和了形判定について

#1

投稿記事 by nayo » 15年前

こんばんは、お久しぶりです
社会人になって時間も休日のごく一部しか使えずなかなかプログラミングする時間がとれないのですが
現在数人で二人麻雀ゲームを作っています
メインプログラマとして参加しており、一応お互い18枚ツモって切るという部分までは作りました
(相手は手牌からランダムに切るだけ)

そこで今から山場のひとつ、役判定を作ろうと思い、まず和了形の判定を行おうと思ったのですが苦戦しています
参考にしているのはhttp://www5f.biglobe.ne.jp/~kenmo/progr ... agari.htmlのサイトです

ここで思ったのですが、先に順子より刻子をとった場合、和了形が取得できない場合があると思います

例1)一一一一二二三三三三四四五五
例2)一二二二三三三四四四五六六六

どうすればどのような形でも和了形を取得できるでしょうか

今考えているものは頭を決定し、刻子1個の場合、2個の場合みたいなことを繰り返し、残りは順子、
あがれてなければ頭を変更して同じことを繰り返す、という感じですがどうもすっきりと作れず…

これ以外にもっとオススメの和了判定方法がありましたらそちらもお願いします
また、向聴数も取得できたら、と考えています(七対子、国士は除いて)

牌クラスからは一応牌の種類(萬子、索子、筒子、字牌、三元牌、風牌、老頭牌、中張牌、緑牌、数字など)が取得できます

開発環境はVisual C++ 2008 EEです
よろしくお願いします

nayo

Re:麻雀の和了形判定について

#2

投稿記事 by nayo » 15年前

書き損ねましたが参考になるサイトでも構わないので情報よろしくお願いします
また、不備等ありましたら追記します

たいちう

Re:麻雀の和了形判定について

#3

投稿記事 by たいちう » 15年前

> 今考えているものは頭を決定し、刻子1個の場合、2個の場合みたいなことを繰り返し、残りは順子、
> あがれてなければ頭を変更して同じことを繰り返す、という感じですがどうもすっきりと作れず…

だいたいこの方針で良いと思いますよ。
明日午後は少し時間が取れるはずですのでやってみます。

nayo

Re:麻雀の和了形判定について

#4

投稿記事 by nayo » 15年前

なるほど、方針はこれで良かったのですね
お忙しい中わざわざやってみてくれるということで申し訳ないです
ありがとうございます

自分でも時間を見つけてアルゴリズム考えてみようと思います

たいちう

Re:麻雀の和了形判定について

#5

投稿記事 by たいちう » 15年前

もう少し丁寧に作ろうかと思ったけど、
麻雀には私の知らないイレギュラーなルールが多そうなので、
手抜きのままにしました。使い物になるように改良してください。

何面待ちかについては、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:麻雀の和了形判定について

#6

投稿記事 by バグ » 15年前

以前ブックマークしていたHPに掲載されていましたので、のっけておきます。

http://www5f.biglobe.ne.jp/~kenmo/progr ... am_ind.htm

たいちう

Re:麻雀の和了形判定について

#7

投稿記事 by たいちう » 15年前

> 以前ブックマークしていたHPに掲載されていましたので、のっけておきます。

nayoさんが既にリンクを貼っているサイトですね。
そのサイトの判定方法は不完全なので、例1)や例2)を誤判定してしまいます。
(私は実行していませんが、フローは不完全に見えます)

バグ

Re:麻雀の和了形判定について

#8

投稿記事 by バグ » 15年前

おっと、これは失礼しましたm(_ _)m

nayo

Re:麻雀の和了形判定について

#9

投稿記事 by nayo » 15年前

たいちう様
 動作確認しました
 複数の和了形まで出てきて役判定の際もかなり便利そうです
 これをベースに作ってみようと思います
 この度は本当にありがとうございました

バグ様
 既に書いたサイトとはいえ紹介して頂きありがとうございます
 なかなか麻雀のプログラムについて細かく書かれたサイトってないんですよね
 同人やフリーゲームで麻雀ゲームは数多く見かけるのにちょっと不思議です

自分のプログラムに組み込めたら改めて連絡致します
一応解決ということでチェック入れておきます

また、参考サイトや雑談等ありましたらお願いします

nayo

Re:麻雀の和了形判定について

#10

投稿記事 by nayo » 15年前

たいちう様のプログラムを改変することで無事和了判定を行うことができました
また、出来面子をクラス化してさまざまな情報を持たせることで役判定も出来そうです
改めてありがとうございました

麻雀動作部分が完成したらCPの思考ルーチンについてでまた質問にくるかもしれません
そのときはよろしくお願いします

閉鎖

“C言語何でも質問掲示板” へ戻る