2007年8月11日土曜日

テトリミノを表示する

段階的学習!がちょっと面白そうだったので作成。
こうしたテクニックはショートプログラムでも利用できそうです。#const global BLOCK_SIZE 24
#const global BLOCK_COLOR_MAX 8
#const TETRIMINO_TYPE_MAX 7

#module
//
// 指定した色でブロックを描く
#deffunc draw_block int x, int y, int c
    hsvcolor 191 * c / BLOCK_COLOR_MAX255255
    boxf BLOCK_SIZE * x, BLOCK_SIZE * y, BLOCK_SIZE * ( x + 1 ) - 2BLOCK_SIZE * ( y + 1 ) - 2
    return
//
// テトリミノを描く
#deffunc draw_tetrimino int tetrimino_pattern, int block_color, int _x, int _y
    repeat 4
        y = _y + cnt
        _cnt = cnt
        repeat 4
            x = _x + cnt
            if tetrimino_pattern >> ( _cnt * 4 + cnt ) & 1 {
                draw_block x, y, block_color
            }
        loop
    loop
    return
#global

    // テトリミノパターンの準備
    dim tetrimino_pattern, 4TETRIMINO_TYPE_MAX
    tetrimino_pattern( 00 ) = $0033$0033$0033$0033 // □
    tetrimino_pattern( 01 ) = $2222$00F0$2222$00F0 // |
    tetrimino_pattern( 02 ) = $0232$0072$0262$0270 // ┤
    tetrimino_pattern( 03 ) = $0036$0231$0036$0231 // s
    tetrimino_pattern( 04 ) = $0063$0132$0063$0132 // z
    tetrimino_pattern( 05 ) = $0047$0322$0071$0113 // ┘
    tetrimino_pattern( 06 ) = $0017$0223$0074$0311 // └

    tetrimino_rotation = 0
    tetrimino_type = 0
    game_speed = 30
    need_to_draw = 1
    title "←・→でテトリミノの種類を変更"

*main
    gosub *calc
    gosub *draw
    wait 2
    goto *main

*calc
    stick keys
    v = ( keys >> 2 & 1 ) - ( keys & 1 )
    if v {
        // テトリミノの種類を変更
        need_to_draw = 1
        tetrimino_type += v
        if tetrimino_type < 0 {
            tetrimino_type = TETRIMINO_TYPE_MAX - 1
        } else : if tetrimino_type >= TETRIMINO_TYPE_MAX {
            tetrimino_type = 0
        }
    }

    count++
    if count == game_speed {
        // テトリミノの回転
        count = 0
        need_to_draw = 1
        tetrimino_rotation = ( tetrimino_rotation + 1 ) & 3
    }
    return

*draw
    if need_to_draw {
        need_to_draw = 0
        redraw 0
        color : boxf
        draw_tetrimino tetrimino_pattern( tetrimino_rotation, tetrimino_type ), tetrimino_type, 00
        redraw 1
    }
    return

0 件のコメント: