WASD движение с ncurses (не уверен, почему это не работает) - PullRequest
0 голосов
/ 10 января 2020

Я хотел создать программу с тем, что я только что узнал в ncurses. С его помощью пользователь должен иметь возможность рисовать с # на экране, используя WASD. вот код, который я сделал:

#include<stdio.h>
#include<ncurses.h>

int main (void)
{
        initscr();
        noecho();
        int coord_x = 10;
        int coord_y = 10;
        char direccion;
        mvwprintw(stdscr,coord_y,coord_x,"#");
        while (1)
        {
                refresh();
                direccion = getchar();
                switch (direccion)
                {
                  case 'w':
                        coord_y -= 1;
                  case 's':
                        coord_y += 1;
                  case 'a':
                        coord_x -= 1;
                  case 'd':
                        coord_x += 1;
                  case 'q':
                        break;
                  default:
                        continue;
                }
                if (coord_x == -1 && coord_y == -1) { coord_y += 1;coord_x += 1;}
                mvwprintw(stdscr,coord_y,coord_x,"#");
                if (direccion == 'q') {break;}
        }
        endwin();
        return 0;
}

Но я не совсем уверен, почему # не двигается ни вверх, ни влево. Я думаю, что проблема в этой части:

direccion = getchar();
                switch (direccion)
                {
                  case 'w':
                        coord_y -= 1;
                  case 's':
                        coord_y += 1;
                  case 'a':
                        coord_x -= 1;
                  case 'd':
                        coord_x += 1;
                  case 'q':
                        break;
                  default:
                        continue;
                }

Но я действительно не уверен, вы знаете, почему это не работает?

РЕДАКТИРОВАТЬ: Спасибо всем, теперь я понял, что я просто тупой и забыл, как пользоваться выключателем

1 Ответ

2 голосов
/ 10 января 2020

Вам нужно добавить break s после каждого присваивания в вашем операторе switch:

switch (direccion) {
case 'w':
    coord_y -= 1;
    break; /* <-- here */
case 's':
    coord_y += 1;
    break; /* <-- here */
case 'a':
    coord_x -= 1;
    break; /* <-- here */
case 'd':
    coord_x += 1;
    break; /* <-- here */
case 'q':
    break;
default:
    continue;
}

Поведение case по умолчанию - «провалиться» к следующему, так что если вы нажмите w, чтобы выполнить все назначения coord_x и coord_y, а не только те, которые вы намереваетесь.

...