オセロゲームを作ろう(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
本サンプルでは、ReadKeyOptionsとして以下の2つを指定しています。
- NoEcho
- NoEchoを指定すると入力キーをエコー表示しません。
- この指定がないと、たとえば「A」キーを入力した際にコンソールに「a」と表示されます。
- IncludeKeyDown
- キーを押下した時点でキー情報を取得します。
- IncludeKeyUpを指定した場合は、キーを離すまで取得しません。
入力キーの判定
ReadKeyメソッドの戻り値はKeyInfoオブジェクトです。
VirtualKeyCodeプロパティにはそのキーコードが入っています。
本サンプルでは、[Windows.Forms.Keys]を利用して入力キーを判定しています。
キーコードの数値で判定するより可読性が高いので、個人的にはKeysでの判定の方がお気に入りです。(^^)