使用Java编程实现一个多线程的赛马游戏。游戏中有4匹马,每匹马由一个线程表示,拥有1~10的随机速度和起始位置0。马匹在屏幕上移动直至到达终点1000,首个抵达者触发胜利条件。游戏过程中,线程安全地更新马匹步数,并实时打印赛马状态。
时间: 2024-10-13 15:02:47 浏览: 0
在Java中实现一个简单的多线程赛马游戏,你可以按照以下步骤操作:
1. **创建马类** (Horse) 和 **赛道类** (RaceTrack),马类包含属性如速度(speed)、位置(position)以及线程(thread),赛道类则存储终点位置。
```java
public class Horse {
private int speed;
private int position;
private Thread thread;
private RaceTrack raceTrack;
// 构造函数、getter/setter
}
public class RaceTrack {
private int finishLine;
// 构造函数、getter/setter
}
```
2. **实现Runnable接口** 或者 **使用Thread类** 对每个马进行多线程处理。让马类实现了Runnable接口并重写run()方法,每次循环更新位置并检查是否达到终点。
```java
@Override
public void run() {
while (position < raceTrack.getFinishLine()) {
synchronized (raceTrack) { // 确保线程安全
position += speed;
raceTrack.printStatus(); // 更新并打印状态
try {
raceTrack.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println("马" + getId() + " 获胜!");
}
```
3. **启动线程** 时,给每个马分配不同的速度和起始位置,同时设置finishLine为1000。
```java
List<Horse> horses = new ArrayList<>();
for (int i = 0; i < 4; i++) {
int randomSpeed = (int)(Math.random() * 10) + 1;
Horse horse = new Horse(i, 0, randomSpeed);
horse.setRaceTrack(new RaceTrack(1000));
Thread thread = new Thread(horse);
thread.start();
horses.add(horse);
}
```
4. **在RaceTrack类中维护状态并提供关键方法**,如printStatus(), wait()等。这里可以使用synchronized保证对共享资源的操作是线程安全的。
5. **添加获胜检查和唤醒其他马** 的逻辑,在某个马到达终点后,将其标记为已获胜,并使用notifyAll()唤醒还在等待的马。
```java
public synchronized void checkVictory(int winningHorseId) {
if (getWinningHorseId() == -1) {
this.winningHorseId = winningHorseId;
notifyAll();
}
}
public synchronized void printStatus() {
// 打印当前所有马的状态
}
```
6. **比赛结束后的清理工作**,比如停止未完成的线程,关闭资源等。