Làm cách nào tôi có thể đại diện cho các phòng và các hành động và kho đồ liên quan trong trò chơi phiêu lưu dựa trên văn bản?


8

Tôi chỉ mới bắt đầu học làm game. Tôi đã tạo ra một trò chơi dựa trên văn bản đơn giản, nơi người dùng có thể đi bộ giữa các phòng và tương tác với các đối tượng trong mỗi phòng. Tuy nhiên, tôi cảm thấy như cách tiếp cận của tôi đã dẫn đến một đống mã spaghetti xấu. Tôi không chắc cách tốt để cấu trúc một trò chơi như thế này sẽ là gì.

Cách tiếp cận của tôi là có một lớp với một phương thức cho mỗi phòng và tất cả các đối tượng và tương tác có thể được thực hiện trong phòng đó. Ví dụ, đây là phương pháp cho nghiên cứu:

public static void Study() 
{
    bool studyexited = false;

    while (!studyexited) {
        string usercommand = Console.ReadLine ();
        usercommand.ToLower ();

        switch (usercommand) {
        case "turn left":
            GameEventText.StudyLeft ();
            break;
        case "turn right":
            GameEventText.StudyRight ();
            break;
        case "go forward":
            Notes firstsetofclues = new Notes ("First Note");
            GameEventText.StudyFront ();
            string firststudycommand = Console.ReadLine ();
            firststudycommand.ToLower ();

            if (firststudycommand == "read note") {
                firstsetofclues.Firstnotereading ();
            }

            Console.WriteLine ("Picking up this note would prove valuable");
            string secondstudycommand = Console.ReadLine ();
            secondstudycommand.ToLower ();

            if (secondstudycommand == "pick up note") {
                if (MainClass.PlayerInventory.AddItem (firstsetofclues)) 
                {
                    Console.WriteLine ("The note has been added to your inventory");
                } else {
                    Console.WriteLine ("Your inventory is full");
                }

                MainClass.PlayerInventory.Inventorydisplay ();
            }
        }
    }
}

Tôi không cảm thấy như đây là một cách tiếp cận sẽ mở rộng; đó là tôi thực sự không thể viết các chức năng như thế này cho mọi phòng. Tôi tin rằng sử dụng các tệp theo một cách nào đó sẽ là một chiến lược tốt để tránh "mã hóa cứng" mà tôi hiện đang làm. Nhưng tôi không chắc làm thế nào tôi có thể đạt được điều đó?


Đây thực sự là một chủ đề lập trình chung, ngoại trừ các bit về các vòng lặp trò chơi và như vậy (rất rộng). Tuy nhiên, thật khó để nói vì câu hỏi của bạn không rõ ràng bằng văn bản.

tôi không hiểu làm thế nào nó không rõ ràng khi tôi cố gắng hết sức để giải thích. có lẽ bạn có thể giúp tôi?
Mohamed Serry

Rất nhiều trong số đó phải như vậy với việc thiếu dấu câu, viết hoa và khoảng cách giữa các đoạn. Về cơ bản có vẻ như bạn đang hỏi làm thế nào để tránh phải mã hóa một lớp duy nhất cho mỗi phòng trong trò chơi của bạn. Đúng không? Nếu vậy tôi có thể giúp chỉnh sửa câu hỏi của bạn.

đến một mức độ nào đó Tôi muốn tránh mã hóa cứng tất cả các trò chơi về cơ bản.
Mohamed Serry

Câu trả lời:


10

Bạn đang đi đúng hướng với quan niệm của bạn về việc sử dụng các tệp để giúp giảm bớt số lượng hành vi được mã hóa cứng mà bạn có. Bạn muốn làm cho dữ liệu trò chơi của bạn được điều khiển càng nhiều càng tốt: đó không phải là một khái niệm phức tạp, nó chính xác là những gì nó nghe như. Điều khiển hành vi trò chơi thông qua dữ liệu thay vì trực tiếp qua mã.

Một tư duy tốt cần thực hiện khi xác định cách điều khiển một số hệ thống thông qua dữ liệu là tìm kiếm sự tổng quát. Điều gì là điểm chung giữa tất cả các phiên bản của các hệ thống này? Điểm tương đồng trở thành thuộc tính của hệ thống và giá trị của các thuộc tính đó là dữ liệu. Các phòng, ví dụ, thường là tất cả có một mô tả và một danh sách các lối thoát hiểm. Họ cũng có thể có một "kho", một danh sách các vật phẩm trong phòng.

Một tùy chọn bạn có thể thuyết phục là sử dụng các tệp văn bản hoặc XML đơn giản (cả hai đều khá đơn giản để phân tích cú pháp trong C #) để lưu trữ dữ liệu và nội dung phòng.

Hãy xem xét một tệp có cấu trúc XML như thế này:

<room name="Study">
  <description>
  You enter a well-furnished study. A heavy wooden desk sits in one corner, an ugly lamp illuminating its surface.
  </description>
  <exits>
    <exit command="north">Hallway</exit>
  </exits>
  <items>
    <item name="Pen">
  </items>
</room>

Cấu trúc đơn giản này xác định chính xác những gì tôi liệt kê ở trên. Một Roomlớp cooresponding sẽ có các thuộc tính cho Description, một List<T>lối thoát hiểm (là các tham chiếu đến các phòng khác và lệnh "go" được sử dụng để đến đó, trong ví dụ trên đi về phía bắc sẽ đưa người chơi đến hành lang). Ngoài ra còn có một List<T>mặt hàng.

Thay vì đặt một whilevòng lặp trong một chức năng cho mỗi phòng (điều mà bạn không thể làm bây giờ vì Roomdù sao bạn chỉ có một lớp duy nhất ), bạn tạo một vòng lặp chính tổng quát hơn:

while(!done) {
  Console.WriteLine(currentRoom.Description);
  var command = Command.Parse(Console.ReadLine());
  switch(command.Verb) {
    case "go":
      nextRoom = allRooms[currentRoom.GetExitForDirection(command.Object)];
      if (nextRoom == null) {
        Console.WriteLine("You cannot go that way.");
      }
      else {
        currentRoom = nextRoom;
      }
      break;
    ...
  }
}

Lưu ý rằng Command.Parsehàm còn lại là một phần bổ sung cho bạn, nhưng về cơ bản nên phân tích cú pháp đầu vào của người dùng và trả về một số loại "động từ / đối tượng" hoặc tương tự (xem câu hỏi này để bắt đầu làm như vậy, nó hơi vượt quá phạm vi của bạn câu hỏi). Trong ví dụ trên, động từ sẽ là "go" và đối tượng có thể là "phía bắc" hoặc "phía nam" hoặc bất cứ điều gì.

Nhưng ngoài ra, những gì vòng lặp này đang làm là trình bày các phòng theo một cách khái quát; Mỗi lần qua, bạn in mô tả phòng, chờ người dùng nhập liệu. Nếu đầu vào của người dùng là "đi đến một số phòng khác", bạn sẽ tìm thấy lối ra của phòng hiện tại đang theo hướng người dùng đã nhập. Nếu không có lối ra theo hướng đó, hãy nói như vậy, nếu không thì đặt phòng hiện tại thành phòng mới đó. Sau đó lặp lại.

Bạn có thể tiếp tục tinh chỉnh cách tiếp cận này (ví dụ: ở trên in mô tả phòng sau mỗi lệnh; bạn có thể xem cách làm cho nó chỉ in mô tả lần đầu tiên khi bạn vào phòng không? Làm thế nào về điều đó cộng với khi bạn gõ "nhìn" " chỉ huy?). Bạn cũng có thể mở rộng nó ra để bao gồm việc xử lý các mặt hàng theo cách tương tự.


Cảm ơn bạn rất nhiều vì đã hỗ trợ josh. tôi sẽ thử điều này và cố gắng phát triển sự tiến bộ hết mức có thể
Mohamed Serry

1

Nếu bạn biết html, bạn có thể nghĩ về các phòng như các trang web, lối thoát dưới dạng liên kết, các hành động có thể là neo và chính trò chơi như một trình duyệt. Điều bổ sung duy nhất mà trò chơi cần quản lý là một kho lưu trữ và NPC, về cơ bản là một lớp tĩnh hoặc hai với trạng thái của từng vật phẩm và nhân vật trong trò chơi, đã được sử dụng, đã được sử dụng / nói chuyện rồi bị phá hủy / đánh bại.

Nếu bạn sử dụng html thay vì xml thuần theo cách tương tự như những gì Josh mô tả, bạn có thể gỡ lỗi trong trình duyệt, ít nhất là khi điều hướng đi.


Câu trả lời của josh kỹ lưỡng hơn về mặt kỹ thuật và có liên quan trực tiếp, nhưng sự tương tự này khá tốt và có thể giúp hiểu khái niệm tổng thể
jhocking
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.