Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2016-06-16

連鎖!連鎖!連鎖!

| 22:37

 落とした石を起点に消せる石を探索して消すだけでも一苦労だったのに、次々に連鎖が起こるなんて、なんかもう具合悪くなる・・・と思ったけど、何のことはない、固定石のデータを元に、全てのマス目を消去判定してやれば良いだけだった(^▽^;

#-----------------------------------------------------------------------
*連鎖
  消去石初期化。
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、固定石¥xx,yy<0でなければ
        xx,yyで消去判定。

  もし、石消去フラグ=オンならば、
    連鎖数=連鎖数+1
    母艦のタイトルは「なでこら  {消去数} {連鎖数}れんさ」
    石消去。隙埋め。連鎖
  違えば、
    連鎖数=1
    母艦のタイトルは「なでこら  {消去数}」
#-----------------------------------------------------------------------

 しかし、狙っては二連鎖しか作れない無能なワタシなので、これが正常に動いているかどうかを調べるのは至難!

 のテストの方に、よっぽど時かかった;;;

 とりあえず、三連鎖までは見た(爆)


 ここまできたら、もう出来たよーなもんじゃないですか?(喜)

 ・・・しかし!

 クライン王国のナゾを解明・・・じゃなかった、ムジュンを暴いて異議あり!しなきゃならないとゆう新たな任務が発生したため、当分は、なでこらどころじゃないのさ~~~(なにそれ;)

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

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

2016-06-10

石を消す・・・とゆうこと

| 00:13

 同じ色の石が3つ、縦横斜めに並んでいたら消す。

 単純極まりないことなんだけど・・・どーいうこっちゃ(@_@)

 とりあえず、消せるか消せないかを判定する部分は置いといて(えっ;)消すことになった石は、消去石という配列に覚えさせるということにする。

 初期化も忘れず!(爆)

#-----------------------------------------------------------------------
*消去石初期化
  石消去フラグ=オフ。
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      消去石¥xx,yy=-1
#-----------------------------------------------------------------------

 画面から石を消すこと自体は簡単なんですよ。

 固定石配列を書き換えて、の場所の石を-1にするだけだからね。

 消去石配列で、消すフラグの立った同じ場所の固定石を-1にして、固定石を再描画してやれば消えます。

#-----------------------------------------------------------------------
*石消去
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=1ならば、
        固定石¥xx,yy=-1。
        消去数=消去数+1
        母艦のタイトルは「なでこら  {消去数}」
  固定石描画。0.3秒待つ。
#-----------------------------------------------------------------------

 しかし、隙を埋めなくちゃあなりません。

 そうないと、消えた石の上に石があった場合、石が宙に浮いてる的なことになっちゃうからね。

 なんか、もっと上手い手があるような気もするけど、とりあえず、まず消去石を参照して消した石があったら、の上にある固定石のデータを全部順番に一個ずつ下にずらす。

 y軸で複数個の石が消えてた場合、何度もデータを書き換えることになってて無駄っぽいけど、まあいいや~;

#-----------------------------------------------------------------------
*隙埋め
  xxとは整数。yyとは整数。Cとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      もし、消去石¥xx,yy=1ならば、
        Cでyyから0まで繰り返す
          もし、C=0ならば、
            固定石¥xx,C=-1
          違えば、
            固定石¥xx,C=固定石¥xx,(C-1)
  固定石描画。0.3秒待つ。
#-----------------------------------------------------------------------

 して、問題の、消せるか消せないかの判定なんだけど・・・

 石を固定した後、の石の上下左右と斜めにおんなじ石があるかどうかを順番に調べていく。→同じ石だったら消去石にマークする。→違う石か壁or床だったら調べるのをやめる。→マークした石が3個以上だったら消す!*3

 ・・・で行けるかと思ったらダメだった。

 まず、早まって消してしまう(固定石に反映)と、別方向を調べる時、こに石がないことになってしまい、もし別方向にも同じ石が3個以上並んでいても消せなくなってしまう。

 では、のまま調査を続行したとすると、マークした石が増えてしまうので、もしの向きには同じ色の石が2個しか並んでいなくても、消す判定になってしまう。

 ではでは、向きによってマークする数値を変えてみたらどうかしらと思ったらそれもダメで、先に調べて消せることになった石が、別方向で2個しか並んでいなくて、消さない判定に変わってしまったりする。

 むむむ・・・

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

2016-06-01

ナゾ解明!と、石の固定

| 00:04

 またまたナゾ現象発生かと思ったら、とんだイージーミスだった(><;

 石には0~5の番号が振ってあって、ぜんぶ配列に場所を覚えさせていて、石がないところは-1とゆうことになっているのに、固定石の配列を-1でクリアするのを忘れてただけだった(爆)

 画面がっ赤?!になった時点で、よく考えればすぐに気づけたはずなのに(0番の石は赤丸)、相変わらずバカすぎる~(--;;;

#-----------------------------------------------------------------------
*石固定処理
  # 落下しきった石をメイン画面に固定する。
  # 固定石配列の書き換えと、メイン画面への石画像表示。
  落下マスXとは整数=落下X/マス目
  落下マスYとは整数=落下Y/マス目-1  # 一番上の石があるマス目

  もし、((落下マスY)<0)かつ(落下マスX=3)ならば、ゲームオーバー。
  違えば、
    xxとは整数。yyとは整数。
    3
      xx=(落下マスX)。yy=(落下マスY)+(回数-1)
      もし、yy>=0ならば
        固定石¥xx,yy=落下石¥(回数-1)

    固定石描画。
    落下フラグ=オフ。
    0.3秒待つ

*固定石描画
    xxとは整数。yyとは整数。
    メイン画面初期化。
    メイン合成用の0,0へメイン画面を画像コピー。
    6
      xx=(回数-1)
      13
        yy=(回数-1)
        x=固定石¥xx,yy。y=0。
        石用のx*マス目,y,マス目,マス目をメイン合成用のxx*マス目,yy*マス目へ画像部分コピー。
    メイン画面の0,0へメイン合成用を画像コピー。
    メイン画面をメイン合成用の0,0へ画像コピー。
    メイン合成用を表画面のメインX,メインYへ画像コピー。
#-----------------------------------------------------------------------
*固定石初期化
  xxとは整数。yyとは整数。
  6
    xx=(回数-1)
    13
      yy=(回数-1)
      固定石¥xx,yy=-1
#-----------------------------------------------------------------------
*ゲームオーバー
  「ゲームオーバー」と言う。
  終了。
#-----------------------------------------------------------------------

 次は、石の消去です。

 のままじゃ、石があっというにどんどんみ上がってしまうからねw

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