最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)的井字棋(Tic Tac Toe)游戲示例

 更新時間:2018年01月31日 08:53:00   作者:羅兵  
這篇文章主要介紹了Python實現(xiàn)的井字棋(Tic Tac Toe)游戲,結(jié)合實例形式分析了井字棋的原理及Python相關(guān)實現(xiàn)技巧,需要的朋友可以參考下

本文實例講述了Python實現(xiàn)的井字棋(Tic Tac Toe)游戲。分享給大家供大家參考,具體如下:

說明

用python實現(xiàn)了井字棋,整個框架是本人自己構(gòu)思的,自認(rèn)為比較滿意。另外,90%+的代碼也是本人逐字逐句敲的。

minimax算法還沒完全理解,所以參考了這里的代碼,并作了修改。

特點

可以選擇人人、人機(jī)、機(jī)人、機(jī)機(jī)四種對戰(zhàn)模式之一
電腦玩家的AI使用了minimax算法,帶apha-beta剪枝
電腦玩家在思考時,時時刻刻都有一個“假想敵”。以便使得minimax算法運轉(zhuǎn)起來

代碼

#作者: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
 # 勝負(fù)檢查
 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. 落子 --> 執(zhí)行走法,改變棋盤
 '''
 def __init__(self, take='X'): # 默認(rèn)執(zhí)的棋子為 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') # 先手執(zhí)X,后手執(zhí)O
  print('\nGame start!\n')
  self.board.print_b() # 顯示棋盤
  while True:
   self.current_player = self.switch_player(player1, player2) # 切換當(dāng)前玩家
   action = self.current_player.think(self.board) # 當(dāng)前玩家對棋盤進(jìn)行思考后,得到招法
   self.current_player.move(self.board, action) # 當(dāng)前玩家執(zhí)行招法,改變棋盤
   self.board.print_b() # 顯示當(dāng)前棋盤
   if self.board.teminate(): # 根據(jù)當(dāng)前棋盤,判斷棋局是否終止
    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()

下圖是人人對戰(zhàn)的結(jié)果

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python游戲開發(fā)技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • python出現(xiàn)RuntimeError錯誤問題及解決

    python出現(xiàn)RuntimeError錯誤問題及解決

    這篇文章主要介紹了python出現(xiàn)RuntimeError錯誤問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • python檢測某個變量是否有定義的方法

    python檢測某個變量是否有定義的方法

    這篇文章主要介紹了python檢測某個變量是否有定義的方法,實例分析了Python常用的變量判定技巧,需要的朋友可以參考下
    2015-05-05
  • 舉例詳解Python中的split()函數(shù)的使用方法

    舉例詳解Python中的split()函數(shù)的使用方法

    這篇文章主要介紹了舉例詳解Python中的split()函數(shù)的使用方法,split()函數(shù)的使用是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,通常用于將字符串切片并轉(zhuǎn)換為列表,需要的朋友可以參考下
    2015-04-04
  • Python的幾種主動結(jié)束程序方式

    Python的幾種主動結(jié)束程序方式

    這篇文章主要介紹了Python的幾種主動結(jié)束程序方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Python腳本完成post接口測試的實例

    Python腳本完成post接口測試的實例

    今天小編就為大家分享一篇Python腳本完成post接口測試的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python中的yield全方位解讀

    Python中的yield全方位解讀

    這篇文章主要介紹了Python中的yield全方位解讀,在 Python 中,使用了 yield 的函數(shù)被稱為生成器,跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器,需要的朋友可以參考下
    2023-08-08
  • pytorch中Tensor.to(device)和model.to(device)的區(qū)別及說明

    pytorch中Tensor.to(device)和model.to(device)的區(qū)別及說明

    這篇文章主要介紹了pytorch中Tensor.to(device)和model.to(device)的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 超詳細(xì)講解python正則表達(dá)式

    超詳細(xì)講解python正則表達(dá)式

    這篇文章主要介紹了python正則表達(dá)式,利用正則表達(dá)式實現(xiàn)文本的查找和替換功能會相對于比較簡單,效率也會更高。感興趣的小伙伴一起來學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • Python3 實現(xiàn)將bytes圖片轉(zhuǎn)jpg格式

    Python3 實現(xiàn)將bytes圖片轉(zhuǎn)jpg格式

    這篇文章主要介紹了Python3 實現(xiàn)將bytes圖片轉(zhuǎn)jpg格式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 詳解pytest中runtestprotocol方法的實現(xiàn)

    詳解pytest中runtestprotocol方法的實現(xiàn)

    runtestprotocol 是 pytest 執(zhí)行測試流程中的一個核心函數(shù),它主要負(fù)責(zé)調(diào)用測試函數(shù)的“setup”、“call”和“teardown”鉤子函數(shù),并生成對應(yīng)的測試報告,本文將深入探究pytest中runtestprotocol方法的實現(xiàn),需要的朋友可以參考下
    2023-10-10

最新評論

四子王旗| 金沙县| 镶黄旗| 常山县| 南昌市| 桐庐县| 扎鲁特旗| 中西区| 闽清县| 南皮县| 平泉县| 宜都市| 星子县| 拉孜县| 密山市| 冕宁县| 酉阳| 平邑县| 永吉县| 澄城县| 磴口县| 成安县| 信丰县| 湘潭市| 枣强县| 姜堰市| 灵川县| 大同县| 正镶白旗| 资兴市| 涟水县| 吉首市| 泾川县| 屏东市| 扶余县| 洞头县| 哈尔滨市| 招远市| 天等县| 安仁县| 和硕县|