|
|
|
2008/1/15(Tue) 20:07:52|NO.13088
初めまして。
いきなりですが、落ちゲーをつくていると、ブロックを削除する所で
エラーが出てしまいました。
再帰がうまく書けないので教えて頂きたいです。
*start
onkey 0
dim field,6,15
dim drop,2,2
buffer 1,34,34
picload "dodai.jpg"
buffer 2,34,34
picload "aka.jpg"
buffer 3,34,34
picload "ao.jpg"
buffer 4,34,34
picload "kiiro.jpg"
buffer 5,34,34
picload "midori.jpg"
buffer 6,34,34
picload "Taka.jpg"
buffer 7,34,34
picload "Tao.jpg"
buffer 8,34,34
picload "Tkiiro.jpg"
buffer 9,34,34
picload "Tmidori.jpg"
screen 0,300,600
#const global size 34
goto *stert
#defcfunc investigate var x var y var n
my=field(x,y)//自分の色
field(x,y)=0
n++
if x+1<size*6&field(x+1,y)=my : investigate(x+1,y,n)
if y+1<size*13&fieldxy+1=my : investigate(x,y+1,n)
if x-1>=0&field(x-1,y)=my : investigate(x-1,y,n)
if y-1>=0&field(x,y-1)=my : investigate(x,y-1,n)
return
*stert
randomize
drop(0,0)=rnd(8)+1
drop(0,1)=rnd(8)+1// 初め
e=2
d=0
speed=25
*main
gosub *paint
gosub *keyhit
gosub *ope
await 1
goto *main
*paint
redraw 0
color 255,255,255:boxf
for b,0,14,1
pos 0,b*size+size*3
gcopy 1,0,0,size,size
pos size*7,b*size+size*3
gcopy 1,0,0,size,size
next
for c,0,8,1
pos size*c,size*16
gcopy 1,0,0,size,size
next
for b,0,2,1
for c,0,2,1
if drop(b,c)=1:pos (b+e+1)*size,(c+d)*size+size:gcopy 2,0,0,size,size //赤
if drop(b,c)=2:pos (b+e+1)*size,(c+d)*size+size:gcopy 3,0,0,size,size //青
if drop(b,c)=3:pos (b+e+1)*size,(c+d)*size+size:gcopy 4,0,0,size,size //黄
if drop(b,c)=4:pos (b+e+1)*size,(c+d)*size+size:gcopy 5,0,0,size,size //緑
if drop(b,c)=5:pos (b+e+1)*size,(c+d)*size+size:gcopy 6,0,0,size,size //泡赤
if drop(b,c)=6:pos (b+e+1)*size,(c+d)*size+size:gcopy 7,0,0,size,size //泡青
if drop(b,c)=7:pos (b+e+1)*size,(c+d)*size+size:gcopy 8,0,0,size,size //泡黄
if drop(b,c)=8:pos (b+e+1)*size,(c+d)*size+size:gcopy 9,0,0,size,size //泡緑
next
next
for b,0,6,1
for c,0,15,1
if field(b,c)=1:pos (b+1)*size,c*size+size:gcopy 2,0,0,size,size //赤
if field(b,c)=2:pos (b+1)*size,c*size+size:gcopy 3,0,0,size,size //青
if field(b,c)=3:pos (b+1)*size,c*size+size:gcopy 4,0,0,size,size //黄
if field(b,c)=4:pos (b+1)*size,c*size+size:gcopy 5,0,0,size,size //緑
if field(b,c)=5:pos (b+1)*size,c*size+size:gcopy 6,0,0,size,size //泡赤
if field(b,c)=6:pos (b+1)*size,c*size+size:gcopy 7,0,0,size,size //泡青
if field(b,c)=7:pos (b+1)*size,c*size+size:gcopy 8,0,0,size,size //泡黄
if field(b,c)=8:pos (b+1)*size,c*size+size:gcopy 9,0,0,size,size //泡緑
next
next
redraw 1
return
*keyhit
stick g,0
be=e
if g&1 : e--
if g&4 : e++
if e<0 : e=0
if e>5 : e=5
if field(e,d+1)!=0:e=be
getkey g,40
if g=1:h+=speed/2
return
*ope
fallflag=0
h++
if h>=speed{
d++
h-=speed
fallflag=1
}
if d=14{
field(e,13)=drop(0,0)
field(e,14)=drop(0,1)
gosub *balldecide
}
if field(e,d+1)!=0&&fallflag=1{
field(e,d-1)=drop(0,0)
field(e,d)=drop(0,1)
gosub *balldecide
}
if field(2,1)!=0:goto *gameover
return
*balldecide
;ボールを決定
drop(0,0)=rnd(8)+1
drop(0,1)=rnd(8)+1// 初め
e=2
d=0
return
*gameover
;ゲームオーバー
color 0,0,0:boxf
color 255,255,255
pos 0,0
font msgothic,40
mes "GAME\nOVER"
onkey goto *start
stop
画像ファイルが無くてすいません。
| |
|
2008/1/16(Wed) 09:19:46|NO.13093
謝る前に、
buffer 1,34,34 :color 96, 96, 96,boxf//picload "dodai.jpg"
buffer 2,34,34 :color 255, 0, 0,boxf//picload "aka.jpg"
buffer 3,34,34 :color 0,255, 0,boxf//picload "ao.jpg"
buffer 4,34,34 :color 255, 0,255,boxf//picload "kiiro.jpg"
buffer 5,34,34 :color 0, 0,255,boxf//picload "midori.jpg"
buffer 6,34,34 :color 128, 0, 0,boxf//picload "Taka.jpg"
buffer 7,34,34 :color 0,128, 0,boxf//picload "Tao.jpg"
buffer 8,34,34 :color 0, 0,128,boxf//picload "Tkiiro.jpg"
buffer 9,34,34 :color 0,128, 0,boxf//picload "Tmidori.jpg"
位の事が、何故出来ないのだ?
で、再帰処理がうまくいかない以前に、大分書き方間違えているように見受けられるが。
#defcfuncは結果を返してくるので、結果を受け取る変数が必要だ。
あと、引数を,で区切っていない。
普通に過去ログ検索で「#defcfunc」を検索したら実際に使われている様子が確認できるだろう。
・・・ついでに「再帰」で過去ログ検索かけて見る事を薦める。
|
|
2008/1/16(Wed) 09:30:16|NO.13094
・・・ふむ。「再帰がうまく『かけない』」と言っているのか。
では、書き方が間違っているという指摘は、それ自体間違いだったようだ。失礼。
|
|
2008/1/16(Wed) 21:18:16|NO.13102
画像ファイルを用いたのは、普通のブロックと違う
特殊なブロックを作ろうと思っていたからです。
fさんのおかげえで「#defcfunc」を使うときは、何か結果を入れる変数を
書かなければいけないというのは分かりました。
でも、私には具体的に何をすればいいのか分かりません。
できればヒントを頂けませんか。
|
|
2008/1/16(Wed) 21:27:13|NO.13104
再帰が分からないとのことですが、階乗の計算などの小さなスクリプトを組んで経験を積まれることをお勧めします。サンプルスクリプトは以下を参照してください。
http://hspdev-wiki.net/?RecursiveCall
#defcfuncも使い慣れていないならば、まずは(再帰とかは放っておいて)慣れるための小さなスクリプトを組みましょう。こうした事は教えてもらっても分からないので、実践あるのみです。
「何が分からないか」が分かっているならば解決しやすいと思います。頑張ってください!
|
|
2008/1/16(Wed) 22:22:17|NO.13105
>画像ファイルを用いたのは、普通のブロックと違う
>特殊なブロックを作ろうと思っていたからです。
ちがう。
俺らはそんな画像持ってないんだから、画像ファイルを必要とするような
スクリプトを出してくるなと言っているんだ。
ココでは何度も言っている事だが、俺らは態々適当な画像を用意しなきゃならんのか?
それとも俺が書き込みしたように、適当な色で塗りつぶしておくようこちらが改造しなきゃならんのか?
謝る位なら最初から手間かけさせないように修正しておいてくれ。
難しい事は言っていないつもりだが。
>でも、私には具体的に何をすればいいのか分かりません。
「#defcfunc」で過去ログ検索すれば実際に使っている事例が出てくると言っただろうが。
調べたのか?調べもせずにそんな事を言うのか?
>あと、引数を,で区切っていない。
と言ったがが、見づら買ったかもしれないので一応書き直しておく。
引数を半角の「,」で区切ってない。
で、#defcfuncの件が治れば、(意図した通りかどうかは知らないが)とりあえず動作する
のはこちらで確認してあるので、まず過去ログを調べるようにしてもらいたい。
|
|
2008/1/17(Thu) 18:52:56|NO.13108
すいませんでした。ソースを読む人のことも考えずに質問してしまって。
fさんの言う通り頑張ってみます。
ありがとうございました。
|
|
2008/1/17(Thu) 20:06:51|NO.13109
#defcfunc investigate var x var y var n
my=field(x,y)//自分の色
field(x,y)=0
n++
if x+1<size*6&field(x+1,y)=my : investigate(x+1,y,n)
if y+1<size*13&fieldxy+1=my : investigate(x,y+1,n)
if x-1>=0&field(x-1,y)=my : investigate(x-1,y,n)
if y-1>=0&field(x,y-1)=my : investigate(x,y-1,n)
return
引数の型varは、変数を受けとるための型なのでx y にvarはマズイよ。
varに x+1 とかは渡せないので、この場合はintにする。
変数どうしの関係が複雑にならないように、#module 〜 #global で囲った方がいいです。
return値を必要としないなら、#fedcfuncじゃなく#deffuncにしましょ。
fieldxy+1=my は field(x,y+1)=my の間違だよね。
|
|
2008/1/18(Fri) 15:59:32|NO.13120
解決して無いなら解決にしなくて良いと思うがな。
調べて解らなかったらまた聞きに来れば良いんでね。
|
|
2008/1/19(Sat) 01:46:30|NO.13136
誰か、デバッグしてちょ。
問題は、時々、消えるべきブロックが消えなかったり、
消えるべきでないブロックが消えたりすること。
それ以外は仕様ということにしておこう。
[前略]
;#defcfunc investigate var x, var y, var n
#defcfunc investigate int x1, int y1, int m1, int n1
if initflg==0 {
initflg=1
dim stackx,100
dim stacky,100
dim stackm,100
dim stackn,100
sp=0
}
x=x1
y=y1
m=m1
n=n1
if x+m>=6: return 0
if x+m<0: return 0
if y+n>14: return 0
if y+n<0: return 0
if field(x,y)==0: return 0
;dialog "1 x="+x+" y="+y+" m="+m+" n="+n+" field(x,y)="+field(x,y)+" field(x+m,y+n)="+field(x+m,y+n),2
;if stat==7: end
if field(x,y)!=field(x+m,y+n): return 0
;dialog "2 x="+x+" y="+y+" m="+m+" n="+n+" field(x,y)="+field(x,y)+" field(x+m,y+n)="+field(x+m,y+n),2
;if stat==7: end
if m!=-1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,1,0): sp--: x=stackx.sp: y=stacky.sp: m=stackm(sp): n=stackn(sp)
if m!=1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,-1,0): sp--: x=stackx(sp): y=stacky(sp): m=stackm(sp): n=stackn(sp)
if n!=-1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,0,1): sp--: x=stackx(sp): y=stacky(sp): m=stackm(sp): n=stackn(sp)
if n!=1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,0,-1): sp--: x=stackx(sp): y=stacky(sp): m=stackm(sp): n=stackn(sp)
;dialog "3 x="+x+" y="+y+" m="+m+" n="+n+" field(x,y)="+field(x,y)+" field(x+m,y+n)="+field(x+m,y+n),2
;if stat==7: end
field(x+m,y+n)=0
return 1
#deffunc invest int x2, int y2
xx=x2
yy=y2
flg=0
flg=investigate(xx,yy,1,0) | flg
flg=investigate(xx,yy,-1,0) | flg
flg=investigate(xx,yy,0,1) | flg
flg=investigate(xx,yy,0,-1) | flg
if flg: field(xx,yy)=0
return
[中略]
if d=14{
field(e,13)=drop(0,0)
field(e,14)=drop(0,1)
invest e,d
invest e,d-1
gosub *balldecide
}
if field(e,d+1)!=0&&fallflag=1{
field(e,d-1)=drop(0,0)
field(e,d)=drop(0,1)
invest e,d
invest e,d-1
gosub *balldecide
}
[後略]
| |
|
2008/1/19(Sat) 11:31:36|NO.13143
ANTARES氏のこのスクリプトは、
「2つくっついたら消える」というルールです…よね?
|
|
2008/1/19(Sat) 21:22:08|NO.13161
止まったブロックにつながる同色ブロックがすべて消えるというルールです。
「消えるべきでないブロックが消えなかったり」というのは、
止まったブロックのまわりに同色ブロックが全くないのに消えるということで、
「消えるべきブロックが消えない」というのは、
止まったブロックのまわりに同色ブロックがあるのに消えないということです。
それ以外は仕様通りです。
同色2つのペアが落ちてきたときは必ず消えます。
|
|
2008/1/19(Sat) 21:25:18|NO.13162
再帰で書いてみたけど、自分のもなんか時々動き変かもw
3つ以上くっついたら消える仕様のつもり。
ゲームって、デバックするの面倒なんだね。ゲーム下手すぎてデバックにならん。
*start
onkey 0
dim field,6,15
dim drop,2,2
//▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
buffer 1,34,34 : color 96, 96, 96 : boxf //picload "dodai.jpg"
buffer 2,34,34 : color 255, 0, 0 : boxf //picload "aka.jpg"
buffer 3,34,34 : color 0,255, 0 : boxf //picload "ao.jpg"
buffer 4,34,34 : color 255, 0,255 : boxf //picload "kiiro.jpg"
buffer 5,34,34 : color 50,255,255 : boxf //picload "midori.jpg"
buffer 6,34,34 : color 100, 0, 0 : boxf //picload "Taka.jpg"
buffer 7,34,34 : color 0,100, 0 : boxf //picload "Tao.jpg"
buffer 8,34,34 : color 0, 0,255 : boxf //picload "Tkiiro.jpg"
buffer 9,34,34 : color 0, 0, 0 : boxf //picload "Tmidori.jpg"
//△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△
screen 0,300,600
#const global size 34
//▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
#module
;┌─────────────────────────────
;│繋がっている個数を調べる
;│Params:
;│ int x = 座標
;│ int y = 座標
;│ int inside = 内部呼び出しか否か 0:外部から 1:内部から
;│Return:
;│ 繋がっている個数 (ブロックの無い座標だと0が返る)
;│Note:
;│ 引数insideは、0にして呼び出す事!
;└
#defcfunc investigate int x, int y, int inside, local n
if inside==0 {
if length(erase_field)==1 : dim erase_field,6,15 //初めだけ領域確保
memset erase_field, 0, 4*6*15 //ゼロで初期化
my = field@(x,y) //自分の色
}
if field@(x,y) == 0 : return 0 //ブロックが無いなら、何もせず戻る
if erase_field(x,y) != 0 : return 0 //既に調べた箇所なら、何もせず戻る
erase_field(x,y) = 1 //消える場所に印を付けておく
n++ //印を付けたらカウントアップ
if x+1<6 : if field@(x+1,y)==my : n += investigate(x+1,y,1)
if y+1<15 : if field@(x,y+1)==my : n += investigate(x,y+1,1)
if x-1>=0 : if field@(x-1,y)==my : n += investigate(x-1,y,1)
if y-1>=0 : if field@(x,y-1)==my : n += investigate(x,y-1,1)
return n
;┌─────────────────────────────
;│investigateの調査結果をもとに、ブロックを消す
;└
#deffunc erase_block
for yy, 0, 15, 1
for xx, 0, 6, 1
if erase_field(xx,yy)!=0 : field@(xx,yy) = 0
next
next
return
;┌─────────────────────────────
;│空きを詰める
;└
#defcfunc squash_up
flag = 0
for xx, 0, 6, 1
yyy = 15-1
for yy, 15-1, 0-1, -1
if field@(xx,yy)!=0 {
if yy != yyy {
field@(xx,yyy) = field@(xx,yy)
field@(xx,yy) = 0
flag = 1
}
yyy--
}
next
next
return flag
#global
//△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△△
randomize
drop(0,0)=rnd(8)+1
drop(0,1)=rnd(8)+1// 初め
e=2
d=0
speed=25
*main
gosub *paint
gosub *keyhit
gosub *ope
await 1
goto *main
*paint
redraw 0
color 255,255,255:boxf
for b,0,14,1
pos 0,b*size+size*3
gcopy 1,0,0,size,size
pos size*7,b*size+size*3
gcopy 1,0,0,size,size
next
for c,0,8,1
pos size*c,size*16
gcopy 1,0,0,size,size
next
if erase_flag==0 { //←☆ ブロック消し中は、落ちてくるブロックは表示させない
for b,0,2,1
for c,0,2,1
if drop(b,c)=1:pos (b+e+1)*size,(c+d)*size+size:gcopy 2,0,0,size,size //赤
if drop(b,c)=2:pos (b+e+1)*size,(c+d)*size+size:gcopy 3,0,0,size,size //青
if drop(b,c)=3:pos (b+e+1)*size,(c+d)*size+size:gcopy 4,0,0,size,size //黄
if drop(b,c)=4:pos (b+e+1)*size,(c+d)*size+size:gcopy 5,0,0,size,size //緑
if drop(b,c)=5:pos (b+e+1)*size,(c+d)*size+size:gcopy 6,0,0,size,size //泡赤
if drop(b,c)=6:pos (b+e+1)*size,(c+d)*size+size:gcopy 7,0,0,size,size //泡青
if drop(b,c)=7:pos (b+e+1)*size,(c+d)*size+size:gcopy 8,0,0,size,size //泡黄
if drop(b,c)=8:pos (b+e+1)*size,(c+d)*size+size:gcopy 9,0,0,size,size //泡緑
next
next
} //←☆
for b,0,6,1
for c,0,15,1
if field(b,c)=1:pos (b+1)*size,c*size+size:gcopy 2,0,0,size,size //赤
if field(b,c)=2:pos (b+1)*size,c*size+size:gcopy 3,0,0,size,size //青
if field(b,c)=3:pos (b+1)*size,c*size+size:gcopy 4,0,0,size,size //黄
if field(b,c)=4:pos (b+1)*size,c*size+size:gcopy 5,0,0,size,size //緑
if field(b,c)=5:pos (b+1)*size,c*size+size:gcopy 6,0,0,size,size //泡赤
if field(b,c)=6:pos (b+1)*size,c*size+size:gcopy 7,0,0,size,size //泡青
if field(b,c)=7:pos (b+1)*size,c*size+size:gcopy 8,0,0,size,size //泡黄
if field(b,c)=8:pos (b+1)*size,c*size+size:gcopy 9,0,0,size,size //泡緑
next
next
redraw 1
return
*keyhit
stick g,0
be=e
if g&1 : e--
if g&4 : e++
if e<0 : e=0
if e>5 : e=5
if field(e,d+1)!=0:e=be
getkey g,40
if g=1:h+=speed/2
return
*ope
fallflag=0
h++
if h>=speed{
d++
h-=speed
fallflag=1
}
if d=14{
field(e,13)=drop(0,0)
field(e,14)=drop(0,1)
gosub *check //←☆
gosub *balldecide
}
if field(e,d+1)!=0 & fallflag=1 {
field(e,d-1)=drop(0,0)
field(e,d)=drop(0,1)
gosub *check //←☆
gosub *balldecide
}
if field(2,1)!=0:goto *gameover
return
//▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
//ブロック消えた時の停止時間
#const global erase_wait 1000
*check
n = investigate(e, d, 0)
if n >= 3 {
erase_block
erase_flag = 1
gosub *paint
await erase_wait
}
n = investigate(e, d-1, 0)
if n >= 3 {
erase_block
erase_flag = 1
gosub *paint
await erase_wait
}
while erase_flag
if squash_up() { //空きを詰めた場合
erase_flag = 1
gosub *paint
await erase_wait
}
else { //空きが無かった場合
erase_flag = 0
_break
}
erase_flag = 0
for yy,0,15,1
for xx,0,6,1
n = investigate(xx,yy, 0)
if n >= 3 {
erase_block
erase_flag = 1
gosub *paint
await erase_wait
_break
}
next
if erase_flag : _break
next
wend
return
//△△△△△△△△△△△△△△△△△△△
*balldecide
;ボールを決定
drop(0,0)=rnd(8)+1
drop(0,1)=rnd(8)+1// 初め
e=2
d=0
return
*gameover
;ゲームオーバー
color 0,0,0:boxf
color 255,255,255
pos 0,0
font msgothic,40
mes "GAME\nOVER"
onkey goto *start
stop
| |
|
2008/1/19(Sat) 22:34:23|NO.13163
>ゲーム下手すぎてデバックにならん。
#ifdef _DEBUG
getkey dbg,65
if dbg {
repeat: wait 1
getkey dbg,65
if dbg==0: break
loop
repeat: wait 1
getkey dbg,65
if dbg: break
loop
repeat: wait 1
getkey dbg,65
if dbg==0: break
loop
}
#endif
|
|
2008/1/19(Sat) 22:47:04|NO.13164
ANTARESさん、ありがとー。
簡単に一時停止できるから、考える時間あるし確認しやすーい。
|
|
2008/1/20(Sun) 00:21:59|NO.13165
何だ、犯人はf さんだったのか。
#if 0
buffer 7,34,34 :color 0,128, 0,boxf//picload "Tao.jpg"
buffer 8,34,34 :color 0, 0,128,boxf//picload "Tkiiro.jpg"
#else
buffer 7,34,34 :color 0, 0,128:boxf//picload "Tao.jpg"
buffer 8,34,34 :color 128, 0,128:boxf//picload "Tkiiro.jpg"
#endif
|
|
2008/1/20(Sun) 01:00:19|NO.13167
皆様本当にありがとうございました。
|
|
2008/1/20(Sun) 01:13:25|NO.13168
うーん、スタック配列なんか使わなくても、
local変数使えばよかったのねん。
何かあったはずだと思ったんだけど……。
#if 0
#defcfunc investigate int x1, int y1, int m1, int n1
if initflg==0 {
initflg=1
dim stackx,100
dim stacky,100
dim stackm,100
dim stackn,100
sp=0
}
#else
#defcfunc investigate int x1, int y1, int m1, int n1, local x, local y, local m, local n
#endif
#if 0
if m!=-1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,1,0): sp--: x=stackx.sp: y=stacky.sp: m=stackm(sp): n=stackn(sp)
if m!=1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,-1,0): sp--: x=stackx(sp): y=stacky(sp): m=stackm(sp): n=stackn(sp)
if n!=-1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,0,1): sp--: x=stackx(sp): y=stacky(sp): m=stackm(sp): n=stackn(sp)
if n!=1: stackx(sp)=x: stacky(sp)=y: stackm(sp)=m: stackn(sp)=n: sp++: cc=investigate(x+m,y+n,0,-1): sp--: x=stackx(sp): y=stacky(sp): m=stackm(sp): n=stackn(sp)
#else
if m!=-1: cc=investigate(x+m,y+n,1,0)
if m!=1: cc=investigate(x+m,y+n,-1,0)
if n!=-1: cc=investigate(x+m,y+n,0,1)
if n!=1: cc=investigate(x+m,y+n,0,-1)
#endif
| |
|
2008/1/20(Sun) 16:28:57|NO.13176
> local変数使えばよかったのねん。
local変数使わずに書けてしまう方が、凄いと思いますよw
まずい箇所いくつか・・・あった
ひとまとまり消すごとに詰め直してたのと、
表示が反映される前に消す処理してたから、すごく不自然だったのかぁ…。
別の作業してたら、ふと気付いた。
//▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
//ブロック消えた時の停止時間
#const global erase_wait 1000
*check
erase_flag = 1 : gosub *paint : erase_flag = 0
n = investigate(e, d-1, 0)
if n >= 3 {
await 250
dialog "上のブロックがヒット"
erase_block
erase_flag = 1
gosub *paint
await erase_wait
}
n = investigate(e, d, 0)
if n >= 3 {
if erase_flag==0 :await 250
dialog "下のブロックがヒット"
erase_block
erase_flag = 1
gosub *paint
await erase_wait
}
while erase_flag
if squash_up() { //空きを詰めた場合
dialog "詰めた"
erase_flag = 1
gosub *paint
await erase_wait
}
else { //空きが無かった場合
erase_flag = 0
_break
}
erase_flag = 0
for yy,0,15,1
for xx,0,6,1
n = investigate(xx,yy, 0)
if n >= 3 {
dialog "連鎖"
erase_block
erase_flag = 1
gosub *paint
await erase_wait
}
next
next
wend
return
//△△△△△△△△△△△△△△△△△△△
|
|