Рассмотрим следующий класс контроллеров в пошаговой многопользовательской игре. Пользователь
интерфейс, который работает в отдельном потоке, будет передавать объекты Player и GameMove
Тема GameEngine каждый раз, когда один из игроков делает ход.
1 public class GameEngine
2 {
3 private GameWorld world;
4
5 public GameEngine(GameWorld world)
6 {
7 this.world = world;
8 }
9
10 public void startGame()
11 {
12 Runnable task = new Runnable()
13 {
14 @Override
15 public void run()
16 {
17 try
18 {
19 while(true)
20 {
21 Player player = ... // Get current player
22 GameMove move = ... // Get move made by player
23 world.update(player, move);
24 }
25 }
26 catch(InterruptedException ex)
27 {
28 }
29 }
30 });
31 new Thread(task).start();
32 }
33 }
Используя монитор, реализуйте механизм связи внутри GameEngine,
это позволяет пользовательскому интерфейсу передавать необходимую информацию в GameEngine, как указано
в комментариях. Возможно, вам потребуется добавить дополнительные поля и / или методы
Для вышеприведенного вопроса я написал следующий фрагмент кода.
public class GameEngine
{
private Object monitor = new Object();
private GameWorld world;
private boolean flag = false;
public GameEngine(GameWorld world)
{
synchronized(monitor)
{
if(flag)
{
monitor.wait();
}
this.world = world;
flag = true;
monitor.notify();
}
}
public void startGame()
{
Runnable task = new Runnable()
{
public void run()
{
try
{
while(true)
{
synchronized(monitor)
{
if(!flag)
{
monitor.wait();
}
}
Player player = ...
GameMove move = ...
World.update(player,move);
flag = false;
monitor.notify();
}
}
catch (InterruptedException ex)
{
}
}
};
new Thread(task).start();
}
}
Может кто-нибудь проверить, правильный ли мой ответ или нет?