人工智慧 (10) 遊戲

Jason990420發表於2019-12-22

檔案建立日期: 2019/12/22
最後修訂日期: None
相關軟體資訊:

Win 10 Python 3.7.2 easyAI 1.0.0.4

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (10) 遊戲

  1. 搜尋演算法 - 找到最佳移動方式,以便它們可以到達最終目的地並獲勝。這些演算法使用獲勝條件集來找出最佳樹節點的舉動。
  2. 組合搜尋演算法 - 使用啟發式方法探索搜尋空間,並透過消除可能的錯誤舉動來減小搜尋空間的大小。
  3. 極小極大演算法 - 預測極小化對手, 並且極大化自身的策略概念
  4. Alpha-Beta修剪 - 一種策略來確定樹的哪一部分是相關的,哪一部分是不相關的,並且使不相關的部分不被探索。
  5. 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: 現在玩家的號 12
    # self.nopponent: 對手的號 12
    # self.nmove: 目前已經下了幾手

    def __init__(self, players):                        # 1. 初始化遊戲

        self.players = players  # players是一個兩個玩家的list, 必要動作 !!
        self.nplayer = 1        # 誰先始玩, 12,  必要動作 !!
        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 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章