オセロゲームを作ろう(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種類)に応じて、カーソルの移動先を計算しています。