Hatena::Grouprokuro

cx20の日記

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

2008-02-02はてなロクロ - 全自動マリオ

全自動マリオ

| 08:28 |  全自動マリオ - cx20の日記 を含むブックマーク はてなブックマーク -  全自動マリオ - cx20の日記

  • ソース

hatena_rokuro_mario.uws [ダウンロード]

// ---------------------------------------------------------
// 全自動マリオ取扱説明書 Ver0.09(hatena_rokuro_mario.uws)
// ---------------------------------------------------------
// 
// <使用上の注意>
// ・このスクリプトはWindows 自動化ソフト「UWSC」を使った「はてなロクロ」自動化スクリプトです。
// ・以下の環境でスクリプトの動作確認済みです。
//   ・解像度:1280x1024, Windows 2000 + IE6
//   ・解像度:1280x1024, Windows XP(クラシックモード) + IE7
//   ・解像度:1024x768,  Windows XP(クラシックモード) + IE6
//   ・解像度:1280x1024, Windows 2000 + Firefox 2.0)
//   ・解像度:1280x1024, Windows XP(クラシックモード) + Firefox 2.0
// ・実行する場合は「はてなロクロ」の「カメラ」を停止しておいてください。
// ・中断する場合は [Alt] + [F2] です。動作中にウィンドウを切り替えないでください。誤動作します。
// ・誤動作を避けるため、極力、他のアプリケーションは終了させて置いて下さい。
//
// <使用ツール>
// ■ UWSC Free版 Ver4.4
// http://www.uwsc.info/download.html
// ■ 花文字  Version 2.3 (build 280) 
// http://park1.wakwak.com/~y-nagano/Programs/bigfont/
// 
// <スクリプトを作成した人>
// id:cx20 (http://rokuro.g.hatena.ne.jp/cx20/)
// 
// <変更履歴>
// 2008/02/11 Ver0.09 高速化対応。g_wait = N (ms) の値を小さくするとスピードアップします。ただし、速すぎると上手く描けなくなるようです。
// 2008/02/11 Ver0.08 IE/Firefox 両対応。IE7 が正しく認識されていなかった不具合を修正。
// 2008/02/10 Ver0.07 任意の解像度に対応(ツールボックスや色選択ボタンの位置を計算するように変更しました。)
// 2008/02/07 Ver0.06 図形描画用関数追加(☆が描けるようになりました。)
// 2008/02/06 Ver0.05 図形描画用関数追加(○や六角形が描けるようになりました。)
// 2008/02/04 Ver0.04 Firefox 対応。
//                    Firefox で動作させる場合は「ACW(GETID("はてなロクロ - Mozilla Firefox" ~」の行のコメントを外して下さい。
// 2008/02/03 Ver0.03 立体指定対応。"<" ~ ">" で囲んだ部分が立体になります。
// 2008/02/03 Ver0.02 色の判定方法を Case 文からハッシュテーブルに変更
// 2008/02/02 Ver0.01 とりあえず版作成。

Option Explicit

Public g_x = 400 // 描画開始位置
Public g_y = 400 // 描画開始位置
Public g_r = 25  // 円の半径
Public g_pi = 3.14159265 // PI
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

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
        左に指定ブロック移動( nColCount )
        下に移動
        下にちょっと移動
    Next
    上に指定ブロック移動( nRows )
Fend

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

    後に移動

    四角を描く

    前に移動
Fend


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

Procedure 丸を描く()
    Dim t
    Dim x
    Dim y
    Dim prev_x
    Dim prev_y
    t = 0
    prev_x = Int(g_r * Cos( 2 * g_pi * t / 360 )) + g_x + g_r
    prev_y = Int(g_r * Sin( 2 * g_pi * t / 360 )) + g_y + g_r
    // Step 値を小さくすると滑らかになります(ただし、重くなります)
    For t = 0 To 360 Step 30
        BTN(LEFT, DOWN, prev_x, prev_y, g_wait)
        x = Int(g_r * Cos( 2 * g_pi * t / 360 )) + g_x + g_r
        y = Int(g_r * Sin( 2 * g_pi * t / 360 )) + g_y + g_r
        Print "t = [" + t + "], x = [" + x + "], y = [" + y + "]"
        BTN(LEFT, UP, x, y, g_wait)
        prev_x = x
        prev_y = y
    Next
Fend

Procedure 六角形を描く()
    Dim t
    Dim x
    Dim y
    Dim prev_x
    Dim prev_y
    t = 0
    prev_x = Int(g_r * Cos( 2 * g_pi * t / 360 )) + g_x + g_r
    prev_y = Int(g_r * Sin( 2 * g_pi * t / 360 )) + g_y + g_r
    
    // Step を 60 にすると、六角形になります。
    For t = 0 To 360 Step 60
        BTN(LEFT, DOWN, prev_x, prev_y, g_wait)
        x = Int(g_r * Cos( 2 * g_pi * t / 360 )) + g_x + g_r
        y = Int(g_r * Sin( 2 * g_pi * t / 360 )) + g_y + g_r
        Print "t = [" + t + "], x = [" + x + "], y = [" + y + "]"
        BTN(LEFT, UP, x, y, g_wait)
        prev_x = x
        prev_y = y
    Next
Fend

Procedure 星を描く()
    Dim x
    Dim y
    Dim prev_x
    Dim prev_y
    
    Dim theta
    theta = g_pi * 72 / 180
    
    Dim x_array[5]
    Dim y_array[5]
    
    x_array[0] = g_x
    y_array[0] = g_y - g_r
    
    x_array[1] = g_x + Int( g_r * Sin( 2 * theta ) )
    y_array[1] = g_y - Int( g_r * Cos( 2 * theta ) )
    
    x_array[2] = g_x - Int( g_r * Sin( theta ) )
    y_array[2] = g_y - Int( g_r * Cos( theta ) )
    
    x_array[3] = g_x + Int( g_r * Sin( theta ) )
    y_array[3] = g_y - Int( g_r * Cos( theta ) )

    x_array[4] = g_x - Int( g_r * Sin( 2 * theta ) )
    y_array[4] = g_y - Int( g_r * Cos( 2 * theta ) )

    x_array[5] = g_x
    y_array[5] = g_y - g_r

    prev_x = x_array[0]
    prev_y = y_array[0]

    Dim i
    For i = 0 To 5
        BTN(LEFT, DOWN, prev_x, prev_y, g_wait)
        x = x_array[i]
        y = y_array[i]
        Print "i = [" + i + "], x = [" + x + "], y = [" + y + "]"
        BTN(LEFT, UP, x, y, g_wait)
        prev_x = x
        prev_y = y
    Next
    
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 右に回転()
    任意の方向に移動( "→" )
Fend

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

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

Procedure 上に回転()
    任意の方向に移動( "↑" )
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 右にちょっと回転()
    任意の方向にちょっと移動( "→" )
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

    directionTable["→"] = VK_RIGHT
    directionTable["←"] = VK_LEFT
    directionTable["↓"] = VK_DOWN
    directionTable["↑"] = VK_UP

    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