2016-06-16
連鎖!連鎖!連鎖!
落とした石を起点に消せる石を探索して消すだけでも一苦労だったのに、次々に連鎖が起こるなんて、なんかもう具合悪くなる・・・と思ったけど、何のことはない、固定石のデータを元に、全てのマス目を消去判定してやれば良いだけだった(^▽^;
#----------------------------------------------------------------------- *連鎖 消去石初期化。 xxとは整数。yyとは整数。 6回 xx=(回数-1) 13回 yy=(回数-1) もし、固定石¥xx,yy<0でなければ xx,yyで消去判定。 もし、石消去フラグ=オンならば、 連鎖数=連鎖数+1 母艦のタイトルは「なでこら {消去数} {連鎖数}れんさ」 石消去。隙間埋め。連鎖 違えば、 連鎖数=1 母艦のタイトルは「なでこら {消去数}」 #-----------------------------------------------------------------------
しかし、狙っては二連鎖しか作れない無能なワタシなので、これが正常に動いているかどうかを調べるのは至難!
とりあえず、三連鎖までは見た(爆)
・・・しかし!
クライン王国のナゾを解明・・・じゃなかった、ムジュンを暴いて異議あり!しなきゃならないとゆう新たな任務が発生したため、当分は、なでこらどころじゃないのさ~~~(なにそれ;)
2016-06-12
石の消去判定
前回、実際に石を消すのは、上下左右斜めの八方向全てに対して、石を消すかどうかの調査を完了させた後でないとうまくないということを学んだんだけど、いっこの石の調査を完了させただけではまだ不足で、落下石全部について先に調査を完了させないと、同じように、次の石を調べる時そこに石がないことになってしまい、上手くいかないのでした。
とにかく、判定中には石を消さず、調査を全部完了させてから、やっと石が消せるようになるってわけ。
・・・とゆうわけで、こうなった。
#----------------------------------------------------------------------- *消去判定(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-10
石を消す・・・とゆうこと
同じ色の石が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個しか並んでいなくて、消さない判定に変わってしまったりする。
むむむ・・・
2016-06-01
ナゾ解明!と、石の固定
またまたナゾ現象発生かと思ったら、とんだイージーミスだった(><;
石には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 #----------------------------------------------------------------------- *ゲームオーバー 「ゲームオーバー」と言う。 終了。 #-----------------------------------------------------------------------
次は、石の消去です。
中心から伸ばしてゆくと複雑な感じですが、(指定された範囲の)端から流して数える方法なら結構簡単です。
アクションゲームの場合、早い時は最速 よりも、必要な処理の時差が少ない方が安定させやすいという面もあります。
とりあえず、あとでUPするけど、連鎖についてはそれこそ、どこで連鎖してるかなんてことは考えずに、全部のマス目について消去判定をするだけで、わりとカンタンにできちゃいました☆
・・・が、あれですかね~。
ワタシの方法だと、指定したマス目を元にして、八方向に向かって調査する感じだけど、そもそもそうじゃなくて、はじめから全部のマスを端から調査する・・・とゆうようなことですか?(@_@)
全体が無いので、ロジックのイメージだけでも伝われば。
http://www.weyk.jp/files/nadekora-ro.zip
ブロックを置いた時も「全てのマスから調べる」ならば
・チェックは8方向ではなく、4方向だけでよい
・連なりは3つ以上ではなく、3つだけ調べればよい
となって、かなりすっきりします。
こんな感じ。
http://bugloderunner.my.land.to/up/co_del.txt
しかも、コードまで!!
レスがとてもとてもおそくなってしまいまして、スミマセンm(_ _)m
いや~、なにしろ、ゲーム作るのはお休みして、ゲームする方に熱中していたものですからっ;;;
とゆうわけで、本当なら、コードの内容をよく学んでから返信したいところでしたが、取り急ぎお礼まで☆