本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏。分享给大家供大家参考,具体如下:
说明
用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意。另外,90%+的代码也是本人逐字逐句敲的。
minimax算法还没完全理解,所以参考了这里的代码,并作了修改。
特点
可以选择人人、人机、机人、机机四种对战模式之一
电脑玩家的AI使用了minimax算法,带apha-beta剪枝
电脑玩家在思考时,时时刻刻都有一个“假想敌”。以便使得minimax算法运转起来
代码
#作者:hhh5460 #时间:2017年6月26日 # 棋盘 class Board(object): def __init__(self): #self._board = '-'*9 # 坑!! self._board = ['-' for _ in range(9)] self._history = [] # 棋谱 # 按指定动作,放入棋子 def _move(self, action, take): if self._board[action] == '-': self._board[action] = take self._history.append((action, take)) # 加入棋谱 # 撤销动作,拿走棋子 def _unmove(self, action): self._board[action] = '-' self._history.pop() # 棋盘快照 def get_board_snapshot(self): return self._board[:] # 取棋盘上的合法走法 def get_legal_actions(self): actions = [] for i in range(9): if self._board[i] == '-': actions.append(i) return actions # 判断走法是否合法 def is_legal_action(self, action): return self._board[action] == '-' # 终止检测 def teminate(self): board = self._board lines = [board[0:3], board[3:6], board[6:9], board[0::3], board[1::3], board[2::3], board[0::4], board[2:7:2]] if ['X']*3 in lines or ['O']*3 in lines or '-' not in board: return True else: return False # 胜负检查 def get_winner(self): board = self._board lines = [board[0:3], board[3:6], board[6:9], board[0::3], board[1::3], board[2::3], board[0::4], board[2:7:2]] if ['X']*3 in lines: return 0 elif ['O']*3 in lines: return 1 else: return 2 # 打印棋盘 def print_b(self): board = self._board for i in range(len(board)): print(board[i], end='') if (i+1)%3 == 0: print() # 打印棋谱 def print_history(self): print(self._history) # 玩家 class Player(object): ''' 玩家只做两件事:思考、落子 1. 思考 --> 得到走法 2. 落子 --> 执行走法,改变棋盘 ''' def __init__(self, take='X'): # 默认执的棋子为 take = 'X' self.take=take def think(self, board): pass def move(self, board, action): board._move(action, self.take) # 人类玩家 class HumanPlayer(Player): def __init__(self, take): super().__init__(take) def think(self, board): while True: action = input('Please input a num in 0-8:') if len(action)==1 and action in '012345678' and board.is_legal_action(int(action)): return int(action) # 电脑玩家 class AIPlayer(Player): def __init__(self, take): super().__init__(take) def think(self, board): print('AI is thinking ...') take = ['X','O'][self.take=='X'] player = AIPlayer(take) # 假想敌!!! _, action = self.minimax(board, player) #print('OK') return action # 极大极小法搜索,α-β剪枝 def minimax(self, board, player, depth=0) : '''参考:https://stackoverflow.com/questions/44089757/minimax-algorithm-for-tic-tac-toe-python''' if self.take == "O": bestVal = -10 else: bestVal = 10 if board.teminate() : if board.get_winner() == 0 : return -10 + depth, None elif board.get_winner() == 1 : return 10 - depth, None elif board.get_winner() == 2 : return 0, None for action in board.get_legal_actions() : # 遍历合法走法 board._move(action, self.take) val, _ = player.minimax(board, self, depth+1) # 切换到 假想敌!!! board._unmove(action) # 撤销走法,回溯 if self.take == "O" : if val > bestVal: bestVal, bestAction = val, action else : if val < bestVal: bestVal, bestAction = val, action return bestVal, bestAction # 游戏 class Game(object): def __init__(self): self.board = Board() self.current_player = None # 生成玩家 def mk_player(self, p, take='X'): # p in [0,1] if p==0: return HumanPlayer(take) else: return AIPlayer(take) # 切换玩家 def switch_player(self, player1, player2): if self.current_player is None: return player1 else: return [player1, player2][self.current_player == player1] # 打印赢家 def print_winner(self, winner): # winner in [0,1,2] print(['Winner is player1','Winner is player2','Draw'][winner]) # 运行游戏 def run(self): ps = input("Please select two player's type:\n\t0.Human\n\t1.AI\nSuch as:0 0\n") p1, p2 = [int(p) for p in ps.split(' ')] player1, player2 = self.mk_player(p1, 'X'), self.mk_player(p2, 'O') # 先手执X,后手执O print('\nGame start!\n') self.board.print_b() # 显示棋盘 while True: self.current_player = self.switch_player(player1, player2) # 切换当前玩家 action = self.current_player.think(self.board) # 当前玩家对棋盘进行思考后,得到招法 self.current_player.move(self.board, action) # 当前玩家执行招法,改变棋盘 self.board.print_b() # 显示当前棋盘 if self.board.teminate(): # 根据当前棋盘,判断棋局是否终止 winner = self.board.get_winner() # 得到赢家 0,1,2 break self.print_winner(winner) print('Game over!') self.board.print_history() if __name__ == '__main__': Game().run()
下图是人人对战的结果
更多关于Python相关内容可查看本站专题:《Python游戏开发技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
标签:
Python,井字棋,游戏
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“Python实现的井字棋(Tic Tac Toe)游戏示例”评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新动态
2024年11月26日
2024年11月26日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]