ざんないプログラマァのアプリ開発日記

ゲームエンジンUnityを使って何か創る

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

面子と塔子の組合せパターン最大となる手牌は?(2)

清一系で考えられる全ての手牌で組合せチェックを行い、
組合せパターンが最大となる手牌を調べててみる。

約38億回の計算を要する。

1回の処理が10msで処理できたとして約1.2年。

分散できるように改良し、試しに処理させてみた。
夜間(約10時間)で約2000000回。

なんだろぅ…もぅ…
放熱で部屋がとんでもない暑さに…(:;´.(Θ).`;:)

冬なら暖房として使える。
  1. 2010/08/10(火) 10:32:21|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0

面子と塔子の組合せパターン最大となる手牌は?(1)

向聴数(一般/七対子/国士無双)を求める実装を追加した。
清一系の手牌では、1万超える組合せパターンが存在する。
パターンが最大となる手牌はどんな手牌なのだろうか?

清一系で考えられる全ての手牌で組合せチェックを行い、
組合せパターンが最大となる手牌を調べてるには?

・考えられる手牌
清一系で考えられる全ての手牌は何通りあるのだろうか?
数牌で作られる清一系が最大になるものと考えて、
清一に使用できる牌9×4(11112222・・・88889999)
の中から14牌を抜き出す手牌の組合せは
3614=3796297200手牌
・・・約38億?!でよいのかな?

・1回の処理時間(ミリ秒)
Core2 Duo 2.33GHz PC で大体 0~3ms
手牌によっては 17ms など差がある。
とりあえず 10ms とする。

・1日をミリ秒に直す
24時間×60分×60秒×ミリ秒=86400000ms

・1日に処理できる回数
86400000ms÷10ms= 8640000回

・全てを処理する時間(日数)
3796297200手牌÷ 8640000回≠約440日

1回10msで処理したとして1.2年・・・(´ι _`  ) あっそ
計算間違ってるのだろか?
時間がかかりすぎる・・・
分散させて計算させても・・・って何台もPCないし
そもそも求める必要があるのだろうか?
課題として保留。
  1. 2010/08/06(金) 16:40:13|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0

向聴数を求める(3) 組合せから向聴数を求める

静的法で面子(順子/刻子)、塔子(辺塔/篏塔/両塔/対子)の組合せを求めた。
実際に組合せから向聴数を求めてみる。


【共通】
・それぞれ(一般/七対子/国士無双)で最も向聴数が低くなる組合せを探す。

【一般】
・和了型の組合せ
 4面子1雀頭

・向聴数計算式
 向聴数=8-(面子×2)-塔子

・補足1
 面子過多の場合、面子と塔子の合計を4に調整する。
 ただし、雀頭(対子)が含まれるなら向聴数-1
 例:
 一二 四五 ⑤⑥⑦ 123 56 89→2向聴
 一二 四五 ⑤⑥⑦ 123 56 88→1向聴

・補足2
 面子が4以上なら0向聴(テンパイ)である。
 例:
 123 123 123 123 89→0向聴


【七対子】
・和了型の組合せ
 7対子(7種類)

・向聴数計算式
 向聴数=6-対子数

・補足1
 対子のみをカウントする。刻子や孤立はカウントしない。
 例:
 1111・・・は下記の4パターン出力される。
 1111・・・
 111 1・・・
 11 11・・・
 1 1 1 1・・・
 このときカウントされるのは
 11 11・・・対子の組合せのみ

・補足2
 同じ対子は1つとする。
 11 11 ⑤⑤ ⑤⑤・・・ならば七対子に使われる対子は2つ。


【国士無双】
・和了型の組合せ
 ヤオ九牌(老頭牌+字牌)13種類とその内どれかが雀頭(対子)

・向聴数計算式
 向聴数=13-牌種

・補足1
 対子が複数の場合、どれかを雀頭で2牌と数える
 例:
 19・・・の場合
 1 9・・・ 向聴数=13-2=11

 119・・・の場合
 11 9・・・ 向聴数=13-3=10
 1 1 9・・・向聴数=13-2=11

 1199・・・の場合
 11 99・・・   向聴数=13-3=10
 11 9 9・・・  向聴数=13-3=10
 1 1 99・・・  向聴数=13-3=10
 1 1 9 9・・・ 向聴数=13-2=11

 1199①①・・・の場合
 11 99 ①①・・・   向聴数=13-4= 9
 11 9 9 ① ①・・・ 向聴数=13-4= 9
 11 99 ① ①・・・  向聴数=13-4= 9
 1 1 9 9 ① ①・・・向聴数=13-3=10


和了型や計算式は多数のサイトを参考にさせていただきました。
補足部分は自分で試した結果、上記のようなアルゴリズム?になりました。

組合せから向聴数(一般/七対子/国士無双)を求める実装を追加し試運転、今のところ問題なく動作している様子。
  1. 2010/08/06(金) 12:57:49|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0

向聴数を求める(2) 組合せの落し穴

静的法で面子(順子/刻子)、塔子(辺塔/篏塔/両塔/対子)の組合せを求めるコンソールアプリを作成した。
清一系の手牌で組合せを求めてみたが、パターン数が多い(5万とか)ため実用的ではないのか?
本当に正しいのかを検証してみた結果、重複する組合せが出力されていた。

例えば・・・1111・・・とあった場合(・・・の部分は他の牌)
A)・・・111 1・・・   ・・・刻子 孤立・・・
A)・・・1 111・・・   ・・・孤立 刻子・・・
B)・・・11 1 1・・・  ・・・対子 孤立 孤立・・・
B)・・・1 11 1・・・  ・・・孤立 対子 孤立・・・
B)・・・1 1 11・・・  ・・・孤立 孤立 対子・・・
と出力される。
AとBと組合せはそれぞれ同じパターンである。
・・・部分の組合せチェックは全て無駄に行っていたことになる。
AとBとはそれぞれどれか一つが出力されるのが望ましい。


改良を加え、さらに重複チェックを行うプログラムを追加して再検証。
同じように清一系をいくつか試す・・・(ソース直書き)・・・
適当に試したが、まだ1万超える手牌がある。

どんな手牌が最大となるのか調べる必要がありそうだ。(; -д-)=3
  1. 2010/08/06(金) 06:49:57|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0

向聴数を求める(1) 面子、塔子の組合せを探る

向聴数を求めるため、静的法により面子(順子/刻子)、塔子(辺塔/篏塔/両塔/対子)の組合せを求める。

静的法とは
【】面子、塔子の組合せを全て求める。
【】そのなかから向聴数が最低となる組合せを探す。

まず、面子、塔子の組合せを求める。
いままでのものを参考に、C++でガリガリ書く。
コンソールで確認できるものが一応できた。(*1)

例えば 1234 このような同じ種類の手牌ならば
123 4   順子 孤立
12 34   辺塔 両塔
12 3 4  辺塔 孤立 孤立
13 24   篏塔 篏塔
13 2 4  篏塔 孤立 孤立
1 234   孤立 順子
1 23 4  孤立 両塔 孤立
1 24 3  孤立 篏塔 孤立
1 2 34  孤立 孤立 両塔
1 2 3 4 孤立 孤立 孤立 孤立
という10パターンを出力する。(*2)

試しに清一系の手牌(14枚)をいくつか試す・・・(ソース直書き)・・・
・・・3万・・・2万・・・4万・・・・・・ごっ5万?!
なぜこんなにパターンがあるのだろうかと?

パターン数に応じてメモリは動的に増えるようにしたが(*3)、
携帯アプリを考えるならメモリ不足が心配。
また、組合を解析して思考に応用しようものなら
パターンが多すぎて時間がかかってしまうのではないか?

これではよろしくない・・・本当に正しいのか?
ファイル出力して確認してみよう・・・(´・д・`)




*1:
コンソールアプリケーションの開発には、
Visual Studio 2008 Standard Edition を使用。

*2:
鳴きなどで手牌の枚数は変化する。
よって、手牌は何枚でも判定できるよう作成する。

*3:
パターン数がわからないので、動的に増やすことができるよう vector を使用した。
vector はリサイズ等が発生すると倍のメモリを作られたりするので使うべきではない?のかも
  1. 2010/08/05(木) 17:42:24|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0

向聴数の計算方法

静的法
面子(順子/刻子)、塔子(辺塔/篏塔/両塔/対子)の組合せを全て求め。
向聴数が最低となる組合せを探す。
向聴数=8-面子数×2-塔子数

清一系には膨大な計算量が必要なため、リアルタイムでは速度面に問題あり。
データ化し、ハッシュテーブルなどを利用して高速化を図ることも考えられる。

動的法
手牌に和了になるまで複数枚の牌を付け足す。
向聴数=和了に必要な枚数-1

清一系には高速となる場合がある。
しかし、一般手で和了が遠い場合(例えば7向聴)、無駄な読みをしてしまう欠点がある。

混合法
静的法と動的法の長所を活かす方法。
動的である程度の向聴数(例えば2向聴)まで読み、その範囲に和了が存在しなければ、静的法に切替える。



静的法なら、今後の思考で役立つような気がする。
とりあえず静的法を考えてみよう。
  1. 2010/08/05(木) 10:47:52|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0

向聴数を考える

「第10回 麻雀の役を判定する」を解析しました。
アガリの組合せを見つけて、役判定するものである。
大変参考になるが、そのままでは使えない。

麻雀を作るうえで、欠かせないのは向聴数を求めること。
実際に麻雀を打つ場合、向聴数は頭の中で計算している。
当然のことなので気づかなかった(・_・;)

向聴数が分かるならば、その組合せが分かっているので
当然欲しい牌が求められる。

まずは、向聴数を求めるコンソールアプリを作成しよう。
  1. 2010/08/04(水) 17:33:03|
  2. 麻雀
  3. | トラックバック:0
  4. | コメント:0
前のページ 次のページ

ざんないブログへようこそ!

KOH

Author:KOH
【開発環境】
Win(XP/7)/Mac Mini
Unity Pro + iOS Pro
3ds Max 2011
VS2008

【iOSアプリ】

I-C (3D puzzle) - PETITDIGI2012/09/07
I-C (3Dパズル)

I-C (3D puzzle) Free - PETITDIGI2012/09/07
I-C (3Dパズル)無料

【Androidアプリ】
I-C (3D puzzle) Free - PETITDIGI2012/11/22
I-C (3Dパズル)無料

【サイト】
・Unity 3D Selfish Training
・Unity 3D でオリジナルキャラクターを表示させる
・サイトマップ

書籍

カテゴリ

開発日記 (68)
アプリ第1弾 (37)
iPhone (16)
麻雀 (15)
Unity 3D (82)
何か作ってみよう (10)
セーブデータ (5)
開発関連 (37)
その他 Unity (28)
3ds Max (11)
体験したみた (9)
その他 3ds Max (2)
Titanium (7)
Studio (4)
iPhone (1)
Android (2)
情報 (47)
書籍 (18)
iPhone (19)
PC (2)
テレビ (4)
コンシューマ (3)
その他 情報 (1)
3.11東日本大震災 (0)
未分類 (1)

RSSリンクの表示

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。