You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不暂停while循环时监听终止指令?文本钓鱼小游戏开发问题

解决钓鱼小游戏的非阻塞指令监听问题

你碰到的核心问题是避免输入操作阻塞钓鱼循环——普通的input()会让整个程序停下来等用户输入,打断了钓鱼的持续过程。下面给你两种实用的Python解决方案,都能实现钓鱼过程不中断,同时随时响应stop/exit指令。

方案一:多线程分离钓鱼逻辑与输入监听

这个方案最直观:把钓鱼的主循环放在一个独立线程里跑,另一个线程专门监听用户输入,用一个标志位来控制钓鱼循环的启停。代码示例如下:

import threading
import time
import random

stop_fishing = False

def fishing_loop():
    global stop_fishing
    print('You start fishing')
    while not stop_fishing:
        # 模拟钓鱼过程:随机等待1-3秒,然后随机判定是否钓到鱼
        time.sleep(random.uniform(1, 3))
        if random.random() > 0.5:
            print('You caught a fish! 🎣')
        else:
            print('You didn\'t catch anything...')
    print('You stopped fishing.')

def input_listener():
    global stop_fishing
    while True:
        command = input().strip().lower()
        if command in ['stop', 'exit']:
            stop_fishing = True
            break

if __name__ == '__main__':
    command = input("Enter command: ").strip().lower()
    if command == 'fish':
        # 启动钓鱼线程
        fishing_thread = threading.Thread(target=fishing_loop)
        fishing_thread.start()
        # 启动输入监听(主线程负责这个,因为input本身是阻塞的)
        input_listener()
        # 等待钓鱼线程结束
        fishing_thread.join()

方案说明

  • 钓鱼线程会持续运行,直到stop_fishing被设为True,完全不受输入操作影响。
  • 输入监听在主线程执行,用户随时可以输入stop或exit来触发停止信号。
  • 这里的布尔标志位是线程安全的(赋值操作是原子性的),不需要额外加锁。如果后续需要共享更复杂的数据,再考虑用threading.Lock。

方案二:异步IO实现(适合复杂并发场景)

如果你的游戏本身是基于异步架构的,用asyncio会更优雅,通过Event对象传递停止信号,避免全局变量:

import asyncio
import random

async def fishing_loop(stop_event):
    print('You start fishing')
    while not stop_event.is_set():
        # 异步模拟钓鱼等待(不会阻塞事件循环)
        await asyncio.sleep(random.uniform(1, 3))
        if random.random() > 0.5:
            print('You caught a fish! 🎣')
        else:
            print('You didn\'t catch anything...')
    print('You stopped fishing.')

async def input_listener(stop_event):
    while True:
        # 把阻塞的input转成异步操作,不影响事件循环
        command = (await asyncio.to_thread(input)).strip().lower()
        if command in ['stop', 'exit']:
            stop_event.set()
            break

async def main():
    command = (await asyncio.to_thread(input, "Enter command: ")).strip().lower()
    if command == 'fish':
        stop_event = asyncio.Event()
        # 同时运行钓鱼和输入监听任务
        await asyncio.gather(
            fishing_loop(stop_event),
            input_listener(stop_event)
        )

if __name__ == '__main__':
    asyncio.run(main())

方案说明

  • 用asyncio.Event作为线程安全的信号传递机制,比全局变量更规范。
  • asyncio.to_thread把阻塞的input()包装成异步任务,不会卡住整个事件循环。
  • 适合游戏中有多个并发任务(比如同时处理AI、渲染、输入)的场景。

额外提醒

如果你是用游戏引擎(比如Pygame、Godot)开发的,优先用引擎自带的输入监听API——比如Pygame的事件循环可以实时捕获键盘输入,不需要自己写线程或异步逻辑,更符合引擎的设计规范。

内容的提问来源于stack exchange,提问作者glennrv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:08:12