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 để:
- 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
- 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:
- 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)?
- 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?
- 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();
Độ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
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
đ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