Python でモジュールを作る(CUIでもリバーシ…)

Python
この記事は約8分で読めます。

Pythonモジュール

Python のプログラムは、特別なことを何もしなくてもモジュールとして使用することができます。

モジュールを使用する場合は、モジュールを使用したいプログラム側で、

import モジュール名(ファイル名から拡張子.pyは省いたもの)

とします。これは Java の import よりも PHP の require に近い働きで、モジュール内のプログラムが import 文が記述された場所に挿入されたような動作をします。つまり、モジュール側で関数外に記述された処理は、import しただけでも実行されてしまうことに注意する必要があります。

前回の pygame版リバーシの最後の部分、

if __name__=="__main__":
    main()

この2行は、モジュールとして呼び出されたときにプログラムを実行してしまわないためのものです。つまりこれはモジュールとして使用するために必須なわけではなく、『単独でもプログラムとして動作し、モジュールとしても使われる』という場合のみ必要な記述です。

モジュール内で定義された関数やグローバル変数は、

モジュール名.関数名
モジュール名.グローバル変数

とします。

または、インポートの時に

from モジュール名 import オブジェクト名

とすると、モジュール名を省略してオブジェクト名だけで利用することができます。

CUIでリバーシを作る

それでは、前回製作したGUI(pygame)で作成したリバーシを利用して、CUIで動作するリバーシを作ってみましょう。盤面の管理や思考ルーチンはそのまま利用して、画面表示と入力部分だけ新しく作成します。

全ソースコード

前回の pygame版リバーシが GUIReversi.py というファイル名で保存されている前提です。

import GUIReversi

# 画面表示
def displayBoard(board):
    print(" |1|2|3|4|5|6|7|8|")
    print("-+-+-+-+-+-+-+-+-+")
    for y in range(1,9,1):
        print(y,"|",end="")
        for x in range(1,9,1):
            if board[y][x]==1:
                print("○|",end="")
            elif board[y][x]==-1:
                print("●|",end="")
            else:
                print(" |",end="")
        print()
        print("-+-+-+-+-+-+-+-+-+")
    scorePlayer,scoreCPU = GUIReversi.countPieces(board)
    print("player=",scorePlayer)
    print("CPU=",scoreCPU)
    print()

# PLAYER が駒を置く場所を入力する
def inputPlayerMove():
    while True:                                                                 # x,yともに1~8の数字が入力されるまで繰り返し
        try:
            x=int(input("X="))
            y=int(input("y="))
            if x<1 or x>8 or y<1 or y>8:                                        # 値の範囲チェック
                print("1~8の範囲で入力して下さい")
                continue                                                        # 値が範囲外ならやりなおし
            return x,y                                                          # 問題なければ入力終了
        except ValueError:                                                      # 半角数字以外が入力されると int() で ValueERror が発生する
            print("数字で入力して下さい")
            continue                                                            # 入力が数字以外ならやりなおし

def reversePieces(board, reversePiecesList, side):
    for px,py in reversePiecesList:
        board[py][px] = side

def main():
    board = GUIReversi.initBoard()                                              # 盤面の初期化
    while True:
        # PLAYER の手番
        displayBoard(board)
        if GUIReversi.think(board, GUIReversi.PLAYER):                          # PLAYER が置ける場所がなければ強制パス
            while True:                                                         # 有効な入力があるまで繰り返し
                x,y=inputPlayerMove()                                           # 入力受け付け
                if GUIReversi.canPutPieceXY(board,x,y,GUIReversi.PLAYER)==True:
                    break
            reversePiecesList = GUIReversi.getReversePiecesList(board,x,y, GUIReversi.PLAYER)
            reversePieces(board, reversePiecesList, GUIReversi.PLAYER)
            displayBoard(board)
            if GUIReversi.isGameOver(board):                                    # ゲームが終了しているか
                break
        else:
            print("PLAYERが置ける場所がありません")

        # CPU の手番
        t=GUIReversi.think(board,GUIReversi.CPU)                                # CPUの思考
        if t!=False:                                                            # CPU が置ける場所がなければパス
            reversePiecesList = GUIReversi.getReversePiecesList(board,t[0],t[1],GUIReversi.CPU)
            reversePieces(board, reversePiecesList, GUIReversi.CPU)
        else:
            print("CPUが置ける場所がありません")
        displayBoard(board)
        if GUIReversi.isGameOver(board):                                        # ゲームが終了しているか
            break

    # 結果表示
    scorePlayer,scoreCPU = GUIReversi.countPieces(board)                
    print("player=",scorePlayer)
    print("CPU=",scoreCPU)
    if scorePlayer > scoreCPU:
        print("PLAYER WIN")
    elif scorePlayer < scoreCPU:
        print("CPU WIN")
    else:
        print("DRAW")

if __name__=="__main__":
    main()    

コード解説

主要な処理は GUIReversiモジュール(GUIReversi.py)のものを利用しているので、こちらに記述されているのはメイン関数と画面表示と入力だけです。今回はfrom句を使わず、モジュール内の関数はすべて GUIReversi.think() のようにモジュール名をつけて呼び出しています。

これでもちゃんと動作します。相変わらず激弱ですが。

コメント

タイトルとURLをコピーしました