gpt4 book ai didi

Python实现的井字棋(Tic Tac Toe)游戏示例

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python实现的井字棋(Tic Tac Toe)游戏示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例讲述了Python实现的井字棋(Tic Tac Toe)游戏。分享给大家供大家参考,具体如下:

说明 。

用python实现了井字棋,整个框架是本人自己构思的,自认为比较满意。另外,90%+的代码也是本人逐字逐句敲的.

minimax算法还没完全理解,所以参考了这里的代码,并作了修改.

特点 。

可以选择人人、人机、机人、机机四种对战模式之一 电脑玩家的AI使用了minimax算法,带apha-beta剪枝 电脑玩家在思考时,时时刻刻都有一个“假想敌”。以便使得minimax算法运转起来 。

代码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#作者: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实现的井字棋(Tic Tac Toe)游戏示例

希望本文所述对大家Python程序设计有所帮助.

原文链接:http://www.cnblogs.com/hhh5460/p/7082112.html 。

最后此篇关于Python实现的井字棋(Tic Tac Toe)游戏示例的文章就讲到这里了,如果你想了解更多关于Python实现的井字棋(Tic Tac Toe)游戏示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com