У меня была задача написать простую игру, имитирующую двух игроков, собирающих по 1-3 матча один за другим, пока куча не исчезнет. Мне удалось сделать это для компьютера, выбирающего случайные значения совпадений, но теперь я хотел бы пойти дальше и позволить людям играть в игру. Вот что у меня уже есть: http://paste.pocoo.org/show/201761/
Класс Player - это компьютерный плеер, а PlayerMan должен быть человеком. Проблема в том, что поток PlayerMan должен ждать, пока не будет задано правильное значение совпадений, но я не могу заставить его работать таким образом. Логика такова: поток работает, пока совпадения не станут равны нулю. Если номер игрока правильный на данный момент, вызывается функция pickMatches (). После уменьшения количества совпадений в таблице поток должен ждать, а другой поток должен быть уведомлен. Я знаю, что должен использовать wait () и notify (), но не могу их правильно разместить.
Class Shared сохраняет значение текущего игрока, а также количество совпадений.
public void suspendThread() {
suspended = true;
}
public void resumeThread() {
suspended = false;
}
@Override
public void run(){
int matches=1;
int which = 0;
int tmp=0;
Shared data = this.selectData();
String name = this.returnName();
int number = this.getNumber();
while(data.getMatches() != 0){
while(!suspended){
try{
which = data.getCurrent();
if(number == which){
matches = pickMatches();
tmp = data.getMatches() - matches;
data.setMatches(tmp, number);
if(data.getMatches() == 0){
System.out.println(" "+
name+" takes "+matches+" matches.");
System.out.println("Winner is player: "+name);
stop();
}
System.out.println(" "+
name+" takes "+matches+" matches.");
if(number != 0){
data.setCurrent(0);
}
else{
data.setCurrent(1);
}
}
this.suspendThread();
notifyAll();
wait();
}catch(InterruptedException exc) {}
}
}
}
@Override
synchronized public int pickMatches(){
Scanner scanner = new Scanner(System.in);
int n = 0;
Shared data = this.selectData();
System.out.println("Choose amount of matches (from 1 to 3): ");
if(data.getMatches() == 1){
System.out.println("There's only 1 match left !");
while(n != 1){
n = scanner.nextInt();
}
}
else{
do{
n = scanner.nextInt();
}
while(n <= 1 && n >= 3);
}
return n;
}
}