Python ile AI - Oyun
Oyunlar bir strateji ile oynanır. Her oyuncu veya takım oyuna başlamadan önce bir strateji yapar ve oyundaki mevcut durum (lar) a göre yeni bir strateji geliştirmeleri veya değiştirmeleri gerekir.
Arama Algoritmaları
Bilgisayar oyunlarını da yukarıdaki stratejinin aynısıyla düşünmeniz gerekecek. Bilgisayar oyunlarındaki stratejiyi belirleyenlerin Arama Algoritmaları olduğunu unutmayın.
Nasıl çalışır
Arama algoritmalarının amacı, nihai hedefe ulaşıp kazanabilmeleri için en uygun hamle setini bulmaktır. Bu algoritmalar, en iyi hamleleri bulmak için her oyun için farklı olan kazanan koşullar kümesini kullanır.
Bir bilgisayar oyununu ağaç olarak görselleştirin. Ağacın düğümleri olduğunu biliyoruz. Kökten başlayarak, son kazanan düğüme gelebiliriz, ancak en uygun hareketlerle. Bu, arama algoritmalarının işidir. Böyle bir ağaçtaki her düğüm gelecekteki bir durumu temsil eder. Arama algoritmaları, oyunun her adımında veya düğümünde kararlar almak için bu ağaçta arama yapar.
Kombinasyonel Arama
Arama algoritmalarını kullanmanın en büyük dezavantajı, doğaları gereği kapsamlı olmalarıdır, bu nedenle kaynak israfına yol açan çözümü bulmak için tüm arama alanını keşfederler. Bu algoritmaların nihai çözümü bulmak için tüm arama alanını araştırması gerekmesi daha zahmetli olacaktır.
Bu tür bir sorunu ortadan kaldırmak için, arama alanını keşfetmek için buluşsal yöntemi kullanan ve olası yanlış hareketleri ortadan kaldırarak boyutunu küçülten kombinasyonel aramayı kullanabiliriz. Dolayısıyla, bu tür algoritmalar kaynakları kurtarabilir. Alanı aramak ve kaynakları kurtarmak için buluşsal yöntem kullanan algoritmalardan bazıları burada tartışılmaktadır -
Minimax Algoritması
Arama stratejisini hızlandırmak için buluşsal yöntem kullanan kombinasyonel arama tarafından kullanılan stratejidir. Minimax stratejisi kavramı, her oyuncunun rakibin bir sonraki hamlesini tahmin etmeye çalıştığı ve bu işlevi en aza indirmeye çalıştığı iki oyunculu oyun örneğiyle anlaşılabilir. Ayrıca, kazanmak için oyuncu her zaman mevcut duruma göre kendi işlevini en üst düzeye çıkarmaya çalışır.
Sezgisel, Minimax gibi bu tür stratejilerde önemli bir rol oynar. Ağacın her düğümü, kendisiyle ilişkili bir sezgisel işleve sahip olacaktır. Bu buluşsal yönteme dayanarak, kendilerine en çok fayda sağlayacak düğüme doğru bir hareket etme kararını alacaktır.
Alfa Beta Budama
Minimax algoritmasının önemli bir sorunu, ağacın alakasız kısımlarını keşfedebilmesi ve kaynak israfına yol açmasıdır. Bu nedenle, ağacın hangi kısmının alakalı ve hangisinin ilgisiz olduğuna karar verecek ve ilgisiz kısmı keşfedilmemiş bırakacak bir strateji olmalıdır. Alfa-Beta budama bu tür bir stratejidir.
Alfa-Beta budama algoritmasının temel amacı, ağacın herhangi bir çözümü olmayan kısımlarını aramaktan kaçınmaktır. Alfa-Beta budamanın ana konsepti, adı verilen iki sınır kullanmaktır.Alpha, maksimum alt sınır ve Beta, minimum üst sınır. Bu iki parametre, olası çözüm kümesini sınırlayan değerlerdir. Geçerli düğümün değerini alfa ve beta parametrelerinin değeriyle karşılaştırır, böylece ağacın çözüme sahip olan kısmına hareket edebilir ve geri kalanını atabilir.
Negamax Algoritması
Bu algoritma Minimax algoritmasından farklı değildir, ancak daha zarif bir uygulaması vardır. Minimax algoritmasını kullanmanın temel dezavantajı, iki farklı sezgisel işlevi tanımlamamız gerekmesidir. Bu buluşsal yöntemler arasındaki bağlantı, bir oyunun durumu bir oyuncu için ne kadar iyiyse, diğer oyuncu için o kadar kötüdür. Negamax algoritmasında, iki sezgisel fonksiyonun aynı çalışması tek bir sezgisel fonksiyon yardımıyla yapılır.
Oyun Oynamak İçin Botlar Oluşturma
AI'da iki oyunculu oyunlar oynayacak botlar oluşturmak için, easyAIkütüphane. İki oyunculu oyunlar oluşturmak için tüm işlevselliği sağlayan bir yapay zeka çerçevesidir. Aşağıdaki komutun yardımıyla indirebilirsiniz -
pip install easyAI
Kalan Son Jeton Oynamak İçin Bir Bot
Bu oyunda bir yığın para olacaktı. Her oyuncunun o desteden bir miktar jeton alması gerekir. Oyunun amacı yığındaki son parayı almaktan kaçınmaktır. Sınıfı kullanacağızLastCoinStanding -dan miras TwoPlayersGame sınıfı easyAIkütüphane. Aşağıdaki kod, bu oyun için Python kodunu gösterir -
Gerekli paketleri gösterildiği gibi içe aktarın -
from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player
from easyAI.AI import TT
Şimdi, sınıfı, TwoPlayerGame oyunun tüm işlemlerini gerçekleştirecek sınıf -
class LastCoin_game(TwoPlayersGame):
def __init__(self, players):
Şimdi oyuna başlayacak oyuncuları ve oyuncuyu tanımlayın.
self.players = players
self.nplayer = 1
Şimdi oyundaki jeton sayısını tanımlayın, burada oyun için 15 jeton kullanıyoruz.
self.num_coins = 15
Bir oyuncunun bir hamle sırasında alabileceği maksimum jeton sayısını tanımlayın.
self.max_coins = 4
Şimdi, aşağıdaki kodda gösterildiği gibi tanımlanması gereken bazı şeyler var. Olası hareketleri tanımlayın.
def possible_moves(self):
return [str(a) for a in range(1, self.max_coins + 1)]
Madeni paraların kaldırılmasını tanımlayın
def make_move(self, move):
self.num_coins -= int(move)
Son parayı kimin aldığını tanımlayın.
def win_game(self):
return self.num_coins <= 0
Oyunu ne zaman durduracağınızı belirleyin, yani birisi kazanırsa.
def is_over(self):
return self.win()
Puanı nasıl hesaplayacağınızı tanımlayın.
def score(self):
return 100 if self.win_game() else 0
Yığın içinde kalan madeni para sayısını tanımlayın.
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
Oyunu aşağıdaki kod bloğu ile çözme -
r, d, m = id_solve(LastCoin_game,
range(2, 20), win_score=100, tt=tt)
print(r, d, m)
Oyuna kimin başlayacağına karar vermek
game = LastCoin_game([AI_Player(tt), Human_Player()])
game.play()
Aşağıdaki çıktıyı ve bu oyunun basit bir oyununu bulabilirsiniz -
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
Tic Tac Toe Oynamak İçin Bir Bot
Tic-Tac-Toe çok tanıdık ve en popüler oyunlardan biri. Bu oyunu kullanarak yaratalımeasyAIPython'da kütüphane. Aşağıdaki kod, bu oyunun Python kodudur -
Paketleri gösterildiği gibi içe aktarın -
from easyAI import TwoPlayersGame, AI_Player, Negamax
from easyAI.Player import Human_Player
Sınıfı, TwoPlayerGame oyunun tüm işlemlerini gerçekleştirecek sınıf -
class TicTacToe_game(TwoPlayersGame):
def __init__(self, players):
Şimdi, oyuna başlayacak oyuncuları ve oyuncuyu tanımlayın -
self.players = players
self.nplayer = 1
Kart türünü tanımlayın -
self.board = [0] * 9
Şimdi tanımlanması gereken bazı şeyler var:
Olası hareketleri tanımlayın
def possible_moves(self):
return [x + 1 for x, y in enumerate(self.board) if y == 0]
Bir oyuncunun hareketini tanımlayın -
def make_move(self, move):
self.board[int(move) - 1] = self.nplayer
Yapay zekayı artırmak için, bir oyuncunun ne zaman hamle yapacağını tanımlayın -
def umake_move(self, move):
self.board[int(move) - 1] = 0
Rakibin bir hatta üç olması durumunda kaybetme koşulunu tanımlayın
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])
Oyunun bitişi için bir kontrol tanımlayın
def is_over(self):
return (self.possible_moves() == []) or self.condition_for_lose()
Oyuncuların oyundaki mevcut konumunu göster
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)]))
Puanları hesaplayın.
def scoring(self):
return -100 if self.condition_for_lose() else 0
Algoritmayı tanımlamak ve oyunu başlatmak için ana yöntemi tanımlayın -
if __name__ == "__main__":
algo = Negamax(7)
TicTacToe_game([Human_Player(), AI_Player(algo)]).play()
Aşağıdaki çıktıyı ve bu oyunun basit bir oyununu görebilirsiniz -
. . .
. . .
. . .
Player 1 what do you play ? 1
Move #1: player 1 plays 1 :
O . .
. . .
. . .
Move #2: player 2 plays 5 :
O . .
. X .
121
. . .
Player 1 what do you play ? 3
Move #3: player 1 plays 3 :
O . O
. X .
. . .
Move #4: player 2 plays 2 :
O X O
. X .
. . .
Player 1 what do you play ? 4
Move #5: player 1 plays 4 :
O X O
O X .
. . .
Move #6: player 2 plays 8 :
O X O
O X .
. X .