2013-07-25 41 views
8

Tôi đang tạo trò chơi đầu tiên của mình bằng Java. Trò chơi là Monopoly. Tôi đang đấu tranh với cách tôi nên thiết kế trò chơi để mô hình hóa cấu trúc theo lượt của nó (quản lý người chơi lượt). Tôi muốn cho phép cả người chơi điều khiển một người và một hoặc nhiều người chơi được điều khiển bằng AI để chơi trò chơi.Thiết kế trò chơi theo lượt: Sự kiện điều khiển so với vòng lặp trò chơi

Vấn đề cụ thể của tôi là tôi không biết có thực hiện vòng lặp trò chơi hay không, nghĩa là vòng lặp có thể quản lý người chơi và các biến liên quan trực tiếp đến trò chơi Độc quyền (nghĩ về những thứ như nhắc từng người chơi cho đến lượt của họ, tăng lượt cho người chơi tiếp theo, hoặc nhận xúc xắc lăn từ mỗi người chơi - lần lượt). Tôi không đề cập đến ý nghĩa mức độ thấp của thuật ngữ “vòng lặp trò chơi” liên quan nhiều hơn đến việc vẽ khung trên màn hình, cập nhật vật lý hoặc cập nhật AI ở một tỷ lệ thời gian cụ thể.

sự hiểu biết của tôi là lựa chọn của tôi cho cố gắng thực hiện những gì tôi cần là một trong hai để:

  1. Thực hiện một chương trình hoàn toàn hướng sự kiện mà không có trận đấu vòng lặp như vậy, hoặc
  2. Thực hiện một trò chơi tiếp vòng thứ gì đó chạy dài trong nền và về cơ bản không bao giờ kết thúc miễn là trò chơi đang chạy. Đây sẽ là cách tiếp cận thủ tục hơn.

Khi lần đầu tiên bắt đầu giải quyết vấn đề này, tôi gặp vấn đề về đóng băng giao diện người dùng vì vòng lặp trò chơi của tôi không bao giờ hết và đã hoàn toàn tiêu thụ luồng mà nó đang chạy. trong khi vòng lặp để minh họa điều này). Vì vậy, tôi đã đi đến nỗ lực của việc tạo ra một SwingWorker để đóng gói vòng lặp trò chơi của tôi. Điều đó giải quyết được vấn đề của UI bị đóng băng, nhưng tôi vẫn tự hỏi liệu tôi có đi sai đường không. Theo nguyên tắc chung, tôi thấy rằng hầu hết các lời khuyên trên web thường có vẻ ưu tiên bất kỳ phương pháp nào được định hướng theo sự kiện và do đó việc triển khai hiện tại của tôi sử dụng SwingWorker có thể là một bước đi sai hướng. Nhưng tôi không thể nắm bắt đầy đủ cách tôi sẽ thực hiện một hệ thống hoàn toàn theo hướng sự kiện cho nhiệm vụ cụ thể này (nghĩa là không có vòng lặp trò chơi). Dường như với tôi rằng một vòng lặp phải tồn tại ở đâu đó để quản lý người chơi quay.

Dưới đây là những câu hỏi cụ thể của tôi:

  1. Are vòng trò chơi (như tôi mô tả chúng) thích hợp cho các trò chơi theo lượt như Monopoly-đặc biệt cho xếp hàng cầu thủ quay lại và khiến các cầu thủ thích hợp đến lượt mình , một người chơi tại một thời điểm (và xếp hàng toàn bộ quy trình/chuỗi các bước bao gồm một lượt)?
  2. Nếu hệ thống hoàn toàn hướng sự kiện được tạo ra để quản lý lượt người chơi, bạn làm cách nào để lặp lại từng người chơi để nhắc họ lần lượt và tiếp tục lặp lại cho đến khi trò chơi kết thúc?
  3. Nếu vòng lặp trò chơi được sử dụng để giải quyết vấn đề cụ thể được mô tả ở trên, nó có phải được chạy trong chủ đề riêng của nó (có thể sử dụng SwingWorker) để tránh đóng băng giao diện người dùng không? Tình hình của tôi là cụ thể cho Java, nhưng tôi cho rằng tôi cũng sẽ quan tâm đến các câu trả lời cho các tình huống không phải là Java.

Hiện tại, tôi có mã được sắp xếp bằng mẫu MVC. Bộ điều khiển của tôi là nơi vòng lặp trò chơi của tôi (chủ đề thực tế là SwingWorker) nằm. Nó là xa hoàn thành, nhưng nó giúp minh họa cách tôi quản lý người chơi quay trong những gì tôi đang gọi là một "vòng lặp trò chơi".

SwingWorker mã từ bộ điều khiển:

swingWorker = new SwingWorker<Void, Model>() { 
@Override 
protected Void doInBackground() throws InterruptedException { 
gameLoopRunning = true; 
while (gameLoopRunning) { 

    //to do: use a timer instead of thread.sleep 
    Thread.sleep(1000); 

    //user turn prompt 
    if (model.getActivePlayer().isUserControlled()) { 

     boolean userRolled = false; 
     while(!userRolled) { 
      System.out.println("Roll the dice please..."); 
      Thread.sleep(3000); 
     } 

    } 
    //bot turn prompt 
    else { 
     //insert code for bot rolling dice here 
     model.rollDice(); 
    } 

    publish(model); 

    Thread.sleep(1000); 
    model.incrementPlayerTurn(); 
    publish(model); 

} 
return null; 
} 

@Override 
protected void process(List<Model> chunks) { 
Model gameModel = chunks.get(chunks.size() - 1); 
//hard-coded for 6 players 
for (int i = 0; i < 6; i++) { 
    view.getPlayerPanel(i).setTurn(gameModel.getPlayers().get(i).isTurn()); 
} 
view.getGamePanel().getDice().setDie1(model.getDie1()); 
view.getGamePanel().getDice().setDie2(model.getDie2()); 
} 

}; 
swingWorker.execute(); 
+0

Độc quyền không khác nhiều so với cờ, đối với tôi, nó cho phép thực hiện các quy tắc trở nên dễ dàng hơn nhiều, giống như trong cờ vua, bởi mỗi sự kiện sẽ ảnh hưởng đến một số trạng thái. – arynaq

+0

Không có vấn đề làm thế nào bạn thực hiện nó, bạn có thể không muốn chu kỳ CPU gameplay của bạn đang được thực hiện trên thread UI. – Tim

+1

điều gì về việc sử dụng một máy trạng thái hữu hạn để thể hiện các thay đổi trạng thái trò chơi? Tôi đã từng sử dụng một sản phẩm thô để phát triển trò chơi cờ đam, với mã giao diện người dùng dựa trên sự kiện. – SirDarius

Trả lời

9

Các bình luận từ SirDarius là tại chỗ trên.

Mặc dù, đối với một cái gì đó đơn giản như người chơi tiến bộ lần lượt, bạn không thực sự cần phải bận tâm thực hiện một máy trạng thái hữu hạn đầy đủ.

Xét về MVC, đây là những gì bạn nên làm cho nhân chơi:

  • Model: Cung cấp phương pháp để thúc đẩy các cầu thủ tích cực để người chơi tiếp theo và cho chạy qua " biến quá trình "(tức là lăn xúc xắc, di chuyển mã thông báo của người chơi đang hoạt động, v.v.). Bởi vì nhiều quá trình biến là sự kiện điều khiển, các cuộc gọi phương thức này sẽ được thực hiện từ các trình lắng nghe sự kiện trong bộ điều khiển.

  • Chế độ xem: Tăng sự kiện khi người chơi đang hoạt động kết thúc lượt của họ, cũng như tăng sự kiện trên các đầu vào khác nhau.

  • Bộ điều khiển: Bất cứ khi nào người chơi kết thúc lượt, hãy yêu cầu mô hình tiến tới trình phát tiếp theo và bắt đầu lại "quy trình rẽ". Bất cứ khi nào một người chơi cung cấp đầu vào, một sự kiện sẽ được kích hoạt để cho mô hình tiến tới giai đoạn tiếp theo của lượt chơi.

Đối AI người chơi, đa số các mã tương tự có thể được sử dụng, nhưng nó không có ý nghĩa để có sự tiến triển lần lượt được thúc đẩy bởi quan điểm. Thay vào đó, mô hình sẽ cần phải có một phương pháp "quy trình rẽ" khác sẽ dành riêng cho người chơi AI. Sự khác biệt duy nhất là mã sẽ thực thi liên tiếp mà không phải đợi đầu vào từ khung nhìn, thay vì là một chuỗi các trình lắng nghe sự kiện.

+0

Tôi không theo nhận xét của bạn về chế độ xem. Tôi có thể hiểu các sự kiện kích hoạt chế độ xem khi các nút được nhấp, nhưng đến lượt bắt đầu và kết thúc trong Độc quyền, có thể không có nút chuyên dụng để bắt đầu hoặc kết thúc lượt. Thêm vào đó, những gì về chương trình AI bắt đầu và kết thúc lượt của họ? Rõ ràng họ không tương tác với quan điểm để quản lý lượt, phải không? – nairware

+0

@nairware Một lượt của người chơi trong độc quyền sau một tiến trình tự nhiên. Chỉ có quá nhiều nhiệm vụ để thực hiện, và một trong số đó là nhiệm vụ cuối cùng cho bất kỳ lượt nào. Nói chung, người chơi sẽ lăn xúc xắc, di chuyển mảnh của họ, thực hiện một hành động (mua tài sản, trả tiền phạt, rút ​​thẻ, vv), mua nhà, và (tùy chọn) thực hiện các giao dịch. Quá trình chuyển đổi sẽ thay đổi nếu người chơi đang ở trong tù, nhưng vẫn có một hành động cuối cùng để người chơi thực hiện. Khi người chơi hoàn thành hành động cuối cùng của họ (hoặc có thể nhấp vào nút "kết thúc" theo ngữ cảnh), lượt chơi có thể kết thúc. –

+0

Tôi theo dõi. Chắc chắn một sự kiện để kết thúc lượt có ý nghĩa. Tôi đã không rõ ràng về lý do tại sao quan điểm nhất thiết phải có bất cứ điều gì để làm với sự kiện đó. Tôi nghĩ bạn đang giả sử có nút "kết thúc", trong trường hợp đó, mô tả của bạn về chế độ xem có ý nghĩa.Tuy nhiên, một người chơi được điều khiển bằng AI sẽ không nhấp vào nút như vậy, vì vậy bạn cũng chỉ giả định người chơi được kiểm soát bởi con người. Cùng một sự kiện kết thúc sẽ cháy cho người chơi có kiểm soát AI, nhưng không phải từ một nút bấm hoặc bất cứ điều gì liên quan đến xem (trong dự toán của tôi anyway). – nairware

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