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

使用C语言Ncurses库开发Wordle游戏时退格键功能异常求助

解决Ncurses Wordle游戏退格键失效问题

你的代码存在几个关键问题导致退格功能异常,以下是问题分析和修复方案:

问题点分析

  1. 输入模式配置缺失
    • cbreak()调用太晚,且未启用keypad()支持。ncurses需要在初始化后立即开启cbreak()(禁用行缓冲)和keypad(win, TRUE)(识别特殊按键如KEY_BACKSPACE),否则特殊键值无法被正确捕获。
  2. 退格逻辑错误
    • 使用getparx()/getpary()获取的是窗口的起始坐标,而非当前光标位置,无法定位到要删除的字符。
    • 退格时未回退输入索引i,也没有正确清除单个字符并移动光标,而是直接清空到行尾,不符合Wordle的输入逻辑。
  3. 窗口资源管理不当
    • 每次循环新建chenar窗口但未调用delwin()销毁,会造成内存泄漏。
    • 多余的wgetch(chenar)会阻塞输入流程,应该统一使用主窗口的wgetch()处理输入。

修复后的代码

#include <ncurses.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main(int argc, char **argv) {
    initscr();
    noecho();
    curs_set(0);
    // 提前配置输入模式,启用特殊按键识别
    cbreak();
    int Y_Max, X_Max;
    getmaxyx(stdscr, Y_Max, X_Max);
    WINDOW *win = newwin(Y_Max / 2 + 1, X_Max / 4, Y_Max / 4, X_Max / 4);
    box(win, 0, 0);
    mvwprintw(win, 2, 25, "WORDLE");
    // 启用窗口的特殊按键支持
    keypad(win, TRUE);
    wrefresh(win);
    wgetch(win);

    char s[100];
    for (int j = 0; j < 6; j++) {
        WINDOW *chenar = newwin(3, 7, Y_Max / 4 + 4 + j, X_Max / 4 + 23);
        box(chenar, 0, 0);
        wrefresh(chenar);
        int i = 0;
        while (i < 5) {
            int ch = wgetch(win);
            // 处理退格键(覆盖不同终端的键值)
            if (ch == 127 || ch == KEY_BACKSPACE || ch == '\b') {
                if (i > 0) {
                    i--;
                    // 移动光标到前一个字符位置,清除该字符
                    mvwaddch(chenar, 1, 1 + i, ' ');
                    wmove(chenar, 1, 1 + i);
                    wrefresh(chenar);
                }
            } else if (isalpha(ch)) {
                // 统一转为大写字母
                s[i] = toupper(ch);
                mvwaddch(chenar, 1, 1 + i, s[i]);
                wrefresh(chenar);
                i++;
            }
            // 忽略其他无效按键
        }
        // 销毁窗口释放资源
        delwin(chenar);
        // 等待确认进入下一行
        wgetch(win);
    }

    endwin();
    return 0;
}

关键修改说明

  • 提前调用cbreak()和keypad(win, TRUE),确保特殊按键能被正确识别。
  • 调整chenar窗口的大小(3行7列),让输入区域更符合Wordle的格子样式,字符放在窗口中间行(第1行,从0开始计数)。
  • 退格时先判断i > 0,回退索引后,定位到前一个字符位置,用空格覆盖并移动光标,实现单字符删除。
  • 限制输入为字母,统一转为大写,符合Wordle的输入规则。
  • 每次循环结束后调用delwin(chenar)销毁窗口,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:16:12