つづき(サブルーチン) !------------------------------ ここからサブルーチン
EXTERNAL SUB display_board(M,N,board$(,)) !盤を表示する FOR y=1 TO M FOR x=1 TO N PRINT board$(y,x); NEXT x PRINT NEXT y PRINT END SUB
EXTERNAL PICTURE display_piece(i,f,shp12(,)) !片をグラフィックス表示する LET tt=get_piece(i,f) !先頭位置 FOR q=1 TO PIECE_SIZE !正方形の数 LET x=shp12(tt+q,1) LET y=shp12(tt+q,2) PLOT AREA: x,y; x+1,y; x+1,y+1; x,y+1 NEXT q END PICTURE
!技術メモ ! Lの場合 ! +0+1 ! +0L←回転の基準 ! +1L ! +2L ! +3LL ! 時計回りの回転(行列変換 shape*R90) ! -3-2-1+0 ! +0LLLL ! +1L ! 補正(平行移動) ! +0+1+2+3 ! +0LLLL ! +1L
EXTERNAL SUB operate_piece(shape(,),R(,)) !片を「90度回転/裏返し」させる MAT shape=shape*R !各座標の変換 LET dx=0 !「左上詰め」への平行移動量 LET dy=0 FOR i=1 TO PIECE_SIZE !正方形の数 IF shape(i,1)<dx THEN LET dx=shape(i,1) !はみ出し量の最大を求めて IF shape(i,2)<dy THEN LET dy=shape(i,2) NEXT i FOR i=1 TO PIECE_SIZE !左上に詰める LET shape(i,1)=shape(i,1)-dx LET shape(i,2)=shape(i,2)-dy NEXT i END SUB
EXTERNAL SUB set_piece(i,f,shape(,), shp12(,)) !i番の片の形状fを設定する LET tt=get_piece(i,f) !先頭位置 FOR q=1 TO PIECE_SIZE !正方形の数 LET shp12(tt+q,1)=shape(q,1) !記録する LET shp12(tt+q,2)=shape(q,2) NEXT q END SUB
EXTERNAL FUNCTION get_piece(i,f) !i番の片の形状fを得る LET get_piece=((i-1)*8+f-1)*PIECE_SIZE !先頭位置 END FUNCTION
EXTERNAL SUB put_piece(nam$,shp,row,col, shape(,),board$(,)) !片を置く FOR i=1 TO PIECE_SIZE !正方形の数 LET x=col+shape(shp+i,1) LET y=row+shape(shp+i,2) LET board$(y,x)=nam$ NEXT i END SUB
!技術メモ ! 逆さTの場合 ! @T T ! T ⇒ T ! TTT @TT ! 1行1列(row,col)で配置すると隙間が空くので、3行1列目へ(row2,col2)変更する
EXTERNAL SUB fit_piece(shp,row,col, row2,col2, shape(,)) !左上へと配置基準を詰める LET tmp=999 FOR i=1 TO PIECE_SIZE !正方形の数 IF shape(shp+i,1)=0 THEN !左端の IF shape(shp+i,2)<tmp THEN LET tmp=shape(shp+i,2) !最初の正方形の行へ END IF NEXT i LET row2=row-tmp LET col2=col END SUB
|