Hatena::Grouprokuro

cx20の日記

はてなロクロ」投稿サンプル
マリオ テトリス デフォルトさん はてなロゴ 全自動マリオ 3Dプロッタ
 | 

2008-02-03はてなロクロ - テトリス

テトリス

| 08:28 |  テトリス - cx20の日記 を含むブックマーク はてなブックマーク -  テトリス - cx20の日記

  • ソース

hatena_rokuro_tetris.uws [ダウンロード]

// ---------------------------------------------------------
// File : hatena_rokuro_tetris.uws
// ---------------------------------------------------------
// 
// <使用上の注意>
// ・このスクリプトはWindows 自動化ソフト「UWSC」を使った「はてなロクロ」自動化スクリプトです。
// ・以下の環境でスクリプトの動作確認済みです。
//   ・解像度:1280x1024, Windows 2000 + IE6(ウィンドウ最大化。タスクバーは下に配置)
//   ・解像度:1280x1024, Windows XP + IE7(ウィンドウ最大化。タスクバーは下に配置)
//   ・解像度:1280x1024, Windows 2000 + Firefox 2.0(ウィンドウ最大化。タスクバーは下に配置)
//   ・解像度:1280x1024, Windows XP + Firefox 2.0(ウィンドウ最大化。タスクバーは下に配置)
// ・実行する場合は「はてなロクロ」の「カメラ」を停止しておいてください。
// ・中断する場合は [Alt] + [F2] です。動作中にウィンドウを切り替えないでください。誤動作します。
//
// <使用ツール>
// ■ UWSC Free版 Ver4.4
// http://www.uwsc.info/download.html
// 
// <スクリプトを作成した人>
// id:cx20 (http://rokuro.g.hatena.ne.jp/cx20/)
// 
// 2008/02/11 Ver0.02 ちょっと修正
//                    ・高速化対応。g_wait = N (ms) の値を小さくするとスピードアップします。
//                    ・IE/Firefox 両対応。IE7 が正しく認識されていなかった不具合を修正。
//                    ・任意の解像度に対応(ツールボックスや色選択ボタンの位置を計算するように変更しました。)
// 2008/02/03 Ver0.01 とりあえず版作成。

Option Explicit

Public g_x = 400 // 描画開始位置
Public g_y = 400 // 描画開始位置
Public g_wait = 5 // 実行までの待ち時間(ミリ秒)

// 「はてなロクロ」のウィンドウIDを取得(IE/Firefox 共通版)
Public g_winID_rokuro = 0
g_winID_rokuro = はてなロクロのウィンドウIDを取得()
Ifb g_winID_rokuro = -1 Then
    MsgBox( "はてなロクロが起動していない為、スクリプトを終了します。" )
    ExitExit
EndIf

// 「はてなロクロ」ページをアクティブ化
ACW(g_winID_rokuro)

// ツールボックス開始位置
Public g_toolbox_basic_width = 25
Public g_toolbox_basic_x = 0
Public g_toolbox_basic_y = 0
// 色選択ツール開始位置
Public g_toolbox_color_width = 19
Public g_toolbox_color_x = 0
Public g_toolbox_color_y = 0

はてなロクロのツールボックス位置を算出( g_winID_rokuro )

// 線描画を選択
線描画を選択

// 線描画を選択
線描画を選択

// <描画サンプル>
テトリスを描く

Procedure テトリスを描く()
    Dim strLines[] = _
        "<白無無無無無無無無無無白>", _
        "<白無無無無無無無無無無白>", _
        "<白無無無無無無無無無無白>", _
        "<白無無無無無無無無無無白>", _
        "<白無無無無無無無無無無白>", _
        "<白無水無無無無無無無無白>", _
        "<白無水無無無無無無無無白>", _
        "<白無水無無無無無無無無白>", _
        "<白無水無無無無無無無無白>", _
        "<白無無無無無無無無無桃白>", _
        "<白水無無無無無無無桃桃白>", _
        "<白水無無無無緑緑茶茶桃白>", _
        "<白水無黄黄緑緑肌青茶茶白>", _
        "<白水無黄黄肌肌肌青青青白>", _
        "<白白白白白白白白白白白白>", _

    はてなロクロで描く( strLines )
Fend

Function はてなロクロのウィンドウIDを取得()
    Dim winID = 0

    // 「はてなロクロ」のウィンドウIDを取得(IE6 版)
    winID = GETID("はてなロクロ - Microsoft Internet Explorer","IEFrame")
    Ifb winID <> -1 Then
        Result = winID
        Exit
    EndIf
    
    // 「はてなロクロ」のウィンドウIDを取得(IE7 版)
    winID = GETID("はてなロクロ - Windows Internet Explorer","IEFrame")
    Ifb winID <> -1 Then
        Result = winID
        Exit
    EndIf

    // 「はてなロクロ」のウィンドウIDを取得(Firefox 版)
    winID = GETID("はてなロクロ - Mozilla Firefox","MozillaUIWindowClass")
    Ifb winID <> -1 Then
        Result = winID
        Exit
    EndIf

    Result = winID
Fend

Procedure はてなロクロのツールボックス位置を算出( winID )

    Dim window_x = Status( winID, ST_X )
    Dim window_y = Status( winID, ST_Y )
    Dim window_height = Status( winID, ST_HEIGHT )
    Print "window_x = [" + window_x + "]"
    Print "window_y = [" + window_y + "]"
    Print "window_height = [" + window_height + "]"
    
    // ツールボックス開始位置
    g_toolbox_basic_x = window_x +  17 + g_toolbox_basic_width * 0
    g_toolbox_basic_y = window_y + window_height - 42
    // 色選択ツール開始位置
    g_toolbox_color_x = window_x + 122 + g_toolbox_color_width * 0
    g_toolbox_color_y = window_y + window_height - 42

Fend

Procedure はてなロクロで描く( strLines[] )
    Dim strLine
    
    Dim dotChar
    Dim bUse3D
    bUse3D = False
    Dim nColorIndex
    Dim nRowIndex
    Dim nColIndex
    Dim nRows
    Dim nCols
    Dim nColCount
    nRows =  Length(strLines)
    nColCount = 0
    
    For nRowIndex = 0 To nRows - 1
        strLine = strLines[nRowIndex]
        nCols = Length(strLine)
        nColCount = 0
        For nColIndex = 0 To nCols - 1
            dotChar = Copy( strLine, nColIndex + 1, 1 )
            Ifb dotChar = "<" Then
                bUse3D = True
                Continue
            ElseIf dotChar = ">" Then
                bUse3D = False
                Continue
            EndIf
            nColorIndex = 色番号を取得( dotChar )
            Print "pos(" + nColIndex + "," + nRowIndex + ") = [" + dotChar + "](" + nColorIndex + ")"
            右に移動
            右にちょっと移動
            Ifb nColorIndex <> -1 Then
                色を選択( nColorIndex )
                Ifb bUse3D Then
                    立方体を描く
                Else
                    四角を描く
                EndIf
            EndIf
            nColCount = nColCount + 1
        Next
        //左に指定ブロック移動( nCols )
        左に指定ブロック移動( nColCount )
        下に移動
        下にちょっと移動
    Next
    上に指定ブロック移動( nRows )
Fend

Procedure 立方体を描く()
    四角を描く
    
    // 手前に線を引いて右に移動
    手前に線を描く
    右に移動
    
    // 手前に線を引いて下に移動
    手前に線を描く
    下に移動
    
    // 手前に線を引いて左に移動
    手前に線を描く
    左に移動
    
    // 手前に線を引いて上に移動
    手前に線を描く
    上に移動

    後に移動

    四角を描く

    前に移動
Fend


Procedure 四角を描く()
    // 右に線を引く
    筆を置く
    右に移動
    筆を戻す
    
    // 下に線を引く
    筆を置く
    下に移動
    筆を戻す
    
    // 左に線を引く
    筆を置く
    左に移動
    筆を戻す
    
    // 上に線を引く
    筆を置く
    上に移動
    筆を戻す
Fend

Procedure 手前に線を描く()
    筆を置く
    後に移動
    筆を戻す
    前に移動
Fend

// [Shift] + [A] … 右に移動(X 軸を + に移動)
// [Shift] + [D] … 左に移動(X 軸を - に移動)
// 
// [Shift] + [W] … 下に移動(Y 軸を - に移動)
// [Shift] + [S] … 上に移動(Y 軸を + に移動)
// 
// [Shift] + [Q] … 後に移動(Z 軸を - に移動)
// [Shift] + [E] … 前に移動(Z 軸を + に移動)
// 

Procedure 右に指定ブロック移動( nBlock )
    任意の方向に指定ブロック移動( "右", nBlock )
Fend

Procedure 左に指定ブロック移動( nBlock )
    任意の方向に指定ブロック移動( "左", nBlock )
Fend

Procedure 下に指定ブロック移動( nBlock )
    任意の方向に指定ブロック移動( "下", nBlock )
Fend

Procedure 上に指定ブロック移動( nBlock )
    任意の方向に指定ブロック移動( "上", nBlock )
Fend

Procedure 後に指定ブロック移動( nBlock )
    任意の方向に指定ブロック移動( "後", nBlock )
Fend

Procedure 前に指定ブロック移動( nBlock )
    任意の方向に指定ブロック移動( "前", nBlock )
Fend

Procedure 任意の方向に指定ブロック移動( strDirection, nBlock )
    Dim i
    For i = 1 To nBlock
        任意の方向に移動( strDirection )
        任意の方向にちょっと移動( strDirection )
    Next
Fend

Procedure 右に移動()
    任意の方向に移動( "右" )
Fend

Procedure 左に移動()
    任意の方向に移動( "左" )
Fend

Procedure 下に移動()
    任意の方向に移動( "下" )
Fend

Procedure 上に移動()
    任意の方向に移動( "上" )
Fend

Procedure 後に移動()
    任意の方向に移動( "後" )
Fend

Procedure 前に移動()
    任意の方向に移動( "前" )
Fend

Procedure 任意の方向に移動( strDirection )
    Dim key
    key = キーコードを取得( strDirection )
    移動( key )
Fend

Procedure 移動( key )
    KBD(VK_SHIFT,DOWN,g_wait)
    KBD(key,CLICK,    g_wait)
    KBD(key,CLICK,    g_wait)
    KBD(key,CLICK,    g_wait)
    KBD(key,CLICK,    g_wait)
    KBD(VK_SHIFT,UP,  g_wait)
Fend

Procedure 右にちょっと移動()
    任意の方向にちょっと移動( "右" )
Fend

Procedure 左にちょっと移動()
    任意の方向にちょっと移動( "左" )
Fend

Procedure 下にちょっと移動()
    任意の方向にちょっと移動( "下" )
Fend

Procedure 上にちょっと移動()
    任意の方向にちょっと移動( "上" )
Fend

Procedure 後にちょっと移動()
    任意の方向にちょっと移動( "後" )
Fend

Procedure 前にちょっと移動()
    任意の方向にちょっと移動( "前" )
Fend

Procedure 任意の方向にちょっと移動( strDirection )
    Dim key
    key = キーコードを取得( strDirection )
    ちょっと移動( key )
Fend

Procedure ちょっと移動( key )
    KBD(VK_SHIFT,DOWN,g_wait)
    KBD(key,CLICK,    g_wait)
    KBD(VK_SHIFT,UP,  g_wait)
Fend

Function キーコードを取得( strDirection )
    Public HashTbl directionTable
    directionTable["右"] = VK_A
    directionTable["左"] = VK_D
    directionTable["下"] = VK_W
    directionTable["上"] = VK_S
    directionTable["後"] = VK_Q
    directionTable["前"] = VK_E

    Result = directionTable[strDirection]
Fend

Procedure 筆を置く()
    BTN(LEFT, DOWN, g_x, g_y, g_wait)
Fend

Procedure 筆を戻す()
    BTN(LEFT, UP, g_x, g_y, g_wait)
Fend

Procedure 線描画を選択()
    Dim tool_no = 0
    tool_no = ツール番号を取得( "線描画" )
    ツールを選択( tool_no )
Fend

Procedure 鉛筆を選択()
    Dim tool_no = 0
    tool_no = ツール番号を取得( "鉛筆" )
    ツールを選択( tool_no )
Fend

Function ツール番号を取得( toolName )
    Public HashTbl toolNameTable
    // ツール名→ツール番号変換
    toolNameTable["保存"]   = 0  // 保存
    toolNameTable["戻す"]   = 1  // 戻す
    toolNameTable["鉛筆"]   = 2  // 鉛筆
    toolNameTable["線描画"] = 3  // 線描画

    Result = toolNameTable[toolName]

    Print "toolName = [" + toolName + "]"
    Print "tool_no = [" + Result + "]"
Fend


Procedure ツールを選択( tool_no )
    Dim select_pos_x
    Dim select_pos_y
    select_pos_x = g_toolbox_basic_x + 25*tool_no
    select_pos_y = g_toolbox_basic_y
    Print "g_toolbox_basic_x = [" + g_toolbox_basic_x + "]"
    Print "g_toolbox_basic_y = [" + g_toolbox_basic_y + "]"
    Print "select_pos_x = [" + select_pos_x + "]"
    Print "select_pos_y = [" + select_pos_y + "]"
    指定座標をクリック( select_pos_x, select_pos_y )
Fend

Procedure 色を選択( color_no )
    Dim select_pos_x
    Dim select_pos_y
    select_pos_x = g_toolbox_color_x + 19*color_no
    select_pos_y = g_toolbox_color_y
    
    指定座標をクリック( select_pos_x, select_pos_y )
Fend

Procedure 指定座標をクリック( select_pos_x, select_pos_y )
    MMV( select_pos_x, select_pos_y, g_wait )
    BTN( LEFT, CLICK, select_pos_x, select_pos_y, g_wait )
Fend

Function 色番号を取得( dotChar )
    Public HashTbl colorTable
    // 記号→色番号変換
    colorTable["‥"] = -1 // 透明
    colorTable["□"] = 1  // 肌色
    colorTable["■"] = 2  // 桃色
    colorTable["〓"] = 6  // 青
    // 色名→色番号変換
    colorTable["無"] = -1 // 透明
    colorTable["白"] = 0  // 白
    colorTable["肌"] = 1  // 肌色
    colorTable["茶"] = 2  // 茶色
    colorTable["桃"] = 3  // ピンク
    colorTable["黄"] = 4  // 黄色
    colorTable["緑"] = 5  // 黄緑
    colorTable["水"] = 6  // 水色
    colorTable["青"] = 7  // 青
    colorTable["紫"] = 8  // 青紫

    Result = colorTable[dotChar]
Fend
 |