我想用我刚刚在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;
}
但是我真的不确定,您知道为什么它不起作用吗?
您需要在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_x
和coord_y
分配,而不仅仅是您打算。
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;
}