【四川省への道】第4話


こんにちは、トラップですぅ。(^o^)/

ゲームをプログラムに変える為には、対象を変数などで表現した上で、
ルールを細かく分割して組み込んでいかないといけません。
まずは、画面上の牌をプログラム内でどう表現するか・・から始めて
みましょう。

◎画面上の牌をどう表現するか?(in プログラム)

 前回までは、とりあえず表示できればいいという考えで、変数とは
 いっても、P$()とQ$()を牌のデータ格納用に使っただけでした。
 牌は36種類あるのですから、まずこれはそのまま使えるでしょう。
 では、画面のどこに、何の牌があるかを表現するにはどうしたら
 良いでしょうか?

 四川省では、横18個×縦8個の牌が綺麗に並んでいますから、
 これをそのまま変数化するのが簡単そうですね。こういった時は
 2次元配列を使うのが吉です。ただ、四川省は牌の一周り外側
 まで含んで検索を行うので、その分も考慮して「DIM G(9,19)」と
 しておきましょう。(0から始まるから10x20個分ですね)

 これで、左から3番目、上から5番目の牌に対応する変数として、
 G(5,3)のように表現できますから、この配列変数 G に、対応する
 位置にある牌の種類コード(0〜35)を入れてあげれば、どこに何が
 あるか手にとるようにわかりますね(^^)v。せっかくだから、もう
 1つ決め事!牌がない所には -1 を入れておくことにしましょ。
 これで、画面と牌との関連はばっちし。(^o^)b
 牌の表示ルーチンも、新しくお色直しなので〜す。

    2000 '
    2010 *ALLDRAW
    2020 WAIT&0
    2030 CALL@41,(&0,&12)-(&EE,&A8),&3,&0
    2040 FOR J=1 TO 8
    2050   FOR I=1 TO 18
    2060     XX=I*12-1 : YY=J*16+13+7
    2070     GCURSOR(XX,YY)   : GPRINT P$(G(J,I));
    2080     GCURSOR(XX,YY+8) : GPRINT Q$(G(J,I));
    2090   NEXT
    2100 NEXT
    2110 RETURN

◎並び替え(シャッフル)はどうやって?

 さて、大体どんなゲームでも必要になるのが「サイコロ」のように
 次が予測できない数・・・乱数です。カードゲームのシャッフルも、
 今回の牌の並び替えも、どれもバラバラに並べるのですから、乱数
 は必須項目です。

 四川省は 0〜35 のコードを持つ牌が4枚ずつあり、減りも増えも
 しませんから、一旦 0,0,0,0,1,1,1,1, ・・・ ,35,35,35,35 の様に
 全部の牌だけ用意して、それをバラバラに並び変えてやるのが、
 簡単でしょう。全て終わったら、それを順番に配列変数 G に入れて
 あげれば完了というわけです。(^^)

 そこで、並び替えの為に「DIM C(143)」としておき、サブルーチン
 「*CINIT」で配列変数 C を初期化し、「*SHUFFLE」で並べ替え、
 「*CGSET」で配列変数 C から画面に対応する配列変数 G に入れる
 といった構成を取りました。

    1750 '
    1760 *CINIT
    1770 FOR J=&0 TO &11:C(J)=J,C(J+&12)=J,C(J+&24)=J,C(J+&36)=J:NEXT
    1780 FOR J=&12 TO &23:C(J+&36)=J,C(J+&48)=J,C(J+&5A)=J,C(J+&6C)=J:NEXT
    1790 RETURN
    1800 '
    1810 *SHUFFLE
    1820 FOR I=&0 TO &120:J=RND144-1,K=RND144-1,L=C(J),C(J)=C(K),C(K)=L:NEXT
    1830 RETURN
    1840 '
    1850 *CGSET
    1860 K=&0
    1870 FOR I=&1 TO &8:FOR J=&1 TO &12:G(I,J)=C(K),K=K+&1:NEXT:NEXT
    1880 FOR I=&1 TO &8:G(I,&0)=-1,G(I,&13)=-1:NEXT
    1890 FOR I=&0 TO &13:G(&0,I)=-1,G(&9,I)=-1:NEXT
    1900 RETURN

◎今日のまとめ

 今日は、大幅に変更を加えてみました。単に牌を表示するだけなら
 構いませんが、これから先の処理を考えると、こうして少しずつでも
 構造を作っていく必要があるという事なんですね。(^^)

 なお、いつものように、今日載せたリストだけでは動かせませんので、
 上記のリストと、下記のリストを合わせて、前回の「サンプル No.2」に
 追加・置換してあげてください。(^-^)/

    1 REMサンプル No.3
    120 DIM P$(35),Q$(35),C(&8F),G(&9,&13)
    130 GOSUB *PINIT
    140 GOSUB *CINIT:GOSUB *SHUFFLE:GOSUB *CGSET:GOSUB *ALLDRAW

☆次回予告

 ゲームのルールを作り込む外枠は何とかできました。
 次回は、ゲームルールのプログラム化にてお会いしましょう。
【今回のソースお持ち帰り】 SAMPLE3.SRC