檔案建立日期: 2019/12/22
最後修訂日期: None
相關軟體資訊:
Win 10 | Python 3.7.2 | easyAI 1.0.0.4 |
參考檔案: AI with Python Tutorial
說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.
標題: 人工智慧 (10) 遊戲
- 搜尋演算法 - 找到最佳移動方式,以便它們可以到達最終目的地並獲勝。這些演算法使用獲勝條件集來找出最佳樹節點的舉動。
- 組合搜尋演算法 - 使用啟發式方法探索搜尋空間,並透過消除可能的錯誤舉動來減小搜尋空間的大小。
- 極小極大演算法 - 預測極小化對手, 並且極大化自身的策略概念
- Alpha-Beta修剪 - 一種策略來確定樹的哪一部分是相關的,哪一部分是不相關的,並且使不相關的部分不被探索。
- Negamax演算法 - 兩個啟發式函式的相同工作是在單個啟發式函式的幫助下完成的。
例 1. 玩最後一枚硬幣的機器人
# -----------------------------------------------------------------------------
# Building Bots to Play Games - A Bot to Play Last Coin Standing
# -----------------------------------------------------------------------------
from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player
from easyAI.AI import TT
class LastCoin_game(TwoPlayersGame): # 新遊戲是兩個人玩的
# 1 ~ 4 項函式必須定義, 名稱不能改
# 5 ~ 9 是可選項
# self.player : 現在玩家
# self.opponent : 對手
# self.nplayer: 現在玩家的號 1 或 2
# self.nopponent: 對手的號 1 或 2
# self.nmove: 目前已經下了幾手
def __init__(self, players): # 1. 初始化遊戲
self.players = players # players是一個兩個玩家的list, 必要動作 !!
self.nplayer = 1 # 誰先始玩, 1 或 2, 必要動作 !!
self.num_coins = 15 # 硬幣數量15個
self.max_coins = 4 # 最多移除硬幣數量4個
def possible_moves(self): # 2. 所有可能的移除數量
return [str(a) for a in range(1, self.max_coins + 1)]
def make_move(self, move): # 3. 移除
self.num_coins -= int(move)
def is_over(self): # 4. 確認遊戲結束
return self.win_game()
def win_game(self): # 小於等於零的獲勝
return self.num_coins <= 0
def show(self): # 5. 顯示
print(self.num_coins, 'coins left in the pile') # 堆裡剩下的硬幣
def scoring(self): # 6. 計分
return 100 if self.win_game() else 0 # 如果獲勝, 得100分
def unmake_move(self, move): # 7. 悔棋
pass
'''
def ttentry(self): # 8. 遊戲說明
pass
def ttrestore(self, entry): # 9. 恢復遊戲
pass
'''
tt = TT() # 快取已進行的動作
LastCoin_game.ttentry = lambda self: self.num_coins # 8. 遊戲說明
# 使用迭代加深來解決遊戲, 用多次Negamax演算法探索遊戲, 直到肯定會贏還是輸
r, d, m = id_solve(LastCoin_game, range(2, 20), win_score=100, tt=tt)
game = LastCoin_game([AI_Player(tt), Human_Player()]) # 兩固玩家
game.play() # 遊戲開始
例 2. 玩井字遊戲的機器人 (說明大致如例 1)
# -----------------------------------------------------------------------------
# Building Bots to Play Games - A Bot to Play Tic Tac Toe
# -----------------------------------------------------------------------------
from easyAI import TwoPlayersGame, AI_Player, Negamax
from easyAI.Player import Human_Player
class TicTacToe_game(TwoPlayersGame):
def __init__(self, players):
self.players = players
self.nplayer = 1
self.board = [0] * 9
def possible_moves(self):
return [x + 1 for x, y in enumerate(self.board) if y == 0]
def make_move(self, move):
self.board[int(move) - 1] = self.nplayer
def umake_move(self, move):
self.board[int(move) - 1] = 0
def condition_for_lose(self):
possible_combinations = [[1,2,3], [4,5,6], [7,8,9], [1,4,7],
[2,5,8], [3,6,9], [1,5,9], [3,5,7]]
return any([all([(self.board[z-1] == self.nopponent)
for z in combination])
for combination in possible_combinations])
def is_over(self):
return (self.possible_moves() == []) or self.condition_for_lose()
def show(self):
print('\n'+'\n'.join([' '.join([['.', 'O', 'X'][self.board[3*j + i]]
for i in range(3)]) for j in range(3)]))
def scoring(self):
return -100 if self.condition_for_lose() else 0
algo = Negamax(7)
TicTacToe_game([Human_Player(), AI_Player(algo)]).play()
本作品採用《CC 協議》,轉載必須註明作者和本文連結