CentOSでのpythonの実行
■CentOSでサンプルコードを実行した。
サンプルコードは、以前、バッチファイルやPowershellで作成したオセロのコードをpythonで作り直した。バッチと比べてリストや繰り返しなどやりやすいことは多いので、石を裏返すロジックなど少し修正。コードは一番下。
ファイル名は"sampleCode005_othello.py"と付けた。
プログラムの作成自体は別パソコンで行っているので、USBメモリでファイル移動、ファイルは、CentOS内の /run/media/(USBメモリ) でアクセスできる。これを実行してみると、numpyのパッケージがないとエラーになった。なので、"pip install numpy"コマンドで、パッケージをインストール。pip もなかったけど、このコマンドでpipをインストールするかも聞かれ、numpyのインストールまでできた。再度、"python sampleCode005_othello.py”で実行すると、別パソコンでテストしたときと同様に、終わりまで確認できた。
別パソコンとCentOSを入れたパソコンでは、メモリやCPUのスペックが異なる(CentOSを入れたパソコンの方が少しいい)ので、パフォーマンスについてもう少し見てみたい。
オセロのコードは下の通り。バッチファイルでは400行ほどだったけど、今回は100行ほどになった。
import time
import random as rd
import numpy as np
_stoneA = "○"
_stoneB = "●"
_turn = "○"
leftBlankList = [[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4],
[2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1],
[4, 2], [4, 3], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2],
[6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7],
[7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]]
def checkRevinLine(i, j, inc, stone_pos):
revListonLine = []
if board[stone_pos[0] + i, stone_pos[1] + j] == "-":
revListonLine = []
elif board[stone_pos[0] + i, stone_pos[1] + j] == _stoneA:
revListonLine.append([stone_pos[0] + i, stone_pos[1] + j])
elif board[stone_pos[0] + i, stone_pos[1] + j] == _stoneB:
revListonLine.append([stone_pos[0] + i, stone_pos[1] + j])
Temp = checkRevinLine(i + inc[0], j + inc[1], inc, stone_pos)
if Temp == []:
revListonLine = []
else:
revListonLine.extend(Temp)
return revListonLine
def checkReversible(board, stone_pos):
listtobeChanged = []
for i in [-1, 0, 1]:
for j in [-1, 0, 1]:
if board[stone_pos[0] + i, stone_pos[1] + j] == _stoneB:
listtobeChanged.extend(checkRevinLine(i, j, [i, j], stone_pos))
return listtobeChanged
def changePlayer(currentTurn):
global _turn
global _stoneA
global _stoneB
if currentTurn == "○":
_turn = "●"
_stoneA = "●"
_stoneB = "○"
else:
_turn = "○"
_stoneA = "○"
_stoneB = "●"
def decideStonePos(logic_num, reversiblePosList):
stone_pos = rd.choice(reversiblePosList)
return stone_pos
start_time = time.time()
board = np.full((10, 10), "―")
board[4, 5] = "○"
board[5, 5] = "●"
board[5, 4] = "○"
board[4, 4] = "●"
endflag_by_pass = 0
tempBlankList = []
tempBlankList = leftBlankList.copy()
while len(leftBlankList) > 0:
stone_pos = decideStonePos(1, tempBlankList)
tempBlankList.remove(stone_pos)
stoneList_tobeChanged = checkReversible(board, stone_pos)
if len(stoneList_tobeChanged) > 0:
endflag_by_pass = 0
for pos in stoneList_tobeChanged:
if _turn == "○":
board[stone_pos[0], stone_pos[1]] = "○"
board[pos[0], pos[1]] = "○"
else:
board[stone_pos[0], stone_pos[1]] = "●"
board[pos[0], pos[1]] = "●"
print(stone_pos, len(leftBlankList), _turn)
print(board[1:9, 1:9])
leftBlankList.remove(stone_pos)
tempBlankList = leftBlankList.copy()
changePlayer(_turn)
if len(tempBlankList) == 0:
if endflag_by_pass == 1:
break
tempBlankList = leftBlankList.copy()
changePlayer(_turn)
stoneList_tobeChanged = []
endflag_by_pass = 1
boardList = board.tolist()
countW = 0
countB = 0
for i in range(1, 9, 1):
countW = countW + boardList[i].count("○")
countB = countB + boardList[i].count("●")
print("Black:", countB, " White:", countW, " ExecTime:", '{:.10g}'.format(time.time() - start_time))