山がなくなるまで、2 人のプレイヤーが 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;
}
}