猜数字游戏是这样一个游戏:事先给定一个数值,由游戏一方进行猜测,另一方则根据猜测的数字和给定的目标数字之间的关系,告知其结果是大了、小了还是猜对了,如果猜对了游戏结束,否则继续进行。 现在,我们可以使用多线程技术来实现这样的猜数字游戏,全智能、全自动,完全不需要人去操作了。 请使用java编译相应的代码 第一步,根据当前类对象创建两个线程对象,并在启动游戏的方法中启动这两个线程; 第二步,线程启动后执行run方法,进入游戏循环,每一次执行doGame方法时,都需要判断当前线程对象是谁; 第三步,根据不同的线程对象执行不同的操作,检查线程中根据当前的猜测的数字和目标数字之间的关系给出猜测结果,按照固定格式进行输出,而猜测线程则根据检查的结果修改边界后重新猜测; 第四步,完成操作后需要唤醒其他等待中的线程。
时间: 2023-11-10 17:05:06 浏览: 143
猜数字游戏,java实现
以下是使用Java实现猜数字游戏的代码:
```java
public class GuessNumberGame {
private int targetNumber;
private int lowerBound;
private int upperBound;
private boolean isFinished = false;
public GuessNumberGame(int lowerBound, int upperBound) {
this.lowerBound = lowerBound;
this.upperBound = upperBound;
this.targetNumber = (int) (Math.random() * (upperBound - lowerBound + 1) + lowerBound);
}
public synchronized void doGame(String threadName, int guessNumber) {
while (!isFinished) {
try {
if (Thread.currentThread().getName().equals(threadName)) {
if (guessNumber == targetNumber) {
System.out.println("恭喜 " + threadName + " 猜对了!");
isFinished = true;
} else if (guessNumber < targetNumber) {
System.out.println(threadName + " 猜的数字 " + guessNumber + " 偏小了!");
lowerBound = guessNumber + 1;
notifyAll();
wait();
} else {
System.out.println(threadName + " 猜的数字 " + guessNumber + " 偏大了!");
upperBound = guessNumber - 1;
notifyAll();
wait();
}
} else {
notifyAll();
wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
GuessNumberGame game = new GuessNumberGame(1, 100);
Thread guessThread = new Thread(() -> {
while (!game.isFinished) {
int guessNumber = (int) (Math.random() * (game.upperBound - game.lowerBound + 1) + game.lowerBound);
game.doGame("猜测线程", guessNumber);
}
});
Thread checkThread = new Thread(() -> {
while (!game.isFinished) {
int checkNumber = (game.lowerBound + game.upperBound) / 2;
game.doGame("检查线程", checkNumber);
}
});
guessThread.start();
checkThread.start();
}
}
```
上面的代码中,我们创建了一个`GuessNumberGame`类来表示猜数字游戏,并在构造方法中生成目标数字。`doGame`方法是游戏的核心逻辑,它使用`synchronized`关键字来保证线程安全。
在`doGame`方法中,我们首先判断当前线程是猜测线程还是检查线程,如果是猜测线程,则根据猜测的数字与目标数字之间的大小关系来输出结果,并根据结果修改边界后重新猜测;如果是检查线程,则根据边界计算出中间值作为检查的数字,并根据检查结果修改边界并等待猜测线程猜测。
在`main`方法中,我们创建了一个`GuessNumberGame`对象,并使用`Thread`类创建了两个线程,一个用于猜测,一个用于检查,然后启动这两个线程。在猜测线程和检查线程中都会调用`doGame`方法来进行猜数字游戏,直到猜中为止。
阅读全文