C++gotoxy退出控制台

C++ gotoxy out of console

本文关键字:控制台 退出 C++gotoxy      更新时间:2023-10-16

我在使用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,我的cousor实际上可能会去——比方说(-1,-6)。

如何防止无效索引

您使用的代码如:

    y--;   or  x++;

以计算新的光标位置。

您可以避开int运算符,并实现一个小函数来将值调整到所需的方向,并限制结果。(到边缘,或者你可能会选择包装

考虑这个边缘约束的例子:(使用顶部、底部作为屏幕限制)

  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 实现类似的功能

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