留给机器学习的接口
"""
井字棋 Demo
无 Frame 版本
2021.11.8
"""
checkerboard = []
# 定义落子
def ChangeCheckerBoard(movement, agent):
if checkerboard[movement] is not None:
raise ValueError("Movement must be empty!")
else:
checkerboard[movement] = agent
# 判断输赢
def isWin():
states = [(0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6)]
for state in states:
if checkerboard[state[0]] == checkerboard[state[1]] and checkerboard[state[1]] == checkerboard[state[2]] \
and checkerboard[state[0]] in ('O', 'X'):
return True
return False
# 打印棋盘
def printCheckerBoard():
for i in range(9):
if checkerboard[i] is None:
print('■', end='\t')
else:
print(checkerboard[i], end='\t')
if (i + 1) % 3 == 0:
print('\n')
# 更新回合
def renewTurn(turn):
if turn == 'O':
return 'X'
return 'O'
# 验证输入
def ensureInput(section, remind, warning):
while True:
tem = input(remind)
if tem in section:
return tem
else:
print(warning)
# 留给机器训练的接口
def TrainAPI(board, movement, Turn):
"""
在训练代码中
记得调用isWin判断是否获胜
未获胜要调用renewTurn更新回合
"""
global checkerboard
checkerboard = board
new_move = movement
ChangeCheckerBoard(new_move, Turn)
# 判断是否平局
def isEqual():
if None not in checkerboard:
return True
return False
# 测试主函数
if __name__ == '__main__':
# 游戏主循环
while True:
# 定义棋盘
checkerboard = [None for i in range(9)]
# O先X后
Turn = 'O'
while True:
# 输入移动坐标
new_move = ensureInput(('0', '1', '2', '3', '4', '5', '6', '7', '8'),
'请输入{}本次的移动坐标(0~8):'.format(Turn),
'移动坐标不规范!请重新输入!')
new_move = int(new_move)
# 移动
ChangeCheckerBoard(new_move, Turn)
# 打印棋盘
printCheckerBoard()
if isWin():
print('{}赢了!'.format(Turn))
break
if isEqual():
print('平局!')
break
Turn = renewTurn(Turn)
selection = ensureInput(('Yes', 'No'),
'想要再玩一盘吗?(Yes/No)',
'请输入Yes或No!')
if selection == 'No':
break