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 .