控制台外的 C++ gotoxy

C++ gotoxy out of console

我在使用 gotoxy() 时遇到了一个小问题。 我想否认制作可能的场景,其中 gotoxy() 绕过控制台或 (-x,-y)。

void gotoxy(int x, int y) {
    if (x >= 0 && y >= 0) {
        getch();        
        COORD kursor;
        kursor.X = x;
        kursor.Y = y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), kursor);
    }
}

并且:

void chodzenie(){
koniec = false;
while( koniec == false ){
    unsigned char znak = getch();
    switch( znak )
    {
    case 0:
    case 224: //klawisze specjalne
        znak = getch();
        switch( znak )
        {
        case 72:            //strzałka w górę
                y--;
                gotoxy(x,y);
            break;
        case 80:            //strzałka w dół
                y++;
                gotoxy(x,y);
            break;
        case 75:            //strzałka w lewo
                x--;
                gotoxy(x,y);
            break;
        case 77:            //strzałka w prawo
                x++;
                gotoxy(x,y);
            break;
        }
        znak = 0;
        break;
    case 13: //ENTER
        break;
    case 27: //ESC
        koniec = true;
        break;
    }
}

}

尽管如此,即使我有那个,如果它检查 y 和 x 是否大于 0,我的 coursor 实际上可能会去 - 比方说 (-1,-6)。

How prevent invalid index

您使用的代码如下:

    y--;   or  x++;

计算新的光标位置。

您可以回避 int 运算符并实现一个小函数来将值按照您想要的方向进行碰撞,并限制结果。 (到边缘或者你可能会选择环绕}

考虑这个边缘约束示例:(使用 TOP、BOTTOM 作为屏幕限制)

  void bmpY (int& y, int direction)
  { 
     y += direction;  

     // check bottom limit  (increasing Y moves down)
     if (direction > 0) { if (y > BOTTOM) y = BOTTOM; return; }

     if (direction < 0) { if (y < TOP)    y = TOP; return; }  

     // else direction == 0, do nothing
  }

并为 bmpX、LEFT、RIGHT 实现类似的东西

类似的简单算法可以处理换行选择。