2010-04-30 15 views
14

Tôi đang có một khối khổng lồ cố gắng hiểu "cây" trong khi chế tạo rô-bốt Tic-Tac-Toe. Tôi hiểu khái niệm này, nhưng tôi không thể tìm ra để thực hiện chúng.Tic-Tac-Toe AI: Làm thế nào để làm cho cây?

Ai đó có thể cho tôi xem ví dụ về cách tạo cây cho trường hợp như vậy không? Hoặc một hướng dẫn tốt về tạo cây? Tôi đoán phần khó khăn là tạo ra một phần cây. Tôi biết làm thế nào để thực hiện tạo ra một cây toàn bộ, nhưng không phải là một phần của nó.

+0

Những loại cây? Một cây Minimax? –

+0

Bất kỳ cây nào lưu trữ trạng thái cho lần di chuyển tiếp theo. Cây minimax sẽ hoạt động, tôi chỉ tìm cách xem "cây" được điền/điều hướng/etc như thế nào. Tôi không có kinh nghiệm làm việc với cây – cam

Trả lời

16

Hãy tưởng tượng rằng tại bất kỳ điểm nào trong bảng tic-tac-toe, mọi cử động có thể có là một chi nhánh. Trạng thái hiện tại của bảng là gốc. Một động thái là một nhánh. Bây giờ giả vờ (từng người một), mỗi nhánh trở thành trạng thái hiện tại. Mỗi động thái có thể trở thành một nhánh mới. Lá của cây là khi di chuyển cuối cùng được thực hiện và bảng đầy.

Lý do bạn cần có một cái cây, là khi nó được xây dựng, bạn cần phải tìm ra nhánh nào có nhiều lá nhất là các kịch bản 'WIN'. Bạn xây dựng nhánh của tất cả các kết quả có thể, cộng tổng số WINs, và sau đó thực hiện di chuyển có cơ hội kết thúc với nhiều thắng nhất.

Làm cho một cái gì đó cây như thế này:

class Node { 
public: 
    std::list<Node> m_branches; 
    BoardState m_board; 
    int m_winCount; 
} 

std::list<Node> tree; 

Bây giờ, bạn lặp qua danh sách các chi nhánh trong cây, và đối với từng chi nhánh, lặp thông qua các chi nhánh. Điều này có thể được thực hiện với chức năng đệ quy:

int recursiveTreeWalk(std::list<Node>& partialTree) 
{ 

    for each branch in tree 
     if node has no branches 
      calculate win 1/0; 
     else 
      recursiveTreeWalk(branch); 

    partialTree.m_winCount = sum of branch wins; 
} 

// initial call 
recursiveTreeWalk(tree) 

Rất giả mã.

+1

... được nói, nó không thực sự là AI vào thời điểm này, nhưng là một quyết tâm nghiêm ngặt của tất cả các kết quả có thể, và lấy rủi ro chính xác thích hợp. – Kieveli

+0

Phải, cảm ơn lời giải thích đó đã giúp, nhưng vấn đề chính tôi gặp phải là thực hiện điều này. Tôi hiểu khái niệm hoàn toàn, nhưng tạo ra cây và điều hướng nó đang làm tôi bối rối. Tôi đang tìm một số mã nguồn có thể giúp tôi, hoặc thậm chí là một hướng dẫn. Não của tôi cần xem một ví dụ trước khi tôi hiểu một khái niệm trong mã. – cam

+0

Để làm cho AI nhiều hơn như bạn có thể sử dụng độ sâu tối đa để giới hạn giao diện phía trước. Hoặc một bộ đếm thời gian để giới hạn lượng thời gian sẽ được dành cho việc nhìn về phía trước - mặc dù trên TTT, việc tính toán một cây hoàn chỉnh sẽ được thực hiện theo nano giây. –

6

Tôi không nghĩ bạn cần giữ một cái cây trong bộ nhớ. Bạn chỉ cần triển khai hàm đệ quy hoạt động như sau:

Move getBestMove(Board state, boolean myTurn) 

Sau đó, bạn chỉ cần chấp nhận cho đến khi bạn đạt đến trạng thái thắng, thua hoặc rút.

Ngăn xếp cuộc gọi sẽ theo thời gian trông giống như một cây nếu bạn vẽ nó lên giấy. Bạn nên trả lại di chuyển dẫn đến một nút mà tại đó đối thủ (chắc chắn/rất có thể) thua (mặc dù anh ấy cũng chơi bằng getBestMove)

Tuy nhiên, đối với một trạng thái không gian như tic-tac-toe, bạn chỉ đơn giản là có thể làm một cái nhìn đầy đủ với những bước di chuyển tốt nhất! :-)

+0

Tôi đoán đây là những gì tôi không hiểu. Tôi nghĩ một cấu trúc cây thực sự đã được tạo ra trong ký ức. Đây là cách tôi thực hiện bot như hiện nay, sử dụng một hàm đệ quy không có cây. – cam

1

Nếu bạn muốn tạo ra các cây trong bộ nhớ (đó là không cần thiết), có lẽ một thuật toán như sau có thể được sử dụng (pseudo-code):

GenTree(State s): 
    T <- empty tree // T is a tree of States 
    SetRoot(T, s) 

    ForEach (s' in Successors(s)): 
    AddChild(T, GenTree(s')) 

    return T 

// Call it 
GenTree(currentMove) 

nơi

Successors(s) // returns a list of successor states of s 
AddChild(p, n) // adds n to the list of p's children 
3

Bạn có thể tìm thấy bài viết từ vựng này thú vị:

Solve Tic Tac Toe with the MiniMax algorithm

Đó là trong C#, nhưng nó sẽ không có bất kỳ vấn đề để thích ứng với nó trong C + +.

Bài viết này cũng là một đọc tốt cho tôi khi tôi cố gắng thực hiện đầu tiên trò chơi Tic-Tac-Toe của tôi trong C++:

Minimax Explained

Các vấn đề liên quan