Tôi giả sử bạn đã biết về khái niệm Min-Max, cây và cắt tỉa, heuristic và những điều cơ bản khác và những gì tôi viết ở đây chỉ là một số chi tiết có thể bị đánh giá thấp.
Tôi với công ty một người bạn đã viết động cơ cờ vua của chúng ta đôi khi trước đây. Tôi chia sẻ một số vấn đề và ý tưởng chúng tôi đã có và tôi hy vọng bạn thấy chúng hữu ích.
Vì cả hai chúng tôi đều là lập trình viên java, ngôn ngữ của chúng tôi đã biến chúng tôi thành java và chúng tôi bắt đầu với cách tiếp cận hướng đối tượng. Các mảnh là các đối tượng, bảng là đối tượng, các tập tin và cấp bậc (hàng và cột trong tài liệu cờ vua) là các đối tượng. Và điều này đã sai. Chi phí rất lớn và chương trình đang vật lộn để đi xa hơn 2 lần di chuyển (4 ply) trong cây tìm kiếm.
Vì vậy, với một số tìm kiếm, chúng tôi đã kết thúc với một ý tưởng tuyệt vời (không phải của chúng tôi!): Đại diện cho các mảnh và bảng dưới dạng số nguyên dài (64 bit). Điều này có ý nghĩa bởi vì một bàn cờ có 64 ô vuông. Phần còn lại là các thao tác bit khôn ngoan (chạy rất gần với cpu = cực kỳ nhanh). Ví dụ, hãy xem xét một số nguyên 64 bit nhị phân trong đó các số nguyên đang trình bày các ô vuông trên bảng mà mảnh của bạn có thể tấn công. Bây giờ nếu bạn thực hiện một "VÀ" logic giữa hai số như thế này, kết quả khác không nói rằng bạn có một hình vuông với những kẻ tấn công. Có một số cách để trình bày bàn cờ và quân cờ, Vì vậy:
1 - Quyết định về bài thuyết trình của bạn
Sau đó, bạn cần và mở cơ sở dữ liệu. Cờ mở bằng cách nào đó đã được giải quyết, kiến rất nên có và mở sách. Trong trường hợp này, bạn có nhiều thời gian thêm trong các trò chơi blitz.
2 - Tìm cho mình một cuốn sách mở đầu.
Chúng tôi đã làm những điều này, nhưng chúng tôi vẫn còn lâu mới tốt:
3 - Một động cơ cờ tốt sẽ có thể nhìn thấy 6 nước (12 ply) phía trước.
Vì vậy, những gì chúng tôi đã làm sau đó, là sử dụng thời gian chết (nếu đó là một con người so với động cơ máy tính).
4 - Sử dụng thời gian khi đối thủ đang suy nghĩ để tạo ra một số cấp độ của cây của bạn.
Và chúng tôi vẫn còn cách xa 12 đồng đội. Bằng cách nghiên cứu nhiều hơn, chúng tôi khám phá một số thủ thuật! Ví dụ, nó được đề xuất bỏ qua một lớp cây và bắt đầu từ lớp tiếp theo (như không có đối thủ). Ý tưởng là nếu một động thái cực kỳ ngu ngốc, vậy thì tại sao phải lãng phí thời gian và xem đối thủ phản ứng với động thái đó là gì. Tuy nhiên, một động cơ tốt sẽ có thể phân biệt giữa di chuyển ngu ngốc và hy sinh nữ hoàng thiên tài.
5 - Tìm hiểu các thủ thuật lập trình cho vấn đề cụ thể này (cờ vua).
Tôi và bạn tôi, trong tình trạng này, vẫn còn tệ: / Những gì chúng tôi có thể làm - và chúng tôi đã làm một phần - là để lưu các vị trí được tính toán. Nếu bạn tính toán một vị trí, sau đó lưu nó cho tương lai! Điều tương tự cũng xảy ra với các vòng lặp trong cây tìm kiếm. Vấn đề là lưu / truy xuất hiệu quả:
6 - Lưu dữ liệu bạn tạo ... Hiệu quả!
và cuối cùng:
7 - Mã với tối ưu hóa tối đa.
Vấn đề này cực kỳ tốn kém cả về thời gian và bộ nhớ CPU. Điều rất quan trọng để viết mã của bạn rất hiệu quả. Hãy nhớ rằng chúng ta đang nói về yếu tố nhánh 35. Điều này có nghĩa là "nếu" ở đâu đó trong heuristic của bạn, có thể biến thành 3.3792205e+18
"nếu" ở đâu đó sâu trong cây tìm kiếm của bạn.
Lập trình cờ vua là một thử thách rất thú vị và đó là lúc bạn có thể đưa khả năng lập trình của mình vào một bài kiểm tra nghiêm túc. Có một vài điểm nữa mà tôi có thể đề xuất nhưng tôi chắc chắn bạn sẽ tự mình khám phá chúng. Còn nhiều điểm nữa mà tôi không biết nhưng bạn có thể tìm thấy chúng trên internet!
Chúc may mắn và vui vẻ!
ps Tôi không biết rõ về javascript nhưng có điều gì đó cho tôi biết dựa trên độ khó của vấn đề, có thể, xem xét tất cả những gì C ++ có thể cung cấp, sẽ tốt hơn nếu bỏ javascript và làm điều đó trong C ++.