Gần đây tôi đã giải trí bằng cách lập trình một trò chơi phiêu lưu dựa trên văn bản đơn giản và tôi bị mắc kẹt với những gì có vẻ như là một vấn đề thiết kế rất đơn giản.
Để cho một cái nhìn tổng quan ngắn gọn: trò chơi được chia thành Room
các đối tượng. Mỗi người Room
có một danh sách các Entity
đồ vật trong căn phòng đó. Mỗi cái Entity
có một trạng thái sự kiện, đó là một chuỗi đơn giản-> bản đồ boolean và một danh sách hành động, đó là một bản đồ chuỗi-> chức năng.
Đầu vào của người dùng có dạng [action] [entity]
. Việc Room
sử dụng tên thực thể để trả về Entity
đối tượng thích hợp , sau đó sử dụng tên hành động để tìm đúng hàm và thực thi nó.
Để tạo mô tả phòng, mỗi Room
đối tượng hiển thị chuỗi mô tả của riêng mình, sau đó nối thêm chuỗi mô tả của mỗi Entity
. Các Entity
mô tả có thể thay đổi dựa trên trạng thái của nó ( "Cánh cửa mở cửa", "Cánh cửa được đóng lại", "Cánh cửa bị khóa", vv).
Đây là vấn đề: sử dụng phương pháp này, số lượng các chức năng mô tả và hành động tôi cần thực hiện nhanh chóng vượt khỏi tầm kiểm soát. Phòng khởi đầu của tôi một mình có khoảng 20 chức năng giữa 5 thực thể.
Tôi có thể kết hợp tất cả các hành động thành một chức năng duy nhất và if-other / chuyển qua chúng, nhưng đó vẫn là hai chức năng cho mỗi thực thể. Tôi cũng có thể tạo Entity
các lớp con cụ thể cho các đối tượng chung / chung như cửa và khóa, nhưng điều đó chỉ giúp tôi đến nay.
EDIT 1: Theo yêu cầu, ví dụ mã giả của các hàm hành động này.
string outsideDungeonBushesSearch(currentRoom, thisEntity, player)
if thisEntity["is_searched"] then
return "There was nothing more in the bushes."
else
thisEntity["is_searched"] := true
currentRoom.setEntity("dungeonDoorKey")
return "You found a key in the bushes."
end if
string dungeonDoorKeyUse(currentRoom, thisEntity, player)
if getEntity("outsideDungeonDoor")["is_locked"] then
getEntity("outsideDungeonDoor")["is_locked"] := false
return "You unlocked the door."
else
return "The door is already unlocked."
end if
Các hàm mô tả hoạt động theo cách tương tự, kiểm tra trạng thái và trả về chuỗi thích hợp.
EDIT 2: Sửa đổi từ ngữ câu hỏi của tôi. Giả sử rằng có thể có một số lượng đáng kể các đối tượng trong trò chơi không chia sẻ hành vi chung (phản hồi dựa trên trạng thái đối với các hành động cụ thể) với các đối tượng khác. Có cách nào để tôi có thể định nghĩa các hành vi độc đáo này theo cách sạch hơn, dễ bảo trì hơn là viết một hàm tùy chỉnh cho từng hành động cụ thể của thực thể không?