Powershell(オセロ001_バッチファイルベースで作成)
■バッチファイルをベースに考える
以前作ったバッチファイルのコード(バッチファイル_オセロ010)を参照してPowershellのコードを考えてみる。まず裏返す処理を作成し、その後に、8×8の盤の外、石が置いてある部分や裏返すものがない部分には石を置けないなどの条件をつけていく。裏返す処理のロジックの概要は、以前は次のようにしたので、それをなぞる。
石を置いた場所の周りの8方向についてチェックする。
→ 隣が空(_)の場合、次の方向の石をチェック
→ 隣が相手の石(●)の場合、同じ方向の次の石をチェック
→ 次の石が相手の石(●)の場合、同じ方向の次の石をチェック
→ 次の石が相手の石(●)の場合、同じ方向の次の石をチェック
(以下、繰り返し)
→ 次の石が自分の石(〇)の場合、はさんだ石を裏返し、次の方向の石をチェック
→ 次が空(_)の場合、次の方向の石をチェック
→ 隣が自分の石(〇)の場合、次の方向の石をチェック
ここで、隣以降で自分の石が出てくるパターンは、1つ目の隣以外はすべて相手の石を含むはず。
# ==============================Start Setting==============================
echo "Start Othello"
################
# Othello stone (〇、●) display
################
#(サンプルとして始めから石を置いておく)
$Othello=@(
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','●','_','_','_'),
@('_','_','_','_','●','●','_','_'),
@('_','_','_','〇','●','●','_','_'),
@('_','_','_','●','●','〇','_','_'),
@('_','_','_','●','_','〇','〇','_'),
@('_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_')
)
for ($n=0; $n -lt 8; $n++) {
$Othello[$n] -join ''
}
$position="00"
$line=0
$row=0
#set turnchangeflag=0
$trialnum=1
$player="A"
$playerBtrial=0
# ==============================Playing Othello==============================
#:trial
$checkcnt=1
$turnchangeflag=0
if ($player -eq "A") {
$position = Read-Host "Player A"
} elseif ($player -eq "B") {
$position = Read-Host "Player B"
}
$line=$position.substring(0,1)
$row=$position.substring(1,1)
$Othello[$line][$row]='〇'
# ============================================================
# Player A
# Place where stone is set (startline, startrow)
# ============================================================
#石を置いた場所の周りの8方向についてチェックする。
for ($checkcnt=0; $checkcnt -lt 8; $checkcnt++) {
[Int]$startline=$line
[Int]$startrow=$row
[Int]$opponentstonenum=0
#同じ方向を見るループ(最大8まで)。次の方向を見る場合はbreakでこのループから出る。
for ($extension=0; $extension -lt 8; $extension++) {
if ($checkcnt -eq 0) {
$startline=$startline-1
} elseif ($checkcnt -eq 1) {
$startline=$startline-1
$startrow=$startrow+1
} elseif ($checkcnt -eq 2) {
$startrow=$startrow+1
} elseif ($checkcnt -eq 3) {
$startline=$startline+1
$startrow=$startrow+1
} elseif ($checkcnt -eq 4) {
$startline=$startline+1
} elseif ($checkcnt -eq 5) {
$startline=$startline+1
$startrow=$startrow-1
} elseif ($checkcnt -eq 6) {
$startrow=$startrow-1
} elseif ($checkcnt -eq 7) {
$startline=$startline-1
$startrow=$startrow-1
} else {
}
#隣が空(_)の場合、次の方向の石をチェック
#隣が相手の石(●)の場合、同じ方向の次の石をチェック
#隣が自分の石(〇)の場合、次の方向の石をチェック
if ($Othello[$startline][$startrow] -eq "_") {
break
} elseif ($Othello[$startline][$startrow] -eq "●") {
$opponentstonenum=$opponentstonenum+1
} elseif ($Othello[$startline][$startrow] -eq "〇") {
#隣以降で自分の石が出てくるパターンは、1つ目の隣以外はすべて相手の石を含むはずなので、裏返す処理を入れる。
if ($opponentstonenum -ge 1) {
if ($checkcnt -eq 0) {
#for (%startline%,1,%line%) do (
for ($startline;$startline -le $line;$startline++) {
$Othello[$startline][$startrow]='〇'
}
break
} elseif ($checkcnt -eq 1) {
for ($startline;$startline -le $line;$startline++) {
$Othello[$startline][$startrow]='〇'
$startrow=$startrow-1
}
break
} elseif ($checkcnt -eq 2) {
for ($startrow;$startrow -ge $row;$startrow--) {
$Othello[$startline][$startrow]='〇'
}
break
} elseif ($checkcnt -eq 3) {
for ($startrow;$startrow -ge $row;$startrow--) {
$Othello[$startline][$startrow]='〇'
$startline=$startline-1
}
break
} elseif ($checkcnt -eq 4) {
for ($startline;$startline -ge $line;$startline--) {
$Othello[$startline][$startrow]='〇'
}
break
} elseif ($checkcnt -eq 5) {
for ($startline;$startline -ge $line;$startline--) {
$Othello[$startline][$startrow]='〇'
$startrow=$startrow+1
}
break
} elseif ($checkcnt -eq 6) {
for ($startrow;$startrow -le $row;$startrow++) {
$Othello[$startline][$startrow]='〇'
}
break
} elseif ($checkcnt -eq 7) {
for ($startrow;$startrow -le $row;$startrow++) {
$Othello[$startline][$startrow]='〇'
$startline=$startline+1
}
break
}
}
}
}
}
for ($n=0; $n -lt 8; $n++) {
$Othello[$n] -join ''
}
いくつかの場所に石を置いてみる。下の例では、2行目6列目(15)、5行目3列目(42)、3行目4列目(23)に置いた(0から数えているので、15の1は2行目、5は6列目となる)。少し動かしてみたけど、問題なく裏返されているよう。
今回作っていく中で、goto文や関数の再帰処理を使わなくても、for文、if文だけでコードを組めそう。一端、それらでコードを作ってみる。