Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-06-12

石の消去判定

| 19:56

 前、実際に石を消すのは、上下左右斜めの八方向全てに対して、石を消すかどうかの調査を完了させた後でないとうまくないいうことを学んだんだけど、いっこの石の調査を完了させただけではまだ不足で、落下石全部について先に調査を完了させないと、同じように、次の石を調べる時こに石がないことになってしまい、上手くいかないのでした。

 とにかく、判定中には石を消さず、調査を全部完了させてから、やっと石が消せるようになるってわけ。


 ・・・とゆうわけで、こうなった。

#-----------------------------------------------------------------------
*消去判定(x,yで)
  Cとは整数=1。
  f1とは整数オンf2とは整数オン。
  # 左右
  5
    もしf1=オフでなければ
      もし、(x-回数<0)ならばf1オフ   # 左の壁
      違えばもし、(固定石¥(x-回数),y)=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥(x-回数),y=1でなければ、消去石¥(x-回数),y=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(x+回数>5)ならばf2オフ   # 右の壁
      違えばもし、(固定石¥(x+回数),y)=(固定石¥x,y)ならば
        C=C+1。
        もし、消去石¥(x+回数),y=1でなければ、消去石¥(x+回数),y=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

  C=1。f1=オンf2=オン。
  # 上下
  12
    もしf1=オフでなければ
      もし、(y-回数<0)ならばf1オフ   # 上端
      違えばもし、(固定石¥x,(y-回数))=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥x,(y-回数)=1でなければ、消去石¥x,(y-回数)=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(y+回数>12)ならばf2オフ   # 床
      違えばもし、(固定石¥x,(y+回数))=(固定石¥x,y)ならば
        C=C+1。
        もし、消去石¥x,(y+回数)=1でなければ、消去石¥x,(y+回数)=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

  C=1。f1=オンf2=オン。
  # 斜め\
  5
    もしf1=オフでなければ
      もし、(x-回数<0)または(y-回数<0)ならばf1オフ   # 左の壁 または 上端
      違えばもし、(固定石¥(x-回数),(y-回数))=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥(x-回数),(y-回数)=1でなければ、消去石¥(x-回数),(y-回数)=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(x+回数>5)または(y+回数>12)ならばf2オフ   # 右の壁 または 床
      違えばもし、(固定石¥(x+回数),(y+回数))=(固定石¥x,y)ならば
        C=C+1。
        もし、消去石¥(x+回数),(y+回数)=1でなければ、消去石¥(x+回数),(y+回数)=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

  C=1。f1=オンf2=オン。
  # 斜め/
  5
    もしf1=オフでなければ
      もし、(x-回数<0)または(y+回数>12)ならばf1オフ   # 左の壁 または 床
      違えばもし、(固定石¥(x-回数),(y+回数))=(固定石¥x,y)ならば、
        C=C+1。
        もし、消去石¥(x-回数),(y+回数)=1でなければ、消去石¥(x-回数),(y+回数)=0。
      違えばf1オフ。
    もしf2=オフでなければ
      もし、(x+回数>5)または(y-回数<0)ならばf2オフ   # 右の壁 または 上端
      違えばもし、固定石¥(x+回数),(y-回数)=固定石¥x,yならば
        C=C+1。
        もし、消去石¥(x+回数),(y-回数)=1でなければ、消去石¥(x+回数),(y-回数)=0。
      違えばf2オフ。
    もし、(f1=オフ)かつ(f2=オフならば抜ける。
  もし、C>=3ならば、
    消去石¥x,y=0。オンに消去フラグ設定。石消去フラグ=オン。
  違えばオフに消去フラグ設定。

*消去フラグ設定(Aに)
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=0ならば、
        もし、A=オンならば、消去石¥xx,yy=1
        違えばもし、A=オフならば、消去石¥xx,yy=-1
#-----------------------------------------------------------------------

 0でマークし、一方向を調査し終えるごと、消す判定だったら1でマークし直し、消さない判定だったら-1に戻す。

 既に消す予定になっている石(1)には、もう0は付けない

 消すかどうかはマークの数ではなく「C」でカウント。

 「f1」と「f2」は、「上・下」「左・右」など、落とした石を中心に2方向に向かって調べるので、違う石とかが出たらもうっち方向は調べなくていいよとゆうフラグ。

 繰り返しは無駄にの向きのマス目全部の最大数を設定しているけど、両方がオフになった時点で抜けるようになっている。


 して、「石固定処理」の下に、これ追加

#-----------------------------------------------------------------------
    消去石初期化
    3
      もし、落下マスY+(回数-1)<0でなければ、		#の石が画面外でなければ
        落下マスX,落下マスY+(回数-1)で消去判定
    もし、石消去フラグ=オンならば、石消去。隙埋め。連鎖
#-----------------------------------------------------------------------

 3つの石全てについて消去判定を行った後に、石の消去を行います。


 これで、いちおう上手くいってると思うんだけど・・・

 まだ、連鎖はしないけどね~。

通り道通り道2016/06/13 21:33連鎖のことも考えると、指定された範囲を走査するようにして消す場所を判定するのも手かも。
中心から伸ばしてゆくと複雑な感じですが、(指定された範囲の)端から流して数える方法なら結構簡単です。
アクションゲームの場合、早い時は最速 よりも、必要な処理の時差が少ない方が安定させやすいという面もあります。

雪乃☆雫雪乃☆雫2016/06/16 22:24通り道 さん、ありがとうございます。
とりあえず、あとでUPするけど、連鎖についてはそれこそ、どこで連鎖してるかなんてことは考えずに、全部のマス目について消去判定をするだけで、わりとカンタンにできちゃいました☆
・・・が、あれですかね~。
ワタシの方法だと、指定したマス目を元にして、八方向に向かって調査する感じだけど、そもそもそうじゃなくて、はじめから全部のマスを端から調査する・・・とゆうようなことですか?(@_@)

通り道通り道2016/06/19 19:44消去判定はリンク先のような感じです。
全体が無いので、ロジックのイメージだけでも伝われば。

http://www.weyk.jp/files/nadekora-ro.zip

とけいとけい2016/06/23 02:02こんばんは!

ブロックを置いた時も「全てのマスから調べる」ならば
・チェックは8方向ではなく、4方向だけでよい
・連なりは3つ以上ではなく、3つだけ調べればよい
となって、かなりすっきりします。

こんな感じ。
http://bugloderunner.my.land.to/up/co_del.txt

雪乃☆雫雪乃☆雫2016/07/07 00:14通り道さま、とけいさま、ありがとうございます☆!
しかも、コードまで!!
レスがとてもとてもおそくなってしまいまして、スミマセンm(_ _)m
いや~、なにしろ、ゲーム作るのはお休みして、ゲームする方に熱中していたものですからっ;;;
とゆうわけで、本当なら、コードの内容をよく学んでから返信したいところでしたが、取り急ぎお礼まで☆

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20160612