オセロゲームを作ろう(3):スクリーンバッファ操作(1)

スクリーンバッファの操作

今回はスクリーンバッファの操作です。


具体的には、オセロゲームを実行するタイミングで、
その時点でコンソールに表示されている内容をバックアップし、
オセロが終了した際にバックアップ内容をコンソールにリストアします。


処理は、PowerShellコンテストのグランプリである「ウィンドウの切り替え」を参考にしています。

「キー入力監視」+「スクリーンバッファ操作」サンプル


# 初期処理
$rui = $host.UI.RawUI
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$keyMap = [Windows.Forms.Keys]
$script:screen = $null

# メイン
function Start-Game()
{
Backup-ScrBuf
Draw-Init
Get-InputKey
Restore-ScrBuf
}

# キー入力関数
function Get-InputKey()
{
while($true)
{
# キー取得
$keyInfo = $rui.ReadKey("NoEcho,IncludeKeyDown")
$keyCode = $keyInfo.VirtualKeyCode

# Enterを入力
if($keyCode -eq $keyMap::Enter){Show-Msg 'Enter';continue}

# Escを入力→終了
if($keyCode -eq $keyMap::Escape){return}
}
}

# メッセージ表示
function Show-Msg([String]$msg)
{
Write-Host -NoNewLine $msg
}

# スクリーンバッファのバックアップ
function Backup-ScrBuf()
{
$rect = New-Object System.Management.Automation.Host.Rectangle
$rect.Left = 0
$rect.Top = 0
$rect.Right = $rui.WindowSize.Width
$rect.Bottom = $rui.CursorPosition.Y
$script:screen = $rui.GetBufferContents($rect)
}

# スクリーンバッファのリストア
function Restore-ScrBuf()
{
Clear-Host
$origin = New-Object System.Management.Automation.Host.Coordinates(0, 0)
$rui.SetBufferContents($origin, $script:screen)
$pos = New-Object System.Management.Automation.Host.Coordinates(0, $script:screen.GetUpperBound(0))
$rui.CursorPosition = $pos
}

# 初期描画
function Draw-Init
{
Clear-Host
Write-Host "=================================="
Write-Host " Othello by PowerShell "
Write-Host "=================================="
}

# 処理スタート
Start-Game


上記スクリプトを実行すると、コンソールの内容がバックアップ、クリアされ、以下の文字列が表示されます。

==================================
      Othello  by  PowerShell     
==================================

キー入力は前回と同様「Enter」と「Escape」だけ個別処理をしています。
Escapeキーを押すとアプリが終了し、先ほどバックアップしたコンソール内容をリストアします。



つづく・・・。