说明

用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 井字棋(Tic Tac Toe)相关推荐

  1. python井字棋ai,python 井字棋(Tic Tac Toe)

    说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码也是本人逐字逐句敲的. minimax算法还没完全理解,所以参考了这里的代码,并作了修改. 特点 可以选 ...

  2. python二维游戏示例_Python实现的井字棋(Tic Tac Toe)游戏示例

    本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏.分享给大家供大家参考,具体如下: 说明 用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意.另外,90%+的代码 ...

  3. python井字棋游戏代码_Python实现的井字棋(Tic Tac Toe)游戏示例

    Python实现的井字棋(Tic Tac Toe)游戏示例 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  Python实现的井字棋(Tic Tac Toe)游戏示 ...

  4. Principle of Computing (Python)学习笔记(7) DFS Search + Tic Tac Toe use MiniMax Stratedy

    1. Trees Tree is a recursive structure. 1.1 math nodes https://class.coursera.org/principlescomputin ...

  5. [CareerCup] 17.2 Tic Tac Toe 井字棋游戏

    17.2 Design an algorithm to figure out if someone has won a game oftic-tac-toe. 这道题让我们判断玩家是否能赢井字棋游戏, ...

  6. python设置桌面歌词_Python点阵字玩转动态歌词

    前面我们讲到了可以自定义输入汉字,然后用点阵字来展现,接下来我们挖掘下更有趣的玩法.想法来自于听歌时桌面动态歌词,我们的点阵字既然可以自定义输入识别,何不读取歌词文件随着歌曲播放动态显示呢? 下面介绍 ...

  7. 《数据结构与算法分析》回溯算法之博弈——三连棋(tic tac toe)人机对战AI设计(αβ枝减)

    前言: 这次的回溯算法实在是太有意思了,不过刚刚接触的时候确实不容理解,极小极大策略,αβ枝减看了好几遍才明白整个过程.实现的时候又发现还有细节不明白,想明白之后对于整体的认识又加深了一步. 编码的过 ...

  8. 圈叉游戏 java_【炫光圈叉棋】炫光圈叉棋 Tic Tac Toe Glow 1.8.1下载_安卓(android)软件下载-魅族溜...

    一款炫光风格的圈叉棋游戏,支持单/双人模式.圈叉棋,英文:tic-tac-toe,别名:圈叉游戏.是一种游戏,3*3的9个方格子,先下者画圈,后下者画叉,每人可以在任意没有对方棋子的封闭方格里下一次, ...

  9. python游戏代码运行不了_无法使我的tic tac toe游戏在python中正确运行

    转不到"玩家1"的原因是你的支票中缺少一个空格.你也没有正确地检查一个玩家何时获胜,这就是为什么你会有这种奇怪的行为.你需要检查每个位置,而不仅仅是最后一个.我还添加了对用户输入的 ...

最新文章

  1. 成功解决VM虚拟机内This compute has only 713.3MB disk space remaning
  2. 展望我的2022Flag
  3. YaoCCAD软件中设置坐标原点
  4. iptables 防火墙(上)
  5. Package 'xxxx' is not installed, so not removed
  6. python去重语句_Python Dataframe 指定多列去重、求差集的方法
  7. 06Prism WPF 入门实战 - Log控件库
  8. 工具资源系列之给虚拟机装个windows
  9. Spring单一类型依赖查找Bean
  10. Linux运维之ntpdate同步网络时间
  11. 除了UL认证,开拓美国市场必备认证有哪些?
  12. 蓝牙耳机无法与计算机连接,电脑连接蓝牙耳机时无法连接
  13. 机械祭天法力无边:练习3.5:编写一段程序从标准输入中读入多个字符串并将它们连接在一起,输出连接成的大字符串。然后修改上述程序,用空格把输入的多个字符串分隔开来。
  14. 向上的路,从来都不好走(好文力荐)
  15. android 模拟器 驱动,【新手指导】模拟器报错列表及解决办法!
  16. mysql 聚簇索引和非聚簇索引
  17. 基于Jetson NX的模型部署
  18. 厚基础Linux——学习笔记(一)
  19. 使用uiautomator2获取Android抖音直播间评论数据
  20. 解决mysql远程连接等待时间长的问题

热门文章

  1. CentOS 7.6升级系统内核
  2. 不正经的C语言学习记录(一)
  3. 数据挖掘之关联分析(实验展示以及源代码)
  4. 家庭农场:职业农民要有一定文化水平 需要资格审查
  5. 【网络协议】SNMP与Netconf
  6. 微信小程序_wxcharts(图表不随页面滑动因素之一)
  7. 关联规则算法——Apriori算法
  8. Python之父强烈推荐,Python3网络爬虫开发实战,爬虫入门必看书籍,豆瓣评分9.2
  9. Python学习笔记(十七)——Pandas库
  10. 加载html动画logo,仅CSS实现的加载动画 – Loader.css