PowerShell Memo

このサイトはPowerShell(MSH/Monad)奮闘記です

管理人「newpops吉岡洋」が
「PowerShell(旧名:MSH/Monad)」の研究結果を日々綴っていきます。

【お知らせ】
この日記からPowerShellのTipsを抽出し「PowerShell FAQ」として整理しました。


2008-05-28

[][]オセロゲームを作ろう(7):盤面描画とカーソル移動(2)

盤面描画とカーソル移動

前回紹介した、盤面描画とカーソル移動のサンプルについて解説します。

盤面描画

135 : # オセロ盤の描画
136 : function Draw-Board()
137 : {
138 :     Write-Host "┌─┬─┬─┬─┬─┬─┬─┬─┐" -ForegroundColor $boardFgColor -BackgroundColor $boardBgColor
139 :     for($i=1; $i -le 7;$i++)
140 :     {
141 :         Write-Host "│ │ │ │ │ │ │ │ │" -ForegroundColor $boardFgColor -BackgroundColor $boardBgColor
142 :         Write-Host "├─┼─┼─┼─┼─┼─┼─┼─┤" -ForegroundColor $boardFgColor -BackgroundColor $boardBgColor
143 :     }
144 :     Write-Host "│ │ │ │ │ │ │ │ │" -ForegroundColor $boardFgColor -BackgroundColor $boardBgColor
145 :     Write-Host "└─┴─┴─┴─┴─┴─┴─┴─┘" -ForegroundColor $boardFgColor -BackgroundColor $boardBgColor
146 : }

Draw-Init関数で最初の3行のメッセージを、

そこからコールされるDraw-Board関数オセロ盤を描画します。

#139〜143行目はfor文を使っているので可読性が悪いですね。。。(^^;


結果はこんな感じ。

==================================
      Othello  by  PowerShell
==================================
┌─┬─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
├─┼─┼─┼─┼─┼─┼─┼─┤
│ │ │ │ │ │ │ │ │
└─┴─┴─┴─┴─┴─┴─┴─┘


カーソル移動

152 : # 指定した位置にカーソルを移動する
153 : function Move-Cursor([int]$newX, [int]$newY)
154 : {
155 :     $coordinate = New-Object System.Management.Automation.Host.Coordinates $newX, $newY
156 :     $rui.CursorPosition = $coordinate
157 : }

Move-Cursor関数引数に指定した座標にカーソルを移動します。

引数は移動先のX座標、Y座標です。

座標を指定してCoordinatesオブジェクトを生成し、CursorPositionに代入すればOKです。


ちなみに、オセロ盤の左上のセルの座標は、X=2、Y=4(上から5行目、左から3byte目)です。

上下左右キー操作

 46 :         # 上下左右のキー操作
 47 :         if($keyCode -eq $keyMap::Up)   {Move-CursorByDirection ([String]$keyMap::Up);   continue}
 48 :         if($keyCode -eq $keyMap::Down) {Move-CursorByDirection ([String]$keyMap::Down); continue}
 49 :         if($keyCode -eq $keyMap::Left) {Move-CursorByDirection ([String]$keyMap::Left); continue}
 50 :         if($keyCode -eq $keyMap::Right){Move-CursorByDirection ([String]$keyMap::Right);continue}

キー入力の監視で解説した、Get-InputKey関数の中で上下左右キーを捕捉します。

上下左右キーのカーソル移動は処理が似ているので、Move-CursorByDirection関数に集約させており、

その際、引数として、Stringにキャストした$KeyMap(Keys列挙体)を渡しています。

159 : # 上下左右のキーを押した時のカーソル移動
160 : function Move-CursorByDirection([String]$key)
161 : {
162 :     ($oldX, $oldY) = ($rui.CursorPosition.X, $rui.CursorPosition.Y)
163 :     if($key -eq "Up")       {$newX = $oldX; if($oldY -gt 0){$newY = $oldY - 1}}
164 :     elseif($key -eq "Down") {$newX = $oldX; $newY = $oldY + 1}
165 :     elseif($key -eq "Left") {if($oldX -gt 0){$newX = $oldX - 1}; $newY = $oldY}
166 :     elseif($key -eq "Right"){$newX = $oldX + 1; $newY = $oldY}
167 :     Move-Cursor $newX $newY
168 : }

Move-CursorByDirection関数では、まず162行目で現在のカーソル位置を取得。

163〜166行目で引数(Up,Down,Left,Rightの4種類)に応じて、カーソルの移動先を計算しています。

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/newpops/20080528/p1