用两个线程玩猜数字游戏,第一个线程负责随机给出1~100的一个整数,第二个线程负责猜出这个数。要求每当第二个线程给出自己的猜测后,第一个线程 都会提示“猜小了”、“猜大了”或“猜对了”。在猜数之前,要求第二个线程等待第一 个线程设置好要猜测的数。第一个线程设置好猜测的数之后,两个线程还要互相等待,其原则是第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后, 等待第二个线程给出的猜测,如此进行,直到第二个线程给出正确的猜测后两个线程进入死亡状态。查找用二分法?
时间: 2023-12-26 21:25:03 浏览: 112
以下是使用二分法实现猜数字游戏的Java代码:
```java
import java.util.Random;
public class GuessNumberGame {
private int guessNumber; // 待猜测的数字
private boolean guessed; // 是否猜对了
public synchronized void play() {
while (guessed == false) {
try {
wait(); // 等待第一个线程设置待猜测的数字
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int low = 1;
int high = 100;
Random rand = new Random();
while (guessed == false) {
int guess = (low + high) / 2; // 使用二分法猜测数字
System.out.println("我猜是 " + guess);
if (guess == guessNumber) {
System.out.println("猜对了!");
guessed = true;
notify(); // 唤醒第一个线程
} else if (guess < guessNumber) {
System.out.println("猜小了!");
low = guess + 1;
try {
wait(); // 等待第一个线程提示
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("猜大了!");
high = guess - 1;
try {
wait(); // 等待第一个线程提示
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public synchronized void setGuessNumber(int number) {
guessNumber = number;
notify(); // 唤醒第二个线程
while (guessed == false) {
try {
wait(); // 等待第二个线程猜测
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void checkGuess(int guess) {
if (guess == guessNumber) {
System.out.println("猜对了!");
guessed = true;
notify(); // 唤醒第二个线程
} else if (guess < guessNumber) {
System.out.println("猜小了!");
notify(); // 唤醒第二个线程
try {
wait(); // 等待第二个线程猜测
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("猜大了!");
notify(); // 唤醒第二个线程
try {
wait(); // 等待第二个线程猜测
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
GuessNumberGame game = new GuessNumberGame();
Thread thread1 = new Thread() {
@Override
public void run() {
game.setGuessNumber(new Random().nextInt(100) + 1);
}
};
Thread thread2 = new Thread() {
@Override
public void run() {
game.play();
}
};
thread1.start();
thread2.start();
}
}
```
在上面的代码中,`GuessNumberGame` 类封装了待猜测的数字和是否猜对了的状态,并提供了两个同步方法 `setGuessNumber` 和 `checkGuess`,分别由第一个线程和第二个线程调用。
第一个线程通过调用 `setGuessNumber` 方法设置待猜测的数字,并唤醒第二个线程。
第二个线程通过调用 `play` 方法开始猜数字游戏,如果当前还没有设置待猜测的数字,则等待第一个线程设置;如果已经猜对了,则唤醒第一个线程;否则使用二分法猜测数字,并调用 `checkGuess` 方法检查猜测的结果。如果猜对了,则唤醒第一个线程;否则等待第一个线程提示。
阅读全文