2013-07-24 17 views
1

Я хочу обеспечить реализацию игры с четырьмя игроками, в которой каждый игрок реализован как нить. Каждый игрок получает шанс бросить кости в порядке количества игроков. каждый бросок умирает, возвращают только число от 1 до 6. игра останавливается всякий раз, когда какой-либо игрок набирает 25 очков или более игроков, победивших в игре.Создание игры в кости в java с использованием многопоточности

Я имею в виде создания классов

Dice для обработки плашек

Совета Для обработки все темы и игрока Score

TheGame для Начиная игру

Моих класс Dice

import java.util.Random; 

public class Dice { 
Random dice; 
public Dice() 
{ 
dice=new Random(); 
} 

public int throwDice() 
{ 
    int a= dice.nextInt(70); 
    a=a/10; 
    if (a==0) 
     return 1; 
    else return a; 
} 

}

Мой плеер класса

public class Player extends Thread { 
Board board; 
int num; 
public Player(Board b,int n) 
{ 
board=b; 
num=n; 
} 
public void run() 
{ 
System.out.println("Player "+num+" is started, playing game..."); 
while(board.flag) 
{ 
board.play(num);  
} 
} 
} 

Game Class

public class TheGame { 


    public static void main(String[] args) { 
     System.out.println("Initializing board..."); 
     Board b=new Board(); //Creating object of class board 
     System.out.println("Initializing players..."); 
     Player p1=new Player(b,1); // Every player is Thread 
     Player p2=new Player(b,2); 
     Player p3=new Player(b,3); 
     Player p4=new Player(b,4); 
     p1.start(); //Starting Thread 
     p3.start(); 
     p2.start(); 
     p4.start(); 
    } 

} 

Я не могу думать логики или решить, где начать в классе Совета , Пожалуйста, помогите мне с кодом Совета

Это не задание или домашнее задание. Я хочу сделать это сам, но у меня нет никакого глубокого представления о синхронизации в Threading

Я пытаюсь закодировать, я не прошу полных учебников, я просто спрашиваю, как установить порядок, когда игрок 1 (нить) получить выполнение после того, как игрок 1 сделал свой шанс.

+0

Хотя я думаю, что экспериментировать и учиться с помощью потоковой передачи является хорошей идеей, я просто хочу убедиться, что вы знаете, что вы не должны реализовывать игру в кости этого типа с потоком для производственного кода. – hexafraction

+0

@hexafraction Спасибо, я просто хочу копать в потоке, но мой учитель однажды сказал мне, что нарезание резьбы в основном используется для создания такой игры. поэтому я думаю об осуществлении этого –

+1

Если ваш преподаватель сказал вам использовать многопоточность в текстовой игре с кубиками, я бы нашел нового репетитора. – hexafraction

ответ

3

Это только, чтобы указать вам в правильном направлении. Вам нужно читать намного больше, чем я могу писать здесь. Затем вам нужно исправить всевозможные странные и неустранимые ошибки. Но вы спросили ...

Я думаю, что это намного проще и интереснее, если все 4 игрока бросают сразу. (Хотя вы можете иметь более одного победителя.) Для того, чтобы сделать это:

Создание глобальных мониторов и поле (Возможно, в классе Game):

public static final turnMonitor = new Object(); 
public static final controlMonitor = new Object(); 
public static volatile gameOn = true; 

Затем создать класс игрока с помощью метода выполнения. (Игрок может расширить тему, или она может продлить Runnable, и вы можете передать его в новую тему.) Как так:

public void run() { 
    while (gameOn) { 
     synchronized (turnMonitor) { turnMonitor.wait(); } 
     ...roll dice here... 
     ...Put sum of Player rolls in volatile instance field or synched field... 
     ...Update volatile player turn counter... 
     synchronized (controlMonitor) { 
      // Tell control monitor we're done. 
      controlMonitor.notifyAll(); 
     } 
    } 
} 

Затем вы хотите, контрольный код (в классе Game?):

while (true) { 
    // Roll dice 
    synchronized (turnMonitor) { turnMonitor.notifyAll(); } 
    // Wait for dice to roll 
    do { 
     synchronized (controlMonitor) { controlMonitor.wait(); } 
    } while (...not all players have rolled this turn...); 
    if (there's a winner) break; 
} 
gameOn = false; 

Это должно дать вам начало. Изучайте синхронизацию, volatiles, wait() и notifyAll(). Если вы не можете найти хороших примеров в любом месте, отметьте here (для самых оснований).

При запуске напечатайте большое количество отладочных сообщений. Нитки всегда работают, когда вы их не ожидаете. Вы : будет удивлен.

Чтобы игроки играли по одному, я думаю, вам понадобятся мониторы с несколькими оборотами. Вы можете уведомлять только об одном ожидающем потоке за раз, но вы не можете управлять , из которого поток получает уведомление, поэтому попытка получить нужную нить с одного монитора будет затруднительной.

+0

Thanls много, это мне очень поможет. –

Смежные вопросы