【四川省への道】第8話


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

いよいよ大詰め、今回の判定処理さえ組み込めば、遊べるゲームと
しては、ほとんど完成といえるでしょう。

◎2回曲がることで結べる場合の判定(コの字型)

 前回は2つの牌の内側で結べる場合について考えてみましたが、もう1つ、
 外側での接続も忘れちゃいけません。(^^)

   XW  T1          T2
     □□□□□□□□□□□□□
 U1 ┌──■────→EX□□□SY□ UT
   │□□↓□□□□□□□□□↑□
   │□□EY□□□□□□□□□│□
   │□□□□□□□□□□□□│□
 U2 └──SX←────────■□ UB
     □□□□□□□□□□□□□

 さて、上の図では2つの牌の間を直線で結ぶことはできません。その上、
 直角取りも、クランク取りもできない配置です・・・さて困りましたね。
 しかし、よく牌の並びを見てみると、左側でコの字接続が可能です。(^^)v

 では、この取り方ができる条件を考えてみましょう。

 まず、右側の牌が左側の牌の位置まで来れるかを調べないといけません。
 もっとも、これは前回 SX,EX,SY,EY を求めていたのですから、すぐに
 わかりますよね。(^^) コノタメニ シラベテタンダモン。

 次に、T1 から1つずつ左を調べていけばいいわけですが・・・この時、
 Y座標が U1,U2 の2つの位置を先にチェックしないといけません。
 どちらかの位置に牌があった場合は、左側では接続できないという事に
 なりますからね。上図ですと・・例えば(T1,U1)の牌の左隣が空白で
 なければ、どうやってもコの字接続はできませんものねぇ。(^^;

 両方とも空白であれば、この位置で、Y座標 UT〜UB の間に障害がないか
 調べてやります。全て空白であれば、このX座標 T1-n の位置でコの字型
 接続ができたというわけです。ここで接続できない場合は、nを1つ引き、
 更に1つ左を調べていけば良いわけですね。後は、1番左端まで調べて
 いってください。端まで調べてもダメであれば、取れなかったという事に
 なります。

 まとまったところで、プログラムにしてみましょうか・・・。
 1つずつ左をサーチしていくわけですから、そうですね・・変数 D を
 カウンタとしてやってみましょう。(^^)

    3105 ' 左・右・上・下の順番で、コの字型に取れるかを調べる。
    3110 '
    3120 D=&1
    3130 *SKL:IF FL THEN *SKR
    3140 XW=T1-D:IF XW<0 THEN FL=-1:FA=FA AND &E:GOTO *SKR
    3145 ' X座標=XWで、Y座標 UT〜UB に障害物がないかを調べる。
    3150 GOSUB *YLCHK:IF RC THEN *T1WW2U1122
    3155 ' 1つ左があいているかを調べる。
    3160 IF G(UT,XW)<>-1 OR G(UB,XW)<>-1 THEN FL=-1:FA=FA AND &E
    3165 '
    3170 *SKR:IF FR THEN *SKT
    3180 XW=T2+D:IF XW>19 THEN FR=-1:FA=FA AND &D:GOTO *SKT
    3185 ' X座標=XWで、Y座標 UT〜UB に障害物がないかを調べる。
    3190 GOSUB *YLCHK:IF RC THEN *T1WW2U1122
    3195 ' 1つ右があいているかを調べる。
    3200 IF G(UT,XW)<>-1 OR G(UB,XW)<>-1 THEN FR=-1:FA=FA AND &D
    3205 '
    3210 *SKT:IF FT THEN *SKB
    3220 YW=UT-D:IF YW<0 THEN FT=-1:FA=FA AND &B:GOTO *SKB
    3225 ' Y座標=YWで、X座標 T1〜T2 に障害物がないかを調べる。
    3230 GOSUB *XLCHK:IF RC THEN *T1122U1WW2
    3235 ' 1つ上があいているかを調べる。
    3240 IF G(YW,T1)<>-1 OR G(YW,T2)<>-1 THEN FT=-1:FA=FA AND &B
    3245 '
    3250 *SKB:IF FB THEN *SKE
    3260 YW=UB+D:IF YW>9 THEN FB=-1:FA=FA AND &7:GOTO *SKE
    3265 ' Y座標=YWで、X座標 T1〜T2 に障害物がないかを調べる。
    3270 GOSUB *XLCHK:IF RC THEN *T1122U1WW2
    3275 ' 1つ下があいているかを調べる。
    3280 IF G(YW,T1)<>-1 OR G(YW,T2)<>-1 THEN FB=-1:FA=FA AND &7
    3285 '
    3290 *SKE:D=D+&1:IF FA THEN *SKL
    3300 '

 ちょっと余計な部分も入っていたりしますが(^^ゞ、内容は先程の話と
 同様ですよね。3140行で、端っこかの判定をして、大丈夫であれば、
 X座標 XW の位置で縦のラインをチェックするというわけです。
 この位置がダメな場合、1つ左にいけるかどうかを、3160行で判定
 してるんです(^^)。後は、右側、上側、下側・・・と、それぞれの
 方向のチェックを行なっています。

 で・・・ちょっと余計な部分ですが、コの字で取れるかどうかを
 判定するのに、左側を全部調べてから右、右を調べてから上・・
 というのではなく、1つずつ左・右・上・下を調べて、どこも
 取れない場合は、D の値を増やして更に外枠を見るようにしよう
 と考えたんです。その時、既に取れない事がわかっている方向を
 調べるのは時間の無駄ですので、FL,FR,FT,FB というフラグを
 設け、その値が 0 以外の場合には、その方向は調べないという
 具合に組んでみました。ちなみに FAというフラグは、上記4つの
 フラグを1つにまとめたものです。コの字型接続チェックループを
 抜ける条件は、「FL AND FR AND FT AND FB」となりますので、
 ちょっと長いかな〜なんて思ったのです。(^^ゞ マ、アマリ キニシナイデ。

 なお、FL,FR,FT,FB に関してですが、SX,SY,EX,EY を求めた段階で
 ある程度わかっていますので、次の行を追加しておきましょう。(^^)

    2795 ' (T1,U1)から、(T2,U1)まで来れなければ、右側のコの字型は不可能。
    2800 IF EXT1 THEN FL=-1:FA=FA AND &E ELSE FL=&0

    3025 ' 先ほど調べた EY が UB に届かない場合は、下側のコの字型は有りえない。
    3030 IF EYUT THEN FT=-1:FA=FA AND &B ELSE FT=&0

◎乱数系列の初期化

 今までのサンプルプログラムを実行された方はお気づきのことと思いますが、
 シャッフルしているのに、毎回同じ牌の並びだった・・・・・なんてことは
 なかったでしょうか?これは、コンピュータによって作られる乱数が、計算に
 よって作られる擬似乱数であるところからくるものなのですが、そのままでは
 ゲームになりません。その場合は、乱数系列の初期化をかけてあげます。
 Add-In BASIC の場合なら、RANDOMIZE を実行しておけばオッケーです。
 以下の行を追加して実行してくださいね。(^o^)

    1 REMサンプル No.7

    125 RANDOMIZE

☆次回予告

 もう、これで完成といってもいいレベルに来ました。
 次回は、ちょっとした飾り付け・・・牌を取る時の接続ライン
 描画などを行ってみましょう。
【今回のソースお持ち帰り】 SAMPLE7.SRC