Использование kbhit() с циклом while

Вот программа.

void main( )
{
    int h, v;
    h = 1; v = 10;
    while ( !kbhit( ) || h <= 80 )
    {
        gotoxy( h, v );
        printf( "<--->" );
        delay( 200 );
        clrscr( );
        h = h + 1;
    }
    getch( );
}

Я делаю программу на C, в которой я использовал kbhit() для запуска цикла до тех пор, пока не будет нажата клавиша. поэтому здесь стрелка "<--->" будет продолжать двигаться вперед, пока не будет нажата клавиша или пока она не достигнет последнего пикселя экрана.

Я хочу, чтобы программа увеличивала h на 1 каждый раз, когда нажимается 'd', и уменьшала на 1 каждый раз, когда нажималась 'a'. то есть h++; и h--; и запустить еще один цикл, пока не будет нажат символ. Идея больше похожа на игру «Змейка», в которой змея продолжает двигаться в определенном направлении, пока не будет нажата клавиша. Помогите, пожалуйста!


person UmairKhan    schedule 08.03.2014    source источник
comment
С чем вы это компилируете?   -  person this    schedule 08.03.2014
comment
Извините, clrscr();] — опечатка.   -  person UmairKhan    schedule 08.03.2014
comment
С турбокомпрессором C.   -  person UmairKhan    schedule 08.03.2014


Ответы (1)


clrscr() должен стоять перед gotoxy и printf

В любом случае, я бы создал переменную состояния, просто чтобы указать направление, в котором должна двигаться змея, то есть что-то, что сохраняет, если пользователь нажал «a» или «d».

И я бы не вышел из цикла, просто использовал бы if(kbhit) и получил char.

int direction = 1; char control;
while (1)
{
    if(kbhit()){
       control = getch();
       switch (control){
              case 'a': direction = -1; break;
              case 'd': direction = +1; break;
              default: break;
       }
    }
    clrscr( );
    gotoxy( h, v );
    printf( "<--->" );
    delay( 200 );
    h = h + direction;
}
person Inox    schedule 08.03.2014
comment
Забыли границы экрана, но вы можете легко поместить это в цикл while (и да, while(1) не очень элегантно). - person Inox; 08.03.2014
comment
Спасибо @ThoAppelsin, вы правы. И вернемся к исходному вопросу: если вы планируете создать игру про змей, вам придется нелегко, когда вы добавите вертикальное движение. Я считаю, что лучший способ реализовать игру со змеями — использовать связанные списки. - person Inox; 08.03.2014
comment
Это сработало! Большое спасибо! Это именно то, что я искал. Да, я поставлю границы экрана, нет проблем. Установка while (control! = 'q') вместо while (1) выглядит более многообещающе, если пользователь хочет выйти из всего, что у него есть для этого нажмите «q». Еще раз спасибо, мужик! - person UmairKhan; 08.03.2014