俺に力をくれぇええええ シェンロォォォォォォォォオオオン!!! | ゲームプログラマ志望が福岡で叫ぶ 『絶望』

ゲームプログラマ志望が福岡で叫ぶ 『絶望』

プログラマーになりたい!!!!! あ、風のうわさで聞いた最近若者で流行っているトゥイッターなるものを始めてみました (・ト・) @toshi_desu_yo

麻雀プログラム

② 役判定、やっとおわりました・・・・


簡単かなぁ~ と思ってたら 甘かった。



でも、まだ リーチ、ツモ、ドラ、鳴き など判定していないので未完成です。(´Д⊂ヽ


今回は綺麗に書くことを目標!!

と、していたのですが・・・・


もう、ね。



考えて考えて考えた考えた( たまに逃げた )のに、もうめちゃくちゃになった。

    


   見やすくするために考える。

          ↓

    くそぉ・・・ ここがどうしても・・・

          ↓ 

       ( ゚∀゚)・∵. グハッ!!

          ↓

         諦めた


って感じですかね。





で、一番苦労した点は



----------------------------------------------------------------------



① 平和 ← こいつが一番難しかった

② 平和 ← コノヤロウ・・・

③ 平和 ← カーッ(゚Д゚≡゚д゚)、ペッ


平和の野郎ォォォォォオオオオオオオオオオオ!!!!




【 平和 】

   メンゼン待ち( 鳴いてたらダメ )

   すべて順子( ①②③ みたいな、刻子は ①①① みたいな)

   頭が 三元牌、風牌、以外

   両面待ち 

     ①① ②④ ⑥⑦⑧・・・  ← これで ③ 待ち(単騎)だとダメ

     ①① ③④ ⑥⑦⑧・・・  ← これだと ②、⑤待ち(両面)なのでお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)