Ncurses:从用户读取整数并将其存储为变量

时间:2018-12-09 01:24:10

标签: c ncurses conways-game-of-life

我正在尝试使用C / ncurses实施“人生游戏”。我希望游戏具有的一个功能是从用户那里获取X,Y坐标,并在这些坐标上在板上绘制形状。我有一个功能可以在板上绘制形状并正常工作。该函数的标题是:

void draw_shape(int x, int y, int shape[3][3])

绘制形状的按键是在游戏的标题状态下处理的。绘制形状功能可绘制任何形状。我唯一的问题是从用户那里获取X,Y值。

游戏的标题状态:     案例TITLE:             测试= 0;             int i,j;

        for(i = 0; i < (WELL_WIDTH-1); i++)
            for(j = 0; j < (WELL_HEIGHT-1); j++)
                cells[i][j] = create_cell(x_offset + i, y_offset + j);


        w = init_well(x_offset - 1, y_offset - 1, well_w, well_h);
        draw_well(w);
        mvprintw(y_offset + 5, x_offset + 10, "Welcome to the Game of Life!");
        mvprintw(y_offset + 7, x_offset + 9, "Press 'S' to start a new game.");
        mvprintw(y_offset + 8, x_offset + 9, "Press 'L' to load a saved game.");
        mvprintw(y_offset + 12, x_offset + 20, "-OR-");
        mvprintw(y_offset + 16, x_offset + 8, "Pick a shape to draw on the screen:");
        mvprintw(y_offset + 18, x_offset + 9, "(A) Still life   (B) Glider"); 
        mvprintw(y_offset + 19, x_offset + 9, "(C) Oscillator   (D) Random");


        keystrokes = read_keys();
        if (keystrokes == START_SAVE) {
            state = INIT; }
        if (keystrokes == LOADBOARD) {
            state = LOADGAME;
        }
        if (keystrokes == STILL_LIFE) {
            state = STILLIFE;

        }

按“ A”时,状态切换为STILLLIFE。这是我要从用户那里获取X,Y值并将其传递给drawshape函数的地方。

case STILLLIFE:

        w = init_well(x_offset - 1, y_offset - 1, well_w, well_h);
        draw_well(w);
        echo();

        int x_cord, y_cord;

        mvprintw(y_offset + 21, x_offset + 7, "Enter X, Y coordinates     for your shape: ");

理想情况下,我会执行以下操作:  scanw("%d, %d", &x_cord, &y_cord); 接着 draw_shape(x_cord, y_cord, shape); 但是当我尝试这样做时,它似乎没有用。我将尝试像这样显示x_cord和y_cord的值: mvprintw(y_offset + 23, x_offset + 7, "%d, %d", x_cord, y_cord); 但是,当我打开游戏时,在键入任何内容之前,x_cord和y_cord就会存在虚假的整数值。我尝试了许多不同的方法,但实际上我只是在寻找等同于scanf的东西。任何建议或指导将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您尚未解决此问题,则需要fflush行或手动EOF数据,或者通过多种方式scanf(或scanw等价)可能会失败。 scanf kinda sucks honestly. sscanffscanf不错,但是scanf确实有很多陷阱。常见建议是使用fread整个字符串,然后使用sscanf进行解析。或者,如果您只需要单字母输入,请考虑使用getchwgetch