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))