Tôi đang tạo một triển khai MiniMax đơn giản bằng ngôn ngữ lập trình chức năng Elixir. Bởi vì có nhiều trò chơi kiến thức hoàn hảo (tic tac toe, kết nối bốn, cờ đam, cờ vua, v.v.), việc triển khai này có thể là một khuôn khổ để tạo AI trò chơi cho bất kỳ trò chơi nào trong số này.
Tuy nhiên, một vấn đề tôi gặp phải là làm thế nào để lưu trữ đúng trạng thái trò chơi bằng ngôn ngữ chức năng. Các trò chơi này chủ yếu xử lý các bảng trò chơi hai chiều, trong đó các hoạt động sau thường xuyên xảy ra:
- Đọc nội dung của một vị trí bảng cụ thể
- Cập nhật nội dung của một vị trí bảng cụ thể (khi trả lại khả năng di chuyển mới)
- Xem xét nội dung của một hoặc nhiều vị trí được kết nối với vị trí hiện tại (nghĩa là các vị trí ngang, dọc hoặc chéo tiếp theo hoặc trước đó)
- Xem xét nội dung của nhiều địa điểm được kết nối theo bất kỳ hướng nào.
- Xem xét nội dung của toàn bộ tập tin, cấp bậc và đường chéo.
- Xoay hoặc phản chiếu bảng (để kiểm tra các đối xứng cung cấp kết quả giống như một cái gì đó đã được tính toán).
Hầu hết các ngôn ngữ chức năng sử dụng Danh sách liên kết và Tuples làm các khối xây dựng cơ bản của cấu trúc dữ liệu đa yếu tố. Tuy nhiên, những thứ này có vẻ rất tệ được thực hiện cho công việc:
- Danh sách liên kết có thời gian tra cứu O (n) (tuyến tính). Ngoài ra, vì chúng tôi không thể 'quét và cập nhật bảng' trong một lần quét trên bảng, sử dụng danh sách có vẻ rất không thực tế.
- Tuples có thời gian tra cứu O (1) (không đổi). Tuy nhiên, việc biểu diễn bảng dưới dạng một bộ kích thước cố định làm cho việc lặp lại các cấp bậc, tệp, đường chéo hoặc các loại hình vuông liên tiếp khác rất khó khăn. Ngoài ra, cả Elixir và Haskell (là hai ngôn ngữ chức năng mà tôi biết) đều thiếu cú pháp để đọc phần tử thứ n của một tuple. Điều này sẽ làm cho không thể viết một giải pháp động sẽ hoạt động cho các bảng có kích thước tùy ý.
Elixir có cấu trúc dữ liệu Bản đồ tích hợp (Và Haskell có Data.Map
) cho phép O (log n) (logarit) truy cập vào các phần tử. Ngay bây giờ tôi sử dụng bản đồ, với các x, y
bộ dữ liệu đại diện cho vị trí là các phím.
Điều này 'hoạt động' nhưng cảm thấy sai khi lạm dụng bản đồ theo cách này, mặc dù tôi không biết chính xác tại sao. Tôi đang tìm kiếm một cách tốt hơn để lưu trữ một bảng trò chơi hai chiều bằng ngôn ngữ lập trình chức năng.