SPALM more用連鎖ゲーム


SPALM more用連鎖ゲーム

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
}