python实现翻转棋游戏(实现翻转棋游戏(othello))
主要为大家详细介绍了python实现翻转棋游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
利用上一篇的框架,再写了个翻转棋的程序,为了调试minimax算法,花了两天的时间。
几点改进说明:几点改进说明:
拆分成四个文件:board.py,player.py,ai.py,othello.py。使得整个结构更清晰,更通用,更易于维护。
AI 的水平跟 minimax 的递归深度,以及评价函数有关。基于此,我把 minimax 和评价函数都放到 AI 类里面
AIPlayer 使用了多重继承。继承了 Player 与 AI 两个类
Game 类中把原run函数里的生成两个玩家的部分提出来,写成一个函数make_two_players,使得 run函数结构更清晰
AI 玩家等级不要选择 0:beginer。会报错,还没调试好
board.py
'''
作者:hhh5460
时间:2017年7月1日
'''
class Board(object):
def __init__(self):
self.empty = '.'
self._board = [[self.empty for _ in range(8)] for _ in range(8)] # 规格:8*8
self._board[3][4], self._board[4][3] = 'X', 'X'
self._board[3][3], self._board[4][4] = 'O', 'O'
# 增加 Board[][] 索引语法
def __getitem__(self, index):
return self._board[index]
# 打印棋盘
def print_b(self):
board = self._board
print(' ', ' '.join(list('ABCDEFGH')))
for i in range(8):
print(str(i+1),' '.join(board[i]))
# 棋局终止
def teminate(self):
list1 = list(self.get_legal_actions('X'))
list2 = list(self.get_legal_actions('O'))
return [False, True][len(list1) == 0 and len(list2) == 0]
# 判断赢家
def get_winner(self):
s1, s2 = 0, 0
for i in range(8):
for j in range(8):
if self._board[i][j] == 'X':
s1 += 1
if self._board[i][j] == 'O':
s2 += 1
if s1 > s2:
return 0 # 黑胜
elif s1 < s2:
return 1 # 白胜
elif s1 == s2:
return 2 # 平局
# 落子
def _move(self, action, color):
x,y = action
self._board[x][y] = color
return self._flip(action, color)
# 翻子(返回list)
def _flip(self, action, color):
flipped_pos = []
for line in self._get_lines(action):
for i,p in enumerate(line):
if self._board[p[0]][p[1]] == self.empty:
break
评论0