そうでしょ。これは僕の持てる力のほとんどをつぎ込んで作りましたからね。
色々聞きたいことがあるんですけど、一つ一つ聞いていくことにしましょう。どうしてこんなに小さいサイズになるのですか?
「バッファ抜き」をしているのはもちろんの事ですが、今回は画像の軽量化を徹底しましたからね。たとえば、カードですけど、普通に考えると一枚の一枚キャストとして登録しているように思えますよね。ところがこれが違うのですよ。
え?ではいったいどうやっているのですか?
カードの台紙(枠)と、マークしか使っていないのですよ。つまり、こんな手法を使っているのです。
スペードの5の場合
ううむ、よくはわかりませんが、ま、ともかくマークの位置を全部座標で記録して、随時呼び出して描画しているわけなんですね。なるほど。で、次なんですが、カードの管理はどうやっているのですか?
それは結構簡単でした。CardListというリストを作って、その中に1から52までの数をいれます。そして、それをシャッフルします。これはランダム番目の値を抜いて、それを交換するのです。ま、そんなこんなで1から52までバラバラに並んだリストができあがる訳です。
そこまではわかるんですが……その後は?
その1番目から10番目までをカードとして使うわけですよ。1〜5はコンピュータ側、6〜10は人間側のカードとしてね。そしてたとえばコンピュータ側のカードが[1,2,3,4,5]という番号だったら、これはスペードの1から5までを表していることになります。こんな簡単なものばかりだといいんだけど、中には難しい並び方(人間にとってだけどね)もあるんですよ。たとえば[32,51,22,11,5]だったらどんな並び方かわかりますか?
ええ?うう、う難しいなぁ……
こうするんですよ。
1-13」 14-26、 27-39・ 40-52ヲとマークの割り当てを決めておきます。このようにしてすべてのカード(配られたぶんですが……)のマークと番号を別のリストに格納しておきます。
32=13*2+6 つまりマークは2番目でクラブ、番号は6番になります。
……すると、そのマークのリストと、番号のリストを使用しているのですね。
その通り!今までのリストとは違った、別のリストを作って、それを判定に使っているのです。たとえば番号のリストはこんな感じで並んでいます。
bangouList=[1,1,1,1,1,0,0,0,0,0,0,0,0]
これは1のカードが1枚、2のカードが1枚ということを表しています。この場合だとこれはストレートという役になりますね。そして、このような場合は
bangouList=[3,2,0,0,0,0,0,0,0,0,0,0,0]
1が3枚、2が2枚なのでフルハウスになります。
bangouList=[4,1,0,0,0,0,0,0,0,0,0,0,0]
このような場合は1のフォーカードになるわけです。
じゃ、マークのリストも同様にして、フラッシュかどうかを判断しているのですね。ほほう、なるほど。
コンピュータがいらないカードを自分で判断して切るのも、この原理を応用してプログラムしています。まず3カード以下の役かどうかを判定して、そのような場合はペア以外のカードを(つまり番号リストで1になっているところです)を捨てるように判断を下します。
なぁんだ、タネを聞いてしまえば、そんなに難しいプログラムではないですねぇ。
ま、そうですね。でも細かい部分は結構苦労しているんですよ。稟さんも作ってみますか?
あ、いえ、私はいいです……