我正在使用 Ncurses 库在 C++ 中制作 Pacman。我可以用我的代码移动吃 bean ,但我想移动它,这样即使我没有按任何键,吃 bean 也会继续移动,当我按下另一个方向键时,它会改变方向。现在,当我按下一个键时,吃 bean 人只会迈出一步。在吃 bean 朝那个方向移动之前,我还必须按一个键 2 或 3 次。
if (ch==KEY_LEFT)
{
int b,row,column;
getyx(stdscr,row,column);
int h;
do // do-whileloop to move the pacman left until it hits the wall
{
column-=1;
mvprintw(row,column,">"); //print the ">" symbol
refresh();
waitf(0.1); //this pauses the game for 0.1sec
attron(COLOR_PAIR(1));
mvprintw(row,column,">");
attroff(COLOR_PAIR(1));
refresh();
waitf(0.1);
mvprintw(row,(b),"O"); //showing the open mouth of pacman
refresh();
waitf(0.1);
attron(COLOR_PAIR(1));a
mvprintw(row,column,"O");
attroff(COLOR_PAIR(1));
h = getch();
}
while(h == KEY_LEFT);
}
right = getch();
在if条件下循环向右移动
up = getch();
在if条件下循环向上移动
down = getch();
oop 在 if 条件下向下移动。
最佳答案
对此的标准解决方案是 finite-state machine .角色有六种左右可能的状态:站立、向上移动、向右移动、向下移动、向左移动、死亡。按键应该改变角色的状态,而不是直接移动角色。
在如此小的应用程序中,您可以使用非常简单的实现方式,而不是实现极其灵活的有限状态机:
enum PlayerState {
Standing,
MovingUp,
MovingRight,
MovingDown,
MovingLeft,
Dead
};
然后,在您的游戏循环中,您可以添加一个非常简单的状态检查,然后对帧采取适当的操作。
switch(state) {
case Standing:
break;
case MovingUp:
player.PositionY += 1;
break;
// ...
}
最后一步是 Hook 输入,这取决于您检索输入的方法。使用回调,一个例子是:
void KeyDown(Key k) {
switch(k) {
case UpArrow:
if(state != Dead)
state = MovingUp;
break;
case RightArrow:
if(state != Dead)
state = MovingRight;
// ...
}
}
您会明白为什么在更大的项目中实现更灵活的有限状态机很重要,但希望这个示例能为您提供一个易于理解的想法。
关于c++ - 即使没有按下任何键,如何在屏幕上显示一些内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568391/