用两个线程玩猜字游戏,第一个线程负责随机给出1-100之间的整数,第二个线程负责猜出这个数。要求当第二个线程给出自己的猜测后,第一个线程都会提示“猜小了”或“猜大了”或“猜对了”。在猜数之前,要求第二个线程等待第一个线程设置好要猜测的数字。第一个线程设置好猜测的数后,两个线程还要互相等待,其原则是第二个线程给出自己的猜测后,等待第一个线程给出的提示;第一个线程给出提示后,等待第二个线程给出的猜测,如此进行,直到第二个线程给出正确的猜测后两个线程进入死亡状态。
时间: 2023-11-24 20:06:31 浏览: 57
下面是一个实现以上要求的 Python 代码:
```python
import random
import threading
class GuessGame:
def __init__(self):
self.number = None
self.lock = threading.Lock()
self.condition = threading.Condition()
def set_number(self):
with self.lock:
self.number = random.randint(1, 100)
print(f"已经设置随机数为 {self.number}")
def guess(self, num):
with self.lock:
if num == self.number:
print("恭喜你猜对了!")
return True
elif num < self.number:
print("猜小了")
else:
print("猜大了")
return False
def play(self):
t1 = threading.Thread(target=self.set_number)
t2 = threading.Thread(target=self.play_game)
t1.start()
t2.start()
t1.join()
t2.join()
def play_game(self):
with self.condition:
self.condition.wait() # 等待第一个线程设置随机数
while True:
guess_num = int(input("请猜一个 1-100 之间的整数:"))
if self.guess(guess_num):
break
with self.condition:
self.condition.notify() # 唤醒第一个线程
self.condition.wait() # 等待第一个线程给出提示
if __name__ == '__main__':
game = GuessGame()
game.play()
```
我们先定义了一个 `GuessGame` 类,里面有一个 `number` 属性表示要猜的数,以及一个互斥锁 `lock` 和一个条件变量 `condition` 用来实现线程之间的同步。在 `set_number` 方法中,我们使用互斥锁保证设置随机数的操作是原子的。在 `guess` 方法中,我们判断猜测的数与要猜的数的大小关系,并返回是否猜中了。
在 `play` 方法中,我们创建两个线程 `t1` 和 `t2`,分别用来设置随机数和进行游戏。然后启动线程并等待它们结束。
在 `play_game` 方法中,我们先用条件变量等待第一个线程设置随机数。然后进入一个循环,等待用户输入猜测的数。如果猜中了,就直接退出循环。否则,我们使用条件变量唤醒第一个线程,等待它给出提示。第一个线程给出提示后,我们再次等待用户输入猜测的数,如此循环,直到猜中为止。
这样,我们就实现了一个线程间猜字游戏的程序。
阅读全文