SPALM moreで関数内のローカル変数が使えるということなので、ここでやって良いか分からんが再帰を使ったプログラムのテストを兼ねた連鎖ゲームを作った。
ゲーム性は加えてないから面白くは無いかも。一種のデモ。
できるだけ単純な仕組みになるように作ったぷよぷよと思えばいいかも
最初の行のMAX=4は色数の最大値。5色まで対応。
ぷよの落下に描画量を減らすためにdrawimgとscreenの組み合わせを使ってみた。
あとなぜか、真ん中の列だけ再描画されないバグ?があったので、そこだけ一列普通に再描画している。
MAX=4 init() sleap=16 ready() label 0 lock() switch(scene){ case 2:'消去シーン' for(i=0;i<6;++i){ copy(none,0,checked[i],0,12) } copy(none,0,delete,0,78) for(flag=m=i=0;i<6;++i){ for(j=0;j<12;++j){ if(J=0,(p=puyo[i][j])&&!checked[i][j]&&(J=check(i,j,p,++m))>2){ delete[m]=flag=1 } } } for(j=0;j<6;++j){ for(k=0;k<12;++k){ if(delete[checked[j][k]]){ puyo[j][k]=0 drawimg(i[0],j*16,k*16,0) } } } scene=flag sleap=16 break case 1:'落下シーン' trgt(scr) drawimg(screen,48,96,3) trgt(off) origin(width/2-48,height/2-96) clip(0,0,96,192) scene=2 for(l=0;l<78;++l){ if(puyo[i=l/13][j=l%13-1]&&!puyo[i][j+1]){ copy(puyo[i],-1,puyo[i],0,++j+1) drawarea(scr,i*16,16,i*16,0,16,j*16) drawimg(i[puyo[i][0]],i*16,0,0) puyo[i][-1]=0 scene=1 l=i*13+12 } } for(l=0;l<12;++l){drawimg(i[puyo[2][l]],32,l*16,0)} sleap=0 break case 0:'操作シーン' drawimg(i[0],x0*16,y0*16,0) drawimg(i[0],x1*16,y1*16,0) if(quick>0){--quick} if(key=input(0),key&0x11000){ a=angle+(key==0x1000?-90:90;) b=x0+cos(a)/100 c=y0+sin(a)/100 if(y0==c&&puyo[b][c]){ if(puyo[x0*2-b][c]){ if(quick>0){ angle=a+(key==0x1000?-90:90;) y0=y1 y1=c }else{ quick=5 } }else{ angle=a x1=x0 x0=2*x0-b y1=y0 } }elsif(c>y0&&puyo[b][c]){ angle=a y1=y0 --y0 x1=b }else{ angle=a x1=b y1=c } } ++precon if(scan&0x2000&&precon>2&&!puyo[x0-1][y0]&&!puyo[x1-1][y1]){ --x0 --x1 precon=0 }elsif(scan&0x4000&&precon>2&&!puyo[x0+1][y0]&&!puyo[x1+1][y1]){ ++x0 ++x1 precon=0 } if(++fall==40||(scan&0x8000)&&fall>1){ if(puyo[x0][y0+1]||puyo[x1][y1+1]){ puyo[x0][y0]=c0 puyo[x1][y1]=c1 drawimg(i[c0],x0*16,y0*16,0) drawimg(i[c1],x1*16,y1*16,0) ready() ++scene break }else{ ++y0 ++y1 fall=0 } } drawimg(i[c0],x0*16,y0*16,0) drawimg(i[c1],x1*16,y1*16,0) break } if(scan&2){end} unlock(0) sleep(sleap) goto 0 func ready(){ global c0=abs(rand)%MAX+1 global c1=abs(rand)%MAX+1 global x0=2 global x1=2 global y0=0 global y1=-1 global fall=0 global precon=10 global angle=270 } func init(){ for(i=-2;i<12;++i){ global puyo[-1][i]=8 global puyo[6][i]=8 global checked[-1][i]=1 global checked[6][i]=1 } for(i=-1;i<6;++i){ global puyo[i][-3]=8 global puyo[i][12]=8 global checked[i][-1]=1 global checked[i][12]=1 } @(colors,"11,224,220,220,200,192,192,176,160,160,252,252,252,232,32,36,252,204,208,232,124,124,252,236,240,204,80,80,184,32,36,140,24,24", "11,224,224,220,200,200,192,176,176,160,252,252,252,232,232,36,252,252,208,232,232,124,252,252,240,204,204,80,184,184,36,140,140,24", "11,220,224,220,192,200,192,160,176,160,252,252,252,32,232,36,204,252,208,124,232,124,236,252,240,80,204,80,32,184,36,24,140,24", "11,220,220,224,192,192,200,160,160,176,252,252,252,36,32,232,208,204,252,124,124,232,240,236,252,80,80,204,36,32,184,24,24,140", "11,224,220,220,200,192,192,176,160,160,252,252,252,116,16,116,252,204,252,232,124,232,252,236,252,102,40,102,92,16,92,70,12,70") makeimg(i[0],16,16) trgt(i[0]) color(108,0,0) frect(0,0,16,16) color(44,0,0) line(1,1,13,1) line(1,1,1,13) line(0,15,15,15) line(15,0,15,15) color(192,132,116) line(13,1,13,13) line(1,13,13,13) for(i=1;i<6;++i){ loadimg(i[i],colors[i-1]_",-1,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,2,2,2,2,2,2,2,2,0,0,1,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,1,1,3,3,0,0,0,0,1,1,1,0,0,0,0,1,3,3,0,4,4,4,4,0,0,1,1,0,0,0,0,1,3,0,4,5,5,6,4,4,0,0,1,0,0,3,0,3,0,4,5,7,8,4,9,9,9,0,1,1,2,3,0,3,0,4,5,8,4,9,9,9,9,0,2,1,2,3,0,0,0,4,6,4,9,9,9,8,9,0,2,1,2,3,0,0,0,4,4,9,9,9,10,10,9,0,2,1,2,3,0,0,0,0,4,9,8,10,10,9,0,0,2,1,2,0,0,0,0,0,0,9,9,9,9,0,0,2,1,0,0,0,1,1,0,1,0,0,0,0,0,0,2,2,1,0,0,0,1,0,3,0,1,1,1,1,2,2,1,1,0,0,0,0,0,3,3,1,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0") } trgt(off) col(0xA04030) frect(0,0,width,height) origin(width/2-48,height/2-96) for(i=0;i<72;++i){drawimg(i[0],i%6*16,i/6*16,0)} clip(0,0,96,192) makeimg(scr,96,192) } func check(x,y,c,m,n){ global checked[x][y]=m if(!global checked[x-1][y]&&global puyo[x-1][y]==c){ n=check(x-1,y,c,m,n+1) } if(!global checked[x+1][y]&&global puyo[x+1][y]==c){ n=check(x+1,y,c,m,n+1) } if(!global checked[x][y-1]&&global puyo[x][y-1]==c){ n=check(x,y-1,c,m,n+1) } if(!global checked[x][y+1]&&global puyo[x][y+1]==c){ n=check(x,y+1,c,m,n+1) } return n }
FrontPage
関数一覧
記号一覧
SPALM入門
作品集
自作関数活用術
ダウンロード先
うpロダ
wikiの使い方
SPALMまでの歴史
現行スレ