遊戲是有策略的。每個玩家或團隊在開始遊戲前都會制定一個策略,他們必須根據遊戲中的當前情況來改變或建立新的策略。
Search Algorithms
你將不得不考慮電腦遊戲也與上述相同的策略。注意,搜索算法是在電腦遊戲中找出策略的算法。
How it works
搜索算法的目標是找到一組最優的移動,使它們能夠到達最終目的地並獲勝。這些算法使用獲勝的條件集,每個遊戲都不同,以找到最佳的移動。
把電腦遊戲想像成樹。我們知道樹有節點。從根開始,我們可以到達最終的制勝節點,但要有最佳的移動。這是搜索算法的工作。樹中的每個節點都代表一個未來狀態。搜索算法通過這棵樹在遊戲的每個步驟或節點上進行搜索以做出決策。
Combinational Search
使用搜索算法的主要缺點是它們在本質上是窮盡的,這就是爲什麼它們會探索整個搜索空間以找到導致資源浪費的解決方案。如果這些算法需要搜索整個搜索空間以找到最終的解決方案,則會更加麻煩。
爲了消除這類問題,我們可以使用組合搜索,它使用啟發式來探索搜索空間,並通過消除可能出現的錯誤移動來減小搜索空間的大小。因此,這樣的算法可以節省資源。本文討論了一些使用啟發式搜索空間和節省資源的算法;
Minimax Algorithm
正是組合搜索所使用的策略,使用啟發式來加速搜索策略。以兩人博弈爲例,可以理解極小極大策略的概念,即每個博弈者試圖預測對手的下一步行動,並試圖最小化該函數。同時,爲了取勝,玩家總是根據當前的情況儘量發揮自己的功能。
啟發式在諸如極大極小等策略中起著重要的作用。樹的每個節點都有一個與之相關聯的啟發式函數。基於這種啟發式,它將決定向最有利於它們的節點移動。
Alpha-Beta Pruning
Minimax算法的一個主要問題是它可以挖掘樹中那些不相關的部分,從而導致資源的浪費。因此,必須有一個策略來決定樹的哪一部分是相關的,哪一部分是不相關的,並且讓不相關的部分不被探索。α-β剪枝就是這樣一種策略。
Alpha-Beta剪枝算法的主要目標是避免搜索樹中沒有任何解的部分。Alpha-Beta剪枝的主要概念是使用兩個界限,即最大下界Alpha,最小上界Beta。這兩個參數是限制可能解集的值。它將當前節點的值與alpha和beta參數的值進行比較,以便可以移動到樹中具有解決方案的部分,並丟棄其餘部分。
Negamax Algorithm
此算法與Minimax算法沒有區別,但它有一個更優雅的實現。使用Minimax算法的主要缺點是需要定義兩個不同的啟發式函數。這些啓發之間的聯繫是,一個遊戲的狀態對一個玩家越好,對另一個玩家就越差。在Negamax算法中,兩個啟發式函數的相同工作是在單個啟發式函數的幫助下完成的。
Building Bots to Play Games
要在人工智慧中構建兩人遊戲的機器人,我們需要安裝easyAI庫。它是一個人工智慧框架,提供了所有的功能,建立兩人遊戲。您可以使用以下命令下載它−
pip install easyAI
A Bot to Play Last Coin Standing
在這個遊戲中,會有一堆硬幣。每個玩家必須從那堆硬幣中取出一些硬幣。這個遊戲的目的是避免拿走最後一枚硬幣。我們將使用從easyAI庫的TwoPlayersGame類繼承的類lastcoinstranding。下面的代碼顯示了這個遊戲的Python代碼−
如圖所示導入所需的包;
from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player from easyAI.AI import TT
現在,從TwoPlayerGame類繼承該類來處理遊戲的所有操作−
class LastCoin_game(TwoPlayersGame): def __init__(self, players):
現在,定義玩家和將要開始遊戲的玩家。
self.players = players self.nplayer = 1
現在,定義遊戲中的硬幣數量,這裡我們使用15個硬幣。
self.num_coins = 15
定義玩家在一次移動中可以獲得的最大硬幣數量。
self.max_coins = 4
現在有一些東西需要定義,如下代碼所示。定義可能的移動。
def possible_moves(self): return [str(a) for a in range(1, self.max_coins + 1)]
定義移除硬幣
def make_move(self, move): self.num_coins -= int(move)
確定誰拿走了最後一枚硬幣。
def win_game(self): return self.num_coins <= 0
定義何時停止遊戲,即某人獲勝。
def is_over(self): return self.win()
定義如何計算分數。
def score(self): return 100 if self.win_game() else 0
定義堆中剩餘硬幣的數量。
def show(self): print(self.num_coins, 'coins left in the pile') if __name__ == "__main__": tt = TT() LastCoin_game.ttentry = lambda self: self.num_coins
用下面的代碼塊−
r, d, m = id_solve(LastCoin_game, range(2, 20), win_score=100, tt=tt) print(r, d, m)
決定誰開始比賽
game = LastCoin_game([AI_Player(tt), Human_Player()]) game.play()
您可以找到下面的輸出和這個遊戲的一個簡單遊戲&負;
d:2, a:0, m:1 d:3, a:0, m:1 d:4, a:0, m:1 d:5, a:0, m:1 d:6, a:100, m:4 1 6 4 15 coins left in the pile Move #1: player 1 plays 4 : 11 coins left in the pile Player 2 what do you play ? 2 Move #2: player 2 plays 2 : 9 coins left in the pile Move #3: player 1 plays 3 : 6 coins left in the pile Player 2 what do you play ? 1 Move #4: player 2 plays 1 : 5 coins left in the pile Move #5: player 1 plays 4 : 1 coins left in the pile Player 2 what do you play ? 1 Move #6: player 2 plays 1 : 0 coins left in the pile
A Bot to Play Tic Tac Toe
Tic Tac Toe是一款非常熟悉的遊戲,也是最受歡迎的遊戲之一。讓我們使用Python中的easyAI庫來創建這個遊戲。下面的代碼是這個遊戲的Python代碼;
如圖所示導入包;
from easyAI import TwoPlayersGame, AI_Player, Negamax from easyAI.Player import Human_Player
從TwoPlayerGame類繼承該類以處理遊戲的所有操作−
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
定義算法的主要方法並開始遊戲−
if __name__ == "__main__": algo = Negamax(7) TicTacToe_game([Human_Player(), AI_Player(algo)]).play()
您可以看到下面的輸出和這個遊戲的一個簡單遊戲&負;