麻雀プログラム
② 役判定、やっとおわりました・・・・
簡単かなぁ~ と思ってたら 甘かった。
でも、まだ リーチ、ツモ、ドラ、鳴き など判定していないので未完成です。(´Д⊂ヽ
今回は綺麗に書くことを目標!!
と、していたのですが・・・・
もう、ね。
考えて考えて考えた考えた( たまに逃げた )のに、もうめちゃくちゃになった。
見やすくするために考える。
↓
くそぉ・・・ ここがどうしても・・・
↓
( ゚∀゚)・∵. グハッ!!
↓
諦めた
って感じですかね。
で、一番苦労した点は
----------------------------------------------------------------------
① 平和 ← こいつが一番難しかった
② 平和 ← コノヤロウ・・・
③ 平和 ← カーッ(゚Д゚≡゚д゚)、ペッ
平和の野郎ォォォォォオオオオオオオオオオオ!!!!
【 平和 】
メンゼン待ち( 鳴いてたらダメ )
すべて順子( ①②③ みたいな、刻子は ①①① みたいな)
頭が 三元牌、風牌、以外
両面待ち
①① ②④ ⑥⑦⑧・・・ ← これで ③ 待ち(単騎)だとダメ
①① ③④ ⑥⑦⑧・・・ ← これだと ②、⑤待ち(両面)なのでおk
条件多い・・・
こやつには殺意を覚えました。
役判定は
役ひとつに付き一個フラグを持たせます。
最初にすべての役フラグを立たせ、役判定をした後に、最後まで立っていたら役として成立させる。
(立てるんじゃなくて、下ろす)
というふうにしてました。 なぜそうしたかというと。
(例)
-----------断ヤオ----------
【 フラグを下げていく方法 】
for ( 手牌の数だけループ )
{
if ( 1 or 9 or 字牌 以外? )
断ヤオフラグを下げる。
}
↑ これだけでいい
【 フラグを立てていく方法 】
bool tanyao = true;
for ( 手牌の数だけループ )
{
if ( 1 or 9 or 字牌 以外? )
{
tanyao = false;
break;
}
}
if ( tanyao == true )
断ヤオフラグを立たせる
↑ ちょっと長い
『ふむ、 短くなるか・・・』 と思い、していったところ、
フラグを立たせていくほうが良かった。 ( ゚д゚)!!
やっぱり、立たせていくほうがフラグっぽいし、
プラグラム的にも見やすい( ー`дー´)キリッ
俺は、引き返せなくなっていたので もう・・・つД`)・゚・。・゚゚・*:.。..。.:*・゚
で、今回フラグ管理方法として、 ビット演算 を使いました。
ので、復習のためこいつを書いていこうかなと。
-------------------------------------------------------------------
【 ビット演算 】
RPGなどで、状態異常として、 どく、やけど、まひ、ねむり、石化・・・・・
など、あると思いますが、
『こいつら一つに付き フラグ用変数一個設けるのは無駄じゃないのかね!?』
と思ったやつが ビット演算 使っているのかと。
フラグなんて、立ってるか立ってないかさえわかればいいので、 0 or 1 だけ入ればいいんだと。
それなら 1ビットでできるやない? と。
1ビットは 0 or 1 しか入らない入れ物。(ここは二進数知ってるといいかも)
で、よく その変数として unsigned int( 4バイト ) が使われる。
1バイト = 4ビット。 4バイト = 32ビット
ということで、32個ものフラグ管理が可能となる (; ・`д・´) ナ、ナンダッテー!! (`・д´・ ;)
たいていそんなにいらないと思うので unsigned char( 1バイト = 8ビット ) を使っていく。
ビット演算子 で最低限覚えておくもの、
& : and, | : or, ~ : not
あとは シフト
>> : 右シフト、 << : 左シフト
だけでイケル。 イケルイケル。
例として 1バイト( 4ビット ) を使う。
------------------------
まず、 & : and これは、 【どちらとも 1 の時、1にする。】
(例)
1011 & 1001 = 1001
1 かつ 1 の時、 1にする。 って覚える ・・・のかな?
------------------------
次、 | : or これは、【どちらか 1 の時、1にする。】
(例)
1011 | 1001 = 1011
------------------------
最後に ~ : not 【 0 と 1 を入れ替える 】
(例)
~1011 → 0100
これは 1 と 0 を反転させる
------------------------
【 シフト 】
左シフトを n回 すると 2のn乗 をかけることと一緒。
------------------------
(例)
1 << 2 = 4
0001 0100 ← 二進で見ると、 2つ左に行っていることが分かる
------------------------
右シフトも同じで、 右にずらすと 2 で割ることになる。
(例)
6 >> 2 = 1
0110 0001 ← 2つ右に行っている。
------------------------
これらを使って フラグ管理をする。
まずは 状態異常の列挙型と状態を表す変数を作ってみる
--------------------------------------
// 状態列挙型
enum STATE
{
// 変な名前ですいません。 DOKU → POISON とかにした方がいいです。
STATE_DOKU = ( 1 << 0 ) // 毒
STATE_YAKEDO = ( 1 << 1 ) // やけど
STATE_SEKIKA = ( 1 << 2 ) // 石化
STATE_MAHI = ( 1 << 3 ) // 麻痺
STATE_NEMURI = ( 1 << 4 ) // 眠り
};
// 状態
unsigned char stateFlag = 0; 0 は 00000000
--------------------------------------
これで、それぞれ 8ビット だと、
毒 → 00000001
やけど → 00000010
石化 → 00000100
麻痺 → 00001000
眠り → 00010000
という風になる。
で、もし 毒状態になったときは、
stateFlag |= STATE_DOKU;
00000000 | 00000001 = 00000001 となり、これで毒フラグが立った、ということにできる。
ためしに 他のフラグも立てる
stateFlag |= STATE_YAKEDO;
00000001 | 00000010 = 00000011
ちゃんと毒状態のフラグも残っている。
複数操作するときは
stateFlag |= ( STATE_MAHI | STATE_NEMURI )
00000011 | 00011000 = 00011011
こうすると、いっぺんに マヒと眠り のフラグを立てれる。
確認するときは
if ( ( stateFlag & STATE_DOKU ) != 0 )
{
// 毒状態にかかっている。
}
00011011 & 00000001 = 00000001 で、1となり、0ではないので 、条件にあっている
と書ける
逆にフラグを下げるときは
stateFlag &= ~STATE_DOKU;
00011011 & 11111110 = 00011010 と、毒のフラグをすべて反転して、それと & をすることによって、周りのフラグには迷惑をかけずに、指定したフラグだけ下げれる。
確認の時も、下げる時も、 ↑のフラグ立てるときのように複数いっぺんに操作できる。
------------------------------------------------------------------
すげー簡単に説明しました(;´Д`)ハァハァ
まだまだ一部ですが、なんとかなるかなと・・・
コレを使って フラグクラス をいうものを作ったらかなり便利かな。。。
ああああああああああああああああああああああああ
二時間以上wwww
書いてる途中に一回戻るボタン押してしまって消えた・・・_| ̄|○
マジショック・・・w( ゚∀゚)・∵. グハッ!!
くそぉぉぉぉっぉおおおおおおおおお!!!
これからはちょくちょく保存することにしようと誓いました。
一応今の段階のソース載せときます。
参考にならねぇww
【 麻雀② 訂正② 】 なおしました。。。
てか、バグあると思います。。。
今から直していくので、 かなり 仮仮 です。
もうしわけない・・・m(_ _)m
あ、役判定全部終わってなかった・・・Σ(゚д゚lll)