Làm cách nào để triển khai các chương trình tương tác (như trò chơi / mô phỏng) bằng lập trình logic?


20

Tôi đã nghe nói rằng lập trình logic có thể đóng vai trò thay thế cho mục đích chung cho các mô hình lập trình khác như OO hoặc lập trình chức năng. (Vì Prolog đã hoàn thành Turing, nên điều này phải như vậy!)

Tuy nhiên, tôi gặp khó khăn khi xem cách người ta sẽ triển khai một chương trình tương tác, như một trò chơi bảng điều khiển đồ họa đơn giản trong Prolog hoặc một ngôn ngữ tương tự. Bạn có các sự kiện, quy tắc có thể rút ra nhiều sự kiện hơn và các truy vấn truy xuất sự kiện. Thật dễ dàng để xem làm thế nào bạn có thể sử dụng các yếu tố cơ bản đó để tạo ra thứ gì đó giống như người giải sudoku. Nhưng còn Pac-man, hay đơn giản hơn là Pông?

XIN LƯU Ý: Tôi không tìm kiếm chi tiết cấp thấp, mà là một tổng quan về khái niệm. (Ví dụ: ở cấp độ cao, bạn sẽ xử lý I / O như thế nào? Bạn sẽ lưu trữ trạng thái trò chơi như thế nào? Bạn sẽ thực hiện một cái gì đó như "vòng lặp chính" như thế nào? )


1
Tôi thực sự thích câu hỏi của bạn - Tôi đã bị Prolog từ lâu và tự hỏi chính mình Câu hỏi tương tự và không bao giờ có thể nghĩ ra cách nào để làm điều này.
Christian Sauer

Cá nhân tôi đã chạy một khóa lập trình logic thực hiện một bản sao Frozen Bubbled trong SWI Prolog. Làm việc như một cơ duyên (sau ngày thứ mười năng suất giảm xuống vì chỉ chơi nó còn vui hơn là thêm chức năng). Liên kết trang web uni bị hỏng, nhưng tôi sẽ thử xem liệu tôi có thể cung cấp mã lại không.
Kilian Foth

2
"Vì Prolog là Turing-Complete, nên nó phải như vậy!" - Không hẳn. Prolog là Turing-perfect có nghĩa là bất kỳ hàm toán học nào trên các số tự nhiên có thể được tính bằng Máy Turing đều có thể được tính toán bằng Prolog. Nhưng nó không nói gì về các thuật toán không có chức năng toán học trên các số tự nhiên. Ví dụ: hệ điều hành có phải là hàm toán học trên các số tự nhiên không? Một máy chủ web? Một trò chơi? In ra bàn điều khiển? Lái robot? Tôi không có nghi ngờ rằng tất cả những điều này có thể được thực hiện trong Prolog, nhưng nó không nhất thiết phải tuân theo Prolog là Turing-perfect.
Jörg W Mittag

@ JörgWMittag: Nói cách khác, nó có thể là có thể, nó chỉ có thể không thực tế?
Robert Harvey

1
@ JörgWMittag - Vâng, tất cả chúng, trong trái tim của chúng, chỉ là toán học và lưu trữ trên các con số.
Bobson

Câu trả lời:


9

Theo dõi trạng thái trò chơi không khác gì trạng thái theo dõi trong bất kỳ chương trình Prolog nào khác. Bạn xác định sự thật và sau đó sử dụng chúng để đưa ra quyết định. Nó khá cũ, nhưng bài viết Khám phá Prolog: Adventures, Object, Animal và Taxes thực hiện tốt công việc giải thích cách thức này có thể hoạt động trong một trò chơi. Tóm tắt từ bài viết:

% Set up - you start in a house
location(you, house).

% Move to a new location.
goto(X) :- 
    location(you, L), % Read your current location into L
    connect(L, X), % Check if you can reach the new location X from L
    retract( location(you, L) ), % Remove the old location fact
    assert( location(you, X) ). % Add a new location fact. You are in X now.
    write($ You are in the $), write(X), nl.

Ngoài ra, bạn cần một thư viện đồ họa và IO. Có thể có các bản phân phối Prolog thương mại bao gồm chúng. Tôi quen thuộc nhất với SWI Prolog , vì vậy tôi sẽ đề xuất plOpenGL làm điểm khởi đầu. Nó không chỉ cung cấp cho bạn quyền truy cập vào khả năng kết xuất của OpenGL, nó còn bao gồm các ràng buộc cho các sự kiện chuột và bàn phím. Ví dụ: để xử lý nhấn phím Escape, bạn xác định quy tắc bàn phím như sau:

% 27 is ASCII Code for Escape
keyboard(27,_,_) :-
    write('Escape key was pressed...'),nl.

Hãy xem ví dụ về ánh sáng di chuyển của plOpenGL để biết thêm chi tiết và một ví dụ về xử lý chuyển động của chuột.

Nếu bạn sử dụng thư viện đồ họa, nó có thể sẽ xử lý vòng lặp trò chơi cho bạn. Về cơ bản, bạn đảo ngược điều khiển vào thư viện và cung cấp các quy tắc được thực thi khi thích hợp: thiết lập, sơn lại, các sự kiện IO, v.v. Nếu bạn muốn giới hạn FPS hoặc chạy mã theo điều kiện theo thời gian, bạn có thể theo dõi thời gian đã trôi qua bằng thời gian / ngày vị ngữ và đưa ra quyết định phù hợp.

Có nhiều hương vị Prolog, vì vậy đây chắc chắn không phải là cách duy nhất để xây dựng một trò chơi. Các bản phân phối khác nhau và các ngôn ngữ liên quan sẽ sử dụng các thư viện / ràng buộc khác nhau có thể khuyến khích các cách tiếp cận khác nhau. Ngoài ra, các lập trình viên polyglot có thể khuyến khích bạn sử dụng ngôn ngữ máy chủ / thời gian chạy "thân thiện với đồ họa" hơn để quản lý kết xuất và IO trong khi sử dụng Prolog để mô hình hóa các hành vi và ra quyết định của thực thể trò chơi.


1
Trang web tương tự mà bạn đã liên kết cũng chứa một hướng dẫn dài hơn, Adventure in Prolog , mà tôi thấy hữu ích, và cũng kết thúc trong quá trình phát triển một trò chơi phiêu lưu dựa trên văn bản đơn giản.
jscs

Tuyệt quá! Đây là những gì tôi đang tìm kiếm. Tôi cảm thấy rằng bao gồm các hoạt động với các tác dụng phụ (như write) trong một "vị từ logic" dường như bẻ cong khái niệm khá xa.
Alex D

2

Trên đầu câu trả lời của Corbin : Ở trạng thái chung có thể được lưu trữ / truy xuất trong Prolog bằng cách sử dụng các vị từ khẳng định / rút lại. Nhưng có nhiều tùy chọn không chuẩn như lưu vào RDF, XML, cơ sở dữ liệu quan hệ, v.v. Nếu bạn muốn GUI, một ví dụ là XPCE do SWI-Prolog cung cấp.

Lưu ý rằng mặc dù triển khai một trò chơi hoàn chỉnh trong Lập trình logic là một bài tập tốt, nhưng trên thực tế, hiệu suất của nó sẽ không đủ và đó là lý do tại sao các nhà cung cấp như SWI-Prolog cung cấp các ràng buộc cho các ngôn ngữ cấp thấp hơn (ví dụ: Java, C ++, v.v.). Ngay cả việc thực hiện một bộ giải Sudoku đơn giản cũng yêu cầu sử dụng các thư viện CLP .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.