C ++ gotoxy超出控制台

时间:2015-12-04 19:44:36

标签: c++ cursor

使用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);
    }
}

AND:

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,我的游标可能实际上是 - 让我们说(-1,-6)。

1 个答案:

答案 0 :(得分:1)

  

如何防止无效索引

您使用以下代码:

    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

实现类似的功能

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