带有ncurses的WASD运动(不确定为什么不起作用)

问题描述 投票:0回答:2

我想用我刚刚在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;
                }

但是我真的不确定,您知道为什么它不起作用吗?

c ncurses
2个回答
0
投票

您需要在switch语句中的每个分配之后添加break

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_xcoord_y分配,而不仅仅是您打算。


0
投票

In c switch处于“通过”状态,并继续执行以下case语句,直到开关中断或结束。

每种情况下,您需要添加一个break

            switch (direccion)
            {
              case 'w':
                    coord_y -= 1;
                    break;
              case 's':
                    coord_y += 1;
                    break;
              case 'a':
                    coord_x -= 1;
                    break;
              case 'd':
                    coord_x += 1;
                    break;
              case 'q':
                    break;
              default:
                    continue;
            }
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.