2012-03-11 43 views
6

Là một nhiệm vụ cho mô-đun C++ của tôi, tôi phải xây dựng một trò chơi phiêu lưu văn bản. Vấn đề tôi đang phải đối mặt là một vấn đề khái niệm; mọi người đều nói rằng tôi nên sử dụng cấu trúc dữ liệu cây để thể hiện trò chơi của mình. Những gì tôi không nhận được là lý do tại sao.Tại sao lại sử dụng cấu trúc dữ liệu cây để biểu diễn dữ liệu trong trò chơi phiêu lưu văn bản?

Giả sử tôi có một ngôi nhà gồm 4 phòng. Chúng ta có thể tưởng tượng điều này như là một mảng 2x2. Trong mỗi phòng tôi có hai vật thể. Tôi muốn hiển thị dữ liệu này theo cách mà tôi có thể dễ dàng di chuyển nhân vật của mình từ 0x0 đến 0x1 một trong hai cách (trực tiếp – 1 bước, hoặc gián tiếp – 3 bước), trong khi mang theo một đối tượng với tôi.

Tại sao nên sử dụng cây để giữ tất cả dữ liệu và ký tự của tôi sẽ chuyển thành nút này sang nút khác? Hoặc là nhân vật một nút là tốt? Không phải nhân vật của tôi sẽ là một đối tượng với một danh sách là hàng tồn kho của nó?

Tôi hơi bối rối về điều này. Tôi không tìm kiếm bất kỳ mã nào, chỉ cần hiểu rõ hơn về cách trình bày và thao tác dữ liệu.

Đề xuất dành cho bản đồ. Nhưng sau đó tôi không hiểu làm thế nào nhân vật của tôi sẽ "điều hướng" một bản đồ, một trong hai.

+6

Có thể bạn bè của bạn đang nghĩ rằng bạn đang xây dựng một ngôi nhà * cây *. –

+0

Xin lỗi, không thực sự chắc chắn những gì bạn đang cố gắng để nói – Adrian

+5

Đó là bình thường khi bạn tìm hiểu các khái niệm mới để cố gắng áp dụng chúng cho tất cả mọi thứ. Cấu trúc dữ liệu cây chỉ đơn thuần là một công cụ trong hộp công cụ của bạn. Đôi khi nó là một công cụ tốt cho công việc, đôi khi nó không phải. –

Trả lời

8

Những gì bạn đang tìm kiếm không phải là một cái cây, mà là một biểu đồ.

Lý do thích hợp hơn là một mảng "địa điểm" không nhất thiết đại diện cho những gì bạn muốn. Không nhất thiết phải là một cánh cửa giữa tất cả các phòng liền kề, vì vậy bạn có thể không thể đi trực tiếp từ người này sang người khác.Vào thời điểm đó, trong một loại trò chơi phiêu lưu văn bản điển hình, bạn có thể có một số hành lang (hoặc bất kỳ thứ gì) đưa bạn nhiều hơn hoặc ít hơn trực tiếp từ phòng này sang phòng khác không chính xác (hoặc thậm chí gần) liền kề. Ngoài ra, bạn có thể có một lối đi một chiều sẽ đưa bạn từ nơi này đến nơi khác, nhưng bạn không thể quay lại và quay lại. Tất cả những điều này rất dễ dàng để đại diện với một đồ thị được chỉ dẫn, nhưng rất khó để đại diện với một mảng.

+0

Tôi đồng ý với bạn khi nói rằng biểu đồ thích hợp hơn cho trò chơi phiêu lưu văn bản. Tuy nhiên, nếu tôi thành công trong việc tạo ra một đại diện cho bản đồ (C++ không có), tôi không hiểu cách nhân vật của tôi di chuyển trên biểu đồ. Nó không phải là một phần của cấu trúc này? – Adrian

+2

@Adrian: không - nhân vật của bạn có thể có thành viên "hiện tại" là con trỏ đến một nút trong biểu đồ. Nếu đó là trò chơi nhiều người chơi, bạn cũng có thể muốn mỗi nút có danh sách các con trỏ cho người chơi hiện đang chiếm đóng nút đó (trong trường hợp này, các nút đi ngang thường sẽ liên quan đến người chơi đăng ký với nút mới khi vào và không đăng ký khi thoát). –

+0

Hiện tại, chế độ này có ý nghĩa. Cảm ơn bạn. – Adrian

0

Tôi nghĩ rằng cây là một lựa chọn tốt hơn, bởi vì bạn muốn thể hiện sự chuyển tiếp trạng thái có thể có giữa các phòng ngoài phòng mình.

Hãy coi nó như một biểu đồ: các trạng thái là các phòng, nhưng các sự kiện cụ thể sẽ kích hoạt quá trình chuyển đổi từ một đến khác. Nó thể hiện thực tế là người dùng không thể ngẫu nhiên từ trạng thái này sang trạng thái khác.

Nghĩ rằng máy tự động và máy trạng thái hữu hạn.

+2

Lưu ý rằng cây! = Đồ thị (trên thực tế, cây là một loại đồ thị rất cụ thể và hạn chế). Đối với hầu hết các bản đồ, cây là không đủ và bạn cần một đồ thị tổng quát hơn. – delnan

+1

Đồng ý. Tôi nghĩ rằng một cây là tốt hơn so với các mảng 2x2, và đồ thị là tốt hơn so với cây. – duffymo

9

Nếu "nhà" của bạn là lưới và bạn có thể di chuyển từ bất kỳ ô lưới nào sang bất kỳ ô lưới nào khác, một mảng là tốt. Tôi đoán những gì bạn bè của bạn đang gợi ý là bạn có thể không muốn có thể di chuyển từ bất kỳ phòng nào đến bất kỳ phòng liền kề nào (và cũng KHÔNG thể di chuyển từ 0,0 đến 42,13).

Tuy nhiên, với cấu trúc cây, bạn vẫn không thể thể hiện một tập hợp chuyển tiếp tùy ý giữa các phòng.

Cách tiếp cận linh hoạt hơn sẽ là Adjacency List, là loại chuyên biệt graph. Hãy suy nghĩ của mỗi phòng như là một nút, và cung cấp cho mỗi nút một danh sách các phòng khác có thể được chuyển đổi sang. Với cấu trúc đó, bạn thậm chí có thể cho phép chuyển tiếp một chiều (nghĩ một cánh cửa từ nhiều trò chơi mạo hiểm).

giả

class Room 
{ 
    string Name; 
    string Description 
    List<Room> ConnectedRooms; 
} 

Sau đó, khi đại diện cho nhân vật

class Character 
{ 
    string Name; 
    Room CurrentRoom; 
} 

Để xem nơi một nhân vật nhất định là có thể di chuyển đến:

List<Room> availableRooms = myCharacter.CurrentRoom.ConnectedRooms; 
+0

Vâng, những gì tôi đã cố gắng giải thích là một [Danh sách Adjacency] (http://en.wikipedia.org/wiki/Adjacency_list), câu trả lời của bạn là hoàn chỉnh hơn mặc dù. +1! –

+0

Lưu ý rằng bạn thường không muốn một 'Danh sách ', nhưng một 'Danh sách ', hoặc có thể 'Danh sách >' (đối với một số định nghĩa phù hợp của 'SmartPtr'). Bạn thường muốn cho phép một số nút nguồn khác nhau dẫn đến một điểm đến cụ thể (ví dụ: đến nhà bếp từ phòng ăn hoặc phòng khách). –

+0

Mã Heh ... có nghĩa là Pseudocode. Tôi sẽ làm rõ điều đó trong câu trả lời của tôi (đã 10 năm kể từ khi tôi sử dụng một ngôn ngữ giao dịch trực tiếp với con trỏ). –

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