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() のようにモジュール名をつけて呼び出しています。
これでもちゃんと動作します。相変わらず激弱ですが。
コメント