AI với Python - Trò chơi

Trò chơi được chơi với một chiến lược. Mỗi người chơi hoặc đội sẽ đưa ra chiến lược trước khi bắt đầu trò chơi và họ phải thay đổi hoặc xây dựng chiến lược mới tùy theo (các) tình huống hiện tại trong trò chơi.

Thuật toán tìm kiếm

Bạn sẽ phải xem xét trò chơi máy tính cũng với chiến lược tương tự như trên. Lưu ý rằng Thuật toán tìm kiếm là thuật toán tìm ra chiến lược trong trò chơi máy tính.

Làm thế nào nó hoạt động

Mục tiêu của các thuật toán tìm kiếm là tìm ra tập hợp các nước đi tối ưu để chúng có thể đến đích cuối cùng và giành chiến thắng. Các thuật toán này sử dụng tập hợp các điều kiện chiến thắng, khác nhau cho mỗi trò chơi, để tìm ra nước đi tốt nhất.

Hình dung một trò chơi máy tính như một cái cây. Chúng ta biết rằng cây có các nút. Bắt đầu từ gốc, chúng ta có thể đi đến nút chiến thắng cuối cùng, nhưng với những nước đi tối ưu. Đó là công việc của các thuật toán tìm kiếm. Mỗi nút trong cây như vậy đại diện cho một trạng thái trong tương lai. Các thuật toán tìm kiếm tìm kiếm thông qua cây này để đưa ra quyết định ở mỗi bước hoặc nút của trò chơi.

Tìm kiếm kết hợp

Nhược điểm chính của việc sử dụng các thuật toán tìm kiếm là chúng có bản chất là toàn diện, đó là lý do tại sao chúng khám phá toàn bộ không gian tìm kiếm để tìm ra giải pháp dẫn đến lãng phí tài nguyên. Sẽ phức tạp hơn nếu các thuật toán này cần tìm kiếm toàn bộ không gian tìm kiếm để tìm ra giải pháp cuối cùng.

Để loại bỏ loại vấn đề như vậy, chúng ta có thể sử dụng tìm kiếm tổ hợp sử dụng phương pháp khám phá không gian tìm kiếm và giảm kích thước của nó bằng cách loại bỏ các chuyển động sai có thể xảy ra. Do đó, các thuật toán như vậy có thể tiết kiệm tài nguyên. Một số thuật toán sử dụng heuristic để tìm kiếm không gian và tiết kiệm tài nguyên được thảo luận ở đây -

Thuật toán Minimax

Đây là chiến lược được sử dụng bởi tìm kiếm tổ hợp sử dụng phương pháp heuristic để tăng tốc chiến lược tìm kiếm. Khái niệm chiến lược Minimax có thể được hiểu với ví dụ về hai trò chơi người chơi, trong đó mỗi người chơi cố gắng dự đoán động thái tiếp theo của đối thủ và cố gắng giảm thiểu chức năng đó. Ngoài ra, để giành chiến thắng, người chơi luôn cố gắng phát huy tối đa chức năng của bản thân dựa trên tình hình hiện tại.

Heuristic đóng một vai trò quan trọng trong các loại chiến lược như Minimax. Mỗi nút của cây sẽ có một hàm heuristic được liên kết với nó. Dựa trên kinh nghiệm đó, người ta sẽ đưa ra quyết định di chuyển về phía nút có lợi nhất cho họ.

Alpha-Beta Pruning

Một vấn đề lớn với thuật toán Minimax là nó có thể khám phá những phần không liên quan của cây, dẫn đến sự lãng phí tài nguyên. Do đó phải có một chiến lược để quyết định phần nào của cây có liên quan và phần nào không liên quan và để phần không liên quan chưa được khám phá. Cắt tỉa Alpha-Beta là một trong những loại chiến lược như vậy.

Mục tiêu chính của thuật toán cắt tỉa Alpha-Beta là tránh việc tìm kiếm những phần của cây mà không có bất kỳ giải pháp nào. Khái niệm chính của việc cắt tỉa Alpha-Beta là sử dụng hai giới hạn có tênAlpha, giới hạn dưới tối đa, và Beta, giới hạn trên tối thiểu. Hai tham số này là các giá trị hạn chế tập hợp các giải pháp khả thi. Nó so sánh giá trị của nút hiện tại với giá trị của các tham số alpha và beta, để nó có thể di chuyển đến phần của cây có lời giải và loại bỏ phần còn lại.

Thuật toán Negamax

Thuật toán này không khác với thuật toán Minimax, nhưng nó có cách triển khai thanh lịch hơn. Nhược điểm chính của việc sử dụng thuật toán Minimax là chúng ta cần xác định hai hàm heuristic khác nhau. Mối liên hệ giữa những khám phá này là ở chỗ, trạng thái của trò chơi càng tốt cho một người chơi, thì người chơi kia càng tệ hơn. Trong thuật toán Negamax, công việc giống nhau của hai hàm heuristic được thực hiện với sự trợ giúp của một hàm heuristic duy nhất.

Xây dựng Bots để chơi trò chơi

Để xây dựng bot để chơi hai trò chơi người chơi trong AI, chúng ta cần cài đặt easyAIthư viện. Nó là một khung trí tuệ nhân tạo cung cấp tất cả các chức năng để xây dựng trò chơi hai người chơi. Bạn có thể tải xuống với sự trợ giúp của lệnh sau:

pip install easyAI

Bot để chơi lần cuối cùng đứng

Trong trò chơi này, sẽ có một đống tiền xu. Mỗi người chơi phải lấy một số xu từ đống đó. Mục tiêu của trò chơi là tránh lấy đồng xu cuối cùng trong đống. Chúng tôi sẽ sử dụng lớp họcLastCoinStanding kế thừa từ TwoPlayersGame lớp của easyAIthư viện. Đoạn mã sau hiển thị mã Python cho trò chơi này:

Nhập các gói bắt buộc như được hiển thị -

from easyAI import TwoPlayersGame, id_solve, Human_Player, AI_Player
from easyAI.AI import TT

Bây giờ, kế thừa lớp từ TwoPlayerGame lớp để xử lý tất cả các hoạt động của trò chơi -

class LastCoin_game(TwoPlayersGame):
   def __init__(self, players):

Bây giờ, xác định người chơi và người chơi sẽ bắt đầu trò chơi.

self.players = players
self.nplayer = 1

Bây giờ, xác định số lượng xu trong trò chơi, ở đây chúng tôi đang sử dụng 15 đồng xu cho trò chơi.

self.num_coins = 15

Xác định số xu tối đa mà người chơi có thể nhận được trong một nước đi.

self.max_coins = 4

Bây giờ có một số điều nhất định cần xác định như được hiển thị trong đoạn mã sau. Xác định các bước di chuyển có thể.

def possible_moves(self):
   return [str(a) for a in range(1, self.max_coins + 1)]

Xác định việc loại bỏ các đồng tiền

def make_move(self, move):
   self.num_coins -= int(move)

Xác định ai đã lấy đồng xu cuối cùng.

def win_game(self):
   return self.num_coins <= 0

Xác định thời điểm dừng trò chơi, đó là khi ai đó thắng.

def is_over(self):
   return self.win()

Xác định cách tính điểm.

def score(self):
   return 100 if self.win_game() else 0

Xác định số xu còn lại trong đống.

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

Giải quyết trò chơi với khối mã sau:

r, d, m = id_solve(LastCoin_game,
   range(2, 20), win_score=100, tt=tt)
print(r, d, m)

Quyết định ai sẽ bắt đầu trò chơi

game = LastCoin_game([AI_Player(tt), Human_Player()])
game.play()

Bạn có thể tìm thấy kết quả sau và cách chơi đơn giản của trò chơi này -

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

Một Bot để chơi Tic Tac Toe

Tic-Tac-Toe rất quen thuộc và là một trong những trò chơi được nhiều người yêu thích. Hãy để chúng tôi tạo trò chơi này bằng cách sử dụngeasyAIthư viện bằng Python. Đoạn mã sau là mã Python của trò chơi này:

Nhập các gói như được hiển thị -

from easyAI import TwoPlayersGame, AI_Player, Negamax
from easyAI.Player import Human_Player

Kế thừa lớp từ TwoPlayerGame lớp để xử lý tất cả các hoạt động của trò chơi -

class TicTacToe_game(TwoPlayersGame):
   def __init__(self, players):

Bây giờ, xác định người chơi và người chơi sẽ bắt đầu trò chơi -

self.players = players
self.nplayer = 1

Xác định loại bảng -

self.board = [0] * 9

Bây giờ có một số điều nhất định cần xác định như sau:

Xác định các bước di chuyển có thể

def possible_moves(self):
   return [x + 1 for x, y in enumerate(self.board) if y == 0]

Xác định bước di chuyển của một người chơi -

def make_move(self, move):
   self.board[int(move) - 1] = self.nplayer

Để tăng cường AI, hãy xác định thời điểm người chơi di chuyển -

def umake_move(self, move):
   self.board[int(move) - 1] = 0

Xác định điều kiện thua mà đối thủ có ba người trên một hàng

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])

Xác định kiểm tra kết thúc trò chơi

def is_over(self):
   return (self.possible_moves() == []) or self.condition_for_lose()

Hiển thị vị trí hiện tại của người chơi trong trò chơi

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)]))

Tính toán điểm số.

def scoring(self):
   return -100 if self.condition_for_lose() else 0

Xác định phương pháp chính để xác định thuật toán và bắt đầu trò chơi -

if __name__ == "__main__":
   algo = Negamax(7)
   TicTacToe_game([Human_Player(), AI_Player(algo)]).play()

Bạn có thể xem kết quả sau và cách chơi đơn giản của trò chơi này -

. . .
. . .
. . .
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 .