Powershell(オセロ013)のロジック6までを入れたバージョンから少し修正したものです。
下のコードをメモ帳にコピー後、文字コードUTF8(BOM付き)、拡張子ps1で保存、実行で動くと思います。
・オセロのゲームで、白と黒で交互に自動的に石を置く。
置く場所は、ロジック0~6により決定(0: ランダム, 1: 四隅優先, 2: 1つの区画優先, 3: 裏返す石が最大, 4: 裏返す石が最小 (途中から), 5: 3手目で勝ち筋となる手が多いものを選択, 6: 0, 3, 5のミックス)。
・置くことができない場合、passして相手側の手順になる。
・白と黒どちらも置けない場合は終了。
・コンソール表示は、ゲーム毎の結果のみ。盤上のデータはテキストファイルに保存。
■ 実行例
■ サンプルコード
# =========================================================================
# [Board]クラス: オセロの盤(10×10マス (黒("●")、白("〇")、空欄("_")のどれか。)、表示の機能、結果集計機能
# [Player]クラス: プレイヤー(白か黒、ロジックを持つ)、石を置く機能、裏返す機能
# [Logic]クラス:0,ランダム 1,四隅優先 2,1つの区画優先(左上、右上、右下、左下) 3,最大数(最大数となるものでランダム) 4,最小数(途中から変更) 5,3手目で勝ち筋となる手が多いものを選択 6,ミックス
# [Utility]クラス: よく使う機能をメソッドに取り出したクラス
# $turn: 順番(player AかB)
# $endflag: ゲーム終了を判断するフラグ(passが両プレイヤーから連続した場合に終了)
# $trialnum: 現在、何手目かのカウント(無効となる場所に石を置いたときはカウントされない)
# =========================================================================
# $TEXTFILE= (結果を保存するファイル名)
# $GAME_NUM = (オセロを行う回数)
# $PLAYER_A_LOGIC=(プレイヤーAのロジック: 0~6)
# $PLAYER_B_LOGIC=(プレイヤーBのロジック: 0~6)
# =========================================================================
$TEXTFILE="result.txt"
$GAME_NUM = 1000
$PLAYER_A_LOGIC=0
$PLAYER_B_LOGIC=1
# =========================================================================
$result = @(0,0,0)
# GAME_NUMの数だけゲームを行う
for ($i=1; $i -le $GAME_NUM ; $i++) {
$othboard = [Board]::new()
$playerA = [Player]::new("〇", $PLAYER_A_LOGIC)
$playerB = [Player]::new("●", $PLAYER_B_LOGIC)
$turn = $playerA
$endflag = 0
$trialnum = 0
echo ("Game:"+$i+"| Start Othello") | Out-file $TEXTFILE -Append
$othboard.showBoard($othboard.boardData) | Out-file $TEXTFILE -Append
# 1ゲームの中、石を置く処理を繰り返す。
while($true) {
if ($turn -eq $playerA) {
$position = $playerA.placeStone($othboard.boardData,$playerA.logic)
if ($position -eq "pass") {
$endflag += $endflag + 1
$turn = $playerB
} else {
$othboard.boardData = $playerA.reverseStones($position, $othboard.boardData)
$trialnum++
$turn = $playerB
}
} elseif ($turn -eq $playerB) {
$position = $playerB.placeStone($othboard.boardData,$playerB.logic)
if ($position -eq "pass") {
$endflag += $endflag + 1
$turn = $playerA
} else {
$othboard.boardData = $playerB.reverseStones($position, $othboard.boardData)
$trialnum++
$turn = $playerA
}
}
echo ("=====Trial:"+$trialnum+"=====") | Out-file $TEXTFILE -Append
[String]$str = $othboard.showBoard($othboard.boardData)
echo ($str) | Out-file $TEXTFILE -Append
if ($endflag -ge 2) {
break
} elseif ($trialnum -ge 60) {
break
}
}
[String]$str = $othboard.sumResult($othboard.boardData, $result)
echo ($str + " Game:"+$i+" | End Othello")
echo ($str + " Game:"+$i+" | End Othello") | Out-file $TEXTFILE -Append
}
echo ("●"+$result[0]+"vs〇"+$result[1]+"vsE"+$result[2])
##############################################################
## [Board]クラス:
# コンストラクタ
# 表示の機能:[String]showBoard($boardData)
# 結果集計機能:[String]sumResult($boardData, $result)
##############################################################
class Board {
$boardData
#コンストラクタ、盤上のデータを初期化
Board() {
$this.boardData=@(
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','〇','●','_','_','_','_'),
@('_','_','_','_','●','〇','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_')
)
}
#盤上のデータ表示(引数:盤上のデータ、戻し値:現在の盤上を示した文字列)
[String]showBoard($boardData) {
[String]$boardStr=""
for ($n=1; $n -lt 8; $n++) {
$boardStr+=$boardData[$n][1]+$boardData[$n][2]+$boardData[$n][3]+$boardData[$n][4]+$boardData[$n][5]+$boardData[$n][6]+$boardData[$n][7]+$boardData[$n][8]+"`r`n"
}
$boardStr+=$boardData[$n][1]+$boardData[$n][2]+$boardData[$n][3]+$boardData[$n][4]+$boardData[$n][5]+$boardData[$n][6]+$boardData[$n][7]+$boardData[$n][8]
return $boardStr
}
#結果集計、白の石と黒の石のカウントとresultの勝敗を1つ増やす(引数:盤上のデータ、複数のゲームの勝率、戻し値:結果として表示する文字列)
[String]sumResult($boardData, $result) {
$whitecnt = 0
$blackcnt = 0
for ($n=1; $n -le 8; $n++) {
for ($m=1; $m -le 8; $m++) {
if ($boardData[$n][$m] -eq "●") {
$blackcnt++
} elseif ($boardData[$n][$m] -eq "〇") {
$whitecnt++
}
}
}
if ($blackcnt -gt $whitecnt) {
$result[0]++
} elseif ($blackcnt -lt $whitecnt) {
$result[1]++
} elseif ($blackcnt -eq $whitecnt) {
$result[2]++
}
return ("●"+$blackcnt+"vs〇"+$whitecnt)
}
}
##############################################################
## [Player]クラス:
# コンストラクタ
# 石を置く機能:[String]placeStone($boardData, $logic_num)(手動入力の場合、[String]placeStone($boardData))
# 裏返す機能:[String[][]]reverseStones($position, $boardData)
##############################################################
class Player {
$playerColor
$logic
#コンストラクタ、プレイヤーデータを初期化
Player($color, $logicNum) {
$this.playerColor = $color
$this.logic = $logicNum
}
#石を置く処理(引数:盤上のデータ、ロジックの番号、戻し値:石を置く場所の文字列(11~88))
[String]placeStone($boardData, $logic_num) {
$logic_num = $this.logic
$position ="00"
$blankArray=@()
$inputArray=@()
for ($n=1; $n -le 8; $n++) {
for ($m=1; $m -le 8; $m++) {
if ($boardData[$n][$m] -eq '_') {
$blankArray+= [string]$n + [string]$m
}else{
}
}
}
if ($blankArray.count -eq 0) {
$position = "pass"
} else{
if ($blankArray.count -eq 1) {
$inputArray = $blankArray
} else {
if ($logic_num -eq 0) {
$inputArray = [Logic]::logic_random($blankArray)
}elseif ($logic_num -eq 1){
$inputArray = [Logic]::logic_corner($blankArray, $boardData)
}elseif ($logic_num -eq 2){
$inputArray = [Logic]::logic_zone($blankArray, $boardData)
}elseif ($logic_num -eq 3){
$inputArray = [Logic]::logic_max($blankArray, $boardData, $this)
}elseif ($logic_num -eq 4){
$inputArray = [Logic]::logic_min($blankArray, $boardData, $this)
}elseif ($logic_num -eq 5){
$inputArray = [Logic]::logic_winroute($blankArray, $boardData, $this)
}elseif ($logic_num -eq 6){
$inputArray = [Logic]::logic_mix($blankArray, $boardData, $this)
}
}
#石を置いた場合に裏返すものがあるかのチェック(裏返すものがなければ、pass)
foreach ($position in $inputArray) {
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($this.playercolor, $this.logic)
$tempClass.reverseStones($position, $tempBoard)
$canBeReversed = [Utility]::compareBoard($tempBoard, $boardData)
if($canBeReversed) {
$position = "pass"
} else {
break
}
}
}
return $position
}
#石を置く処理(引数:盤上のデータ、戻し値:石を置く場所の文字列(11~88))
[String]placeStone($boardData) {
$position='00'
while ($true) {
$position = Read-Host ("Player ("+$this.playerColor+")")
if($position -eq "pass") {
break
} elseif($position.length -le 1) {
} else {
$line=$position.substring(0,1)
$row=$position.substring(1,1)
if (($line -ge 1) -And ($line -le 8) -And ($row -ge 1) -And ($row -le 8)) {
if ($boardData[$line][$row] -eq "_") {
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($this.playercolor, $this.logic)
$tempClass.reverseStones($position, $tempBoard)
$canBeReversed = [Utility]::compareBoard($tempBoard, $boardData)
if($canBeReversed) {
} else { break
}
}
}
}
}
return $position
}
#石を裏返す処理(引数:石を置く場所、盤上のデータ、戻し値:裏返した後の盤上のデータ)
[String[][]]reverseStones($position, $boardData) {
if ($position -eq "pass") {
return $boardData
}
for ($checkcnt=0; $checkcnt -lt 8; $checkcnt++) {
$line=$position.substring(0,1)
$row=$position.substring(1,1)
[Int]$startline=$line
[Int]$startrow=$row
[Int]$opponentstonenum=0
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 ($boardData[$startline][$startrow] -eq "_") {
break
} elseif ($boardData[$startline][$startrow] -ne $this.playerColor) {
$opponentstonenum=$opponentstonenum+1
} elseif ($boardData[$startline][$startrow] -eq $this.playerColor) {
if ($opponentstonenum -ge 1) {
if ($checkcnt -eq 0) {
for ($startline;$startline -le $line;$startline++) {
$boardData[$startline][$startrow]=$this.playerColor
}
break
} elseif ($checkcnt -eq 1) {
for ($startline;$startline -le $line;$startline++) {
$boardData[$startline][$startrow]=$this.playerColor
$startrow=$startrow-1
}
break
} elseif ($checkcnt -eq 2) {
for ($startrow;$startrow -ge $row;$startrow--) {
$boardData[$startline][$startrow]=$this.playerColor
}
break
} elseif ($checkcnt -eq 3) {
for ($startrow;$startrow -ge $row;$startrow--) {
$boardData[$startline][$startrow]=$this.playerColor
$startline=$startline-1
}
break
} elseif ($checkcnt -eq 4) {
for ($startline;$startline -ge $line;$startline--) {
$boardData[$startline][$startrow]=$this.playerColor
}
break
} elseif ($checkcnt -eq 5) {
for ($startline;$startline -ge $line;$startline--) {
$boardData[$startline][$startrow]=$this.playerColor
$startrow=$startrow+1
}
break
} elseif ($checkcnt -eq 6) {
for ($startrow;$startrow -le $row;$startrow++) {
$boardData[$startline][$startrow]=$this.playerColor
}
break
} elseif ($checkcnt -eq 7) {
for ($startrow;$startrow -le $row;$startrow++) {
$boardData[$startline][$startrow]=$this.playerColor
$startline=$startline+1
}
break
}
} else {
break
}
}
}
}
return $boardData
}
}
##############################################################
## [Logic]クラス:
##############################################################
Class Logic{
static [String[]]logic_random($blankArray) {
$inputArray=@()
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
return $inputArray
}
static [String[]]logic_corner($blankArray, $boardData) {
$inputArray=@()
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
$cornerArray = @()
if ($boardData[1][1] -eq '_') {
$cornerArray += "11"
}
if ($boardData[8][1] -eq '_') {
$cornerArray += "81"
}
if ($boardData[1][8] -eq '_') {
$cornerArray += "18"
}
if ($boardData[8][8] -eq '_') {
$cornerArray += "88"
}
$inputArray = $cornerArray + $inputArray
return $inputArray
}
static [String[]]logic_zone($blankArray, $boardData) {
$inputArray=@()
$zoneArray = @()
for ($n=1; $n -le 4; $n++) {
for ($m=1; $m -le 4; $m++) {
if ($boardData[$n][$m] -eq '_') {
$zoneArray+= [string]$n + [string]$m
}else{
}
}
}
if($zoneArray.count -eq 0) {
} elseif($zoneArray.count -eq 1) {
$inputArray = $zoneArray
} else {
$inputArray = get-random -input $zoneArray -count ([int]::MaxValue)
}
$zoneArray = @()
for ($n=1; $n -le 4; $n++) {
for ($m=5; $m -le 8; $m++) {
if ($boardData[$n][$m] -eq '_') {
$zoneArray+= [string]$n + [string]$m
}else{
}
}
}
if($zoneArray.count -eq 0) {
} elseif($zoneArray.count -eq 1) {
$inputArray = $zoneArray
} else {
$inputArray = $inputArray + (get-random -input $zoneArray -count ([int]::MaxValue))
}
$zoneArray = @()
for ($n=5; $n -le 8; $n++) {
for ($m=5; $m -le 8; $m++) {
if ($boardData[$n][$m] -eq '_') {
$zoneArray+= [string]$n + [string]$m
}else{
}
}
}
if($zoneArray.count -eq 0) {
} elseif($zoneArray.count -eq 1) {
$inputArray = $zoneArray
} else {
$inputArray = $inputArray + (get-random -input $zoneArray -count ([int]::MaxValue))
}
$zoneArray = @()
for ($n=5; $n -le 8; $n++) {
for ($m=1; $m -le 4; $m++) {
if ($boardData[$n][$m] -eq '_') {
$zoneArray+= [string]$n + [string]$m
}else{
}
}
}
if($zoneArray.count -eq 0) {
} elseif($zoneArray.count -eq 1) {
$inputArray = $zoneArray
} else {
$inputArray = $inputArray + (get-random -input $zoneArray -count ([int]::MaxValue))
}
return $inputArray
}
static [String[]]logic_max($blankArray, $boardData, $Player) {
$max_diff_num = 0
$tempposition ="00"
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
foreach ($position in $inputArray) {
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($Player.playercolor, $Player.logic)
$tempClass.reverseStones($position, $tempBoard)
$diff_num = [Utility]::compareBoardDiffNum($tempBoard, $boardData)
if ($diff_num -gt $max_diff_num) {
$max_diff_num = $diff_num
$tempposition = $position
}
}
$inputArray[0] = $tempposition
return $inputArray
}
static [String[]]logic_min($blankArray, $boardData, $Player) {
$min_diff_num = 32
$tempposition ="00"
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
if($blankArray.count -le 55) {
} else{
foreach ($position in $inputArray) {
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($Player.playercolor, $Player.logic)
$tempClass.reverseStones($position, $tempBoard)
$diff_num = [Utility]::compareBoardDiffNum($tempBoard, $boardData)
if ($diff_num -ne 0) {
if ($diff_num -lt $min_diff_num) {
$min_diff_num = $diff_num
$tempposition = $position
}
}
}
$inputArray[0] = $tempposition
}
return $inputArray
}
static [String[]]logic_winroute($blankArray, $boardData, $Player) {
$max_win_route_rate = 0
$tempposition ="00"
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
$boardList = [System.Collections.ArrayList]::new()
foreach ($position in $inputArray) {
$win_route = 0
$boardList.clear()
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($Player.playerColor, $Player.logic)
$tempClass.reverseStones($position, $tempBoard)
$canBeReversed = [Utility]::compareBoard($tempBoard, $boardData)
if($canBeReversed) {
} else {
if($Player.playerColor -eq "●") {
$tempboardList = [System.Collections.ArrayList]::new()
$tempboardList = [Utility]::reversedBoardList($tempBoard, "〇")
foreach ($nextBlackTurnBoard in $tempboardList) {
$boardList.AddRange([Utility]::reversedBoardList($nextBlackTurnBoard, "●"))
}
} elseif ($Player.playerColor -eq "〇") {
$tempboardList = [System.Collections.ArrayList]::new()
$tempboardList = [Utility]::reversedBoardList($tempBoard, "●")
foreach ($nextWhiteTurnBoard in $tempboardList) {
$boardList.AddRange([Utility]::reversedBoardList($nextWhiteTurnBoard, "〇"))
}
}
foreach ($field in $boardList) {
$fieldLeth = ""
foreach($item in $field) {
$fieldLeth = $fieldLeth + ($item -join "")
}
$blackcnt = $fieldLeth.Length - ($fieldLeth -replace "●","").Length
$whitecnt = $fieldLeth.Length - ($fieldLeth -replace "〇","").Length
if($Player.playerColor -eq "●") {
if($blackcnt -gt $whitecnt) {
$win_route++
}
} elseif ($Player.playerColor -eq "〇") {
if($whitecnt -gt $blackcnt) {
$win_route++
}
}
}
if ($boardList.count -eq 0) {
} else {
if (($win_route/$boardList.count) -ge $max_win_route_rate) {
$max_win_route_rate = $win_route/$boardList.count
$tempposition = $position
}
}
}
}
$inputArray[0] = $tempposition
return $inputArray
}
static [String[]]logic_mix($blankArray, $boardData, $Player) {
######
#最も多くの石を裏返すところをリスト化する。
$max_diff_num = 0
$tempposition ="00"
$maxboardList = [System.Collections.ArrayList]::new()
$inputArray = get-random -input $blankArray -count ([int]::MaxValue)
foreach ($position in $inputArray) {
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($Player.playercolor, $Player.logic)
$tempClass.reverseStones($position, $tempBoard)
$diff_num = [Utility]::compareBoardDiffNum($tempBoard, $boardData)
if ($diff_num -gt $max_diff_num) {
$max_diff_num = $diff_num
$maxboardList.Add($position)
}
}
######
######
#上で作ったリストから3手目先で勝っている状態となるルートとなる確率が高い一手を選択する。
$max_win_route_rate = 0
$tempposition ="00"
$boardList = [System.Collections.ArrayList]::new()
foreach ($position in $maxboardList) {
$win_route = 0
$boardList.clear()
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass = [Player]::new($Player.playerColor, $Player.logic)
$tempClass.reverseStones($position, $tempBoard)
$canBeReversed = [Utility]::compareBoard($tempBoard, $boardData)
if($canBeReversed) {
} else {
if($Player.playerColor -eq "●") {
$tempboardList = [System.Collections.ArrayList]::new()
$tempboardList = [Utility]::reversedBoardList($tempBoard, "〇")
foreach ($nextBlackTurnBoard in $tempboardList) {
$boardList.AddRange([Utility]::reversedBoardList($nextBlackTurnBoard, "●"))
}
} elseif ($Player.playerColor -eq "〇") {
$tempboardList = [System.Collections.ArrayList]::new()
$tempboardList = [Utility]::reversedBoardList($tempBoard, "●")
foreach ($nextWhiteTurnBoard in $tempboardList) {
$boardList.AddRange([Utility]::reversedBoardList($nextWhiteTurnBoard, "〇"))
}
}
foreach ($field in $boardList) {
$fieldLeth = ""
foreach($item in $field) {
$fieldLeth = $fieldLeth + ($item -join "")
}
$blackcnt = $fieldLeth.Length - ($fieldLeth -replace "●","").Length
$whitecnt = $fieldLeth.Length - ($fieldLeth -replace "〇","").Length
if($Player.playerColor -eq "●") {
if($blackcnt -gt $whitecnt) {
$win_route++
}
} elseif ($Player.playerColor -eq "〇") {
if($whitecnt -gt $blackcnt) {
$win_route++
}
}
}
if ($boardList.count -eq 0) {
} else {
if (($win_route/$boardList.count) -ge $max_win_route_rate) {
$max_win_route_rate = $win_route/$boardList.count
$tempposition = $position
}
}
}
}
$inputArray[0] = $tempposition
######
######
#上で選択した一手より四隅を優先する。
$cornerArray = @()
if ($boardData[1][1] -eq '_') {
$cornerArray += "11"
}
if ($boardData[8][1] -eq '_') {
$cornerArray += "81"
}
if ($boardData[1][8] -eq '_') {
$cornerArray += "18"
}
if ($boardData[8][8] -eq '_') {
$cornerArray += "88"
}
$inputArray = $cornerArray + $inputArray
######
return $inputArray
}
}
##############################################################
## [Utility]クラス:
# 盤上のデータを比較する機能:[Boolean]compareBoard($tempBoard, $boardData)
# 盤上のデータを比較する機能(差の取得):[Int]compareBoardDiffNum($tempBoard, $boardData)
# 盤上のデータをコピーする機能:[String[][]]copyBoard($boardData)
# 盤上のデータから石をおくことができる場所に石を置いた際の盤上のデータのリストを返す
##############################################################
Class Utility {
#盤上のデータを比較する機能(引数:盤上データ、盤上のデータ、戻し値:一致するかどうか($true, $false))
static [Boolean]compareBoard($tempBoard, $boardData) {
for ($n=1; $n -le 8; $n++) {
for ($m=1; $m -le 8; $m++) {
if ($boardData[$n][$m] -eq $tempBoard[$n][$m]) {
}else{
return $false
}
}
}
return $true
}
#盤上のデータを比較する機能(引数:盤上データ、盤上のデータ、戻し値:差の数))
static [Int]compareBoardDiffNum($tempBoard, $boardData) {
[Int]$diff_num = 0
for ($n=1; $n -le 8; $n++) {
for ($m=1; $m -le 8; $m++) {
if ($boardData[$n][$m] -eq $tempBoard[$n][$m]) {
}else{
$diff_num++
}
}
}
return $diff_num
}
#盤上のデータをコピーする機能(引数:盤上のデータ、戻し値:コピーした盤上のデータ(配列は参照型なので、別の2次元配列を準備して戻す))
static [String[][]]copyBoard($boardData) {
$tempBoard=@(
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_'),
@('_','_','_','_','_','_','_','_','_','_')
)
for ($n=1; $n -le 8; $n++) {
for ($m=1; $m -le 8; $m++) {
$tempBoard[$n][$m] = $boardData[$n][$m]
}
}
return $tempBoard
}
#盤上のデータから石をおくことができる場所に石を置いた際の盤上のデータのリストを返す(引数:盤上のデータ、戻し値:裏返された盤上のデータのリスト)
static [System.Collections.ArrayList]reversedBoardList($boardData, $color) {
$boardList = [System.Collections.ArrayList]::new()
$tempClass = [Player]::new($color, 0)
for ($n=1; $n -le 8; $n++) {
for ($m=1; $m -le 8; $m++) {
if ($boardData[$n][$m] -ne '_') {
} else {
$position = [String]$n + [String]$m
$tempBoard = [Utility]::copyBoard($boardData)
$tempClass.reverseStones($position, $tempBoard)
$canBeReversed = [Utility]::compareBoard($tempBoard, $boardData)
if($canBeReversed) {
} else {
$boardList.Add($tempBoard)
}
}
}
}
return $boardList
}
}