Ncurses: чтение целых чисел от пользователя и сохранение в виде переменной - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь реализовать Игру Жизни, используя C / ncurses.Одна из функций, которую я хочу, чтобы моя игра, состояла в том, чтобы взять координаты X, Y у пользователя и нарисовать фигуру на доске в этих координатах.У меня есть функция, которая рисует фигуры на доске и работает нормально.Заголовок для этой функции:

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

Нажатие клавиши для рисования фигуры обрабатывается в состоянии заголовка моей игры.Функция рисования фигур работает для рисования любых фигур.Моя единственная проблема - получение значений X, Y от пользователя.

Состояние заголовка моей игры: case TITLE: test = 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 голосов
/ 14 декабря 2018

Если вы еще не решили этот вопрос, вам нужно fflush данные EOF для линии или руки или несколькими способами scanf (или scanw эквивалент) может произойти сбой. scanf вроде честно сосет. sscanf и fscanf в порядке, но есть только много ошибок с scanf.Общий совет - использовать fread всю строку, а затем проанализировать ее с sscanf.Или, если вам просто нужны однобуквенные вводы, подумайте об использовании getch или wgetch.

...