Powershell(オセロ003_バッチファイルベースで作成_結果表示など)

■プラスアルファの内容を追加する。
前回で一通りPowershellのオセロのプログラムはできたので、今回、コメントの追加、自動でランダムに石を置く処理や結果表示などプラスアルファの内容を追加してみる。

コメントは前に確認したように、#以降の1文、または<#~#>で囲んだ複数文がコメントとなる。ある程度まとまった部分ごとに処理の概要のコメントをつけた。

前回までで作成したプログラムは、Player AとBのどちらも手動で入力する形にしていたので、何かを検証するにしても手間がかかる。そのため、自動で石を置く処理を追加した。Powershellでは、get-randomでランダムの値をつくれるので、それを利用して下のように11から88までの値をランダムで出てくるようにできる。11は1行目、1列目となる。

[string]$position = get-random -minimum 11 -maximum 88

このやり方は簡単にできるけど、置く場所がなくなった場合(手動であればpassするとき)などは無限ループしてしまうので、もう少し複雑なコードを組んだ。ロジックとしては下の通り。
  → 空(_)となっているところの行、列を取得し配列をつくる。
  → 空部分の行列の配列の並びをランダムに変える。
  → 要素0から順に石を置いていく。
   → 石を置くことができた場合、初めに戻る(空となった部分が少なくなった状態で再度、配列を作成)。
   → 石を置くことができない場合、passを入力。

一番下のサンプルコードは、Player AとBのどちらも自動で入力できるようにしたもの。

結果表示は簡単に下のような感じにした。
最終的な結果から●、〇の数をカウントするものとゲームを何度か繰り返した後、●と〇の数から勝敗の数をカウントするもの。


#●、〇の数をカウントするもの
for ($n=1; $n -le 8; $n++) {
   for ($m=1; $m -le 8; $m++) {
      if ($Othello[$n][$m] -eq "●") {
         $blackcnt++
      } elseif ($Othello[$n][$m] -eq "〇") {
         $whitecnt++
      }
   }
}
#●と〇の数から勝敗の数をカウントするもの
  if ($blackcnt -gt $whitecnt) {
      $blackwin++
   } elseif ($blackcnt -lt $whitecnt) {
      $whitewin++
   } elseif ($blackcnt -eq $whitecnt) {
      $even++ 
   }

結果をファイルに残すようにする。Powershellでは、Out-fileでファイルへの書き込みができるよう。下のAppendは追記にするためのオプション。"|"はパイプラインという左側の結果を右に持ってくるもの。Powershellでは一般的なものらしい。

echo ("Game:"+$i+"| Start Othello") | Out-file $textfile -Append

サンプルコードでは、ファイルの保存は1手ずつオセロの状況までを記録し、コマンドライン上の表示は結果のみとした(左下:コマンドライン表示、右下:保存ファイル)。

サンプルコードを添付。Windows S modeで実行可(ps1ファイルはセキュリティからアップロードできないようなので、txt形式にしています)。

これでバッチファイルベースでの作成は終了する。
Powershellはオブジェクト指向のプログラムということを最近知ったので、次はそれベースに修正してみようか。その場合、ConstrainedLanguage modeを解除しないといけないけど。