Ncurses "mvaddch()" 移动对角线

Ncurses "mvaddch()" Moves Diagonal

我正在尝试创建一个 Etch-n-sketch 游戏,当我上下移动箭头键时,光标会向右移动,无论我按下什么方向。我可以向右移动,虽然它似乎跳过了一个点,但我不能向左移动

移动绘制代码:

void moveCursor(char input)
{
  int cursorX_Pos;
  int cursorY_Pos;
  int arrows;

  getyx(stdscr, cursorY_Pos, cursorX_Pos);

  arrows = 1;
  switch(input)
  {
    case UP:
      cursorY_Pos--;
      arrows = 0;
      break;
    case DOWN:
      cursorY_Pos++;
      arrows = 0;
      break;
    case RIGHT:
      cursorX_Pos++;
      arrows = 0;
      break;
    case LEFT:
      cursorX_Pos--;
      arrows = 0;
      break;
    default:
      arrows = 1;
      break;
  }
  if (arrows == 0)
  {
    draw(cursorY_Pos,cursorX_Pos);
  }
}
void draw(int y, int x)
{
  mvaddch(y, x, '#');
  refresh();
}

我不太确定代码试图移动对角线的位置。我尝试将 mvaddch 拆分为 move 和 addch。我在不同的时间尝试过它们并且移动有效(似乎没有跳过)但是当我启用 addch 部分时,它会跳过并变为对角线。我该如何解决这个问题?

当你在屏幕上添加一个字符时,光标会移动到它后面的位置。因此,当您随后获取当前光标位置时,它是您移动到的位置右侧的一个单元格,然后再添加字符。因此,当尝试向左移动时,例如:您在 moveCursor() 中减去 1,然后在 draw().

中加 1

要么在 getyx() 之后从 cursorX_pos 中减去 1,要么保持你的坐标值独立于 curses 对光标位置的想法(即只省略 getyx() ).

为了加分,意识到目标坐标(下一次抽奖)和当前位置是两个不同的东西,并相应地进行优化。 (提示:向右移动根本不需要 move()。)