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

使用ncurses库实现消息自动消失功能失败的技术求助

解决ncurses文本无法自动消失的问题

问题根源分析

你的代码存在几个关键问题导致文本无法消失:

  • 空循环无实际延迟:while (messagesTicks >= 0) { messagesTicks--; }只是快速递减数值,不会等待实际时间,相当于瞬间执行完,用户根本看不到文本停留。
  • 分支逻辑错误:清除屏幕的else if分支永远不会触发——因为在if(messagesTicks>0)分支里已经把messagesTicks减到-1,分支结束后不会再进入后续的else if。
  • 随机数逻辑异常:rand() % 1的结果永远是0,只有当grop_goblin_shord1也为0时才会触发消息,逻辑不符合随机触发的预期。
  • 缺少屏幕刷新:mvprintw后没调用refresh(),文本可能根本没显示;清除后也需要refresh()才会生效。

修复后的代码

#include <curses.h>
#include <stdlib.h> // 用于rand()

constexpr int TICKS_PER_SEC = 60;

void grop_goblin_shord(int cols)
{
    // 改为在主循环中维护的全局tick变量,避免阻塞
    static int messagesTicks = 0;
    int grop_goblin_shord1, grop_goblin_shord2;

    if (num_lvl < 10)
    {
        grop_goblin_shord1 = rand() % 2;
        grop_goblin_shord2 = rand() % 2; // 修复随机数,改为%2让结果可能为0或1

        if (grop_goblin_shord1 == grop_goblin_shord2 && messagesTicks == 0)
        {
            // 触发消息时初始化tick计数
            messagesTicks = 2 * TICKS_PER_SEC;
            mvprintw(0, 1, "You received the goblin sword");
            refresh(); // 刷新屏幕显示文本
        }
    }

    // 独立处理tick递减与清除逻辑,适合游戏主循环每帧调用
    if (messagesTicks > 0)
    {
        messagesTicks--;
        // 当tick归0时清除文本
        if (messagesTicks == 0)
        {
            // 只清除消息所在行,避免清全屏影响其他内容
            mvprintw(0, 1, "%*s", cols, "");
            refresh();
        }
    }
}

关键修改说明

  1. 改用非阻塞tick机制:把messagesTicks设为静态变量,在游戏主循环每帧调用此函数时递减,避免阻塞程序运行。如果一定要阻塞等待,可替换为napms(2000)(等待2000毫秒),但阻塞会暂停游戏逻辑,不推荐。
  2. 修复随机数:rand()%2让两个随机数都有0和1的可能,触发概率正常。
  3. 正确的刷新时机:打印消息后立即refresh()显示,清除后再次refresh()更新屏幕。
  4. 精准清除:用mvprintw(0,1,"%*s", cols, "")只覆盖消息所在行,比clear()更友好,不会清除其他游戏内容。

内容的提问来源于stack exchange,提问作者Микитенко Олександр

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 04:17:57