オセロゲームを作ろう(2):キー入力監視

CUIのオセロゲームを作成する過程を、扱っていこうと思います。
まずは、キー入力監視についてです。

キー入力の監視

CUI版オセロゲームでは、駒を置く場所を指定するのに「上下左右キー + Enterキー」を利用します。
そのためにはアプリの起動中、常にキー入力を監視する必要があります。

キー入力監視サンプル


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

# メイン
function Start-Game()
{
Get-InputKey
}

# キー入力関数
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
}

# 処理スタート
Start-Game

サンプル解説

このサンプルを実行すると、キー入力の監視を開始します。
入力キーが「Enterキー」または「Escキー」の時のみ、個別処理を実行しています。

  • Enterキー
    • 「Enter」という文字列を表示する
  • Escキー
    • アプリケーションを終了する
入力キー取得:ReadKeyメソッド

$host.UI.RawUI.ReadKeyメソッドで入力キーを取得します。引数は、ReadKeyOptionsです。

本サンプルでは、ReadKeyOptionsとして以下の2つを指定しています。

  • NoEcho
    • NoEchoを指定すると入力キーをエコー表示しません。
    • この指定がないと、たとえば「A」キーを入力した際にコンソールに「a」と表示されます。
  • IncludeKeyDown
    • キーを押下した時点でキー情報を取得します。
    • IncludeKeyUpを指定した場合は、キーを離すまで取得しません。
入力キーの判定

ReadKeyメソッドの戻り値はKeyInfoオブジェクトです。
VirtualKeyCodeプロパティにはそのキーコードが入っています。


本サンプルでは、[Windows.Forms.Keys]を利用して入力キーを判定しています。
キーコードの数値で判定するより可読性が高いので、個人的にはKeysでの判定の方がお気に入りです。(^^)