Форум программистов, компьютерный форум CyberForum.ru

что-то вроде события в консоли - C++

Восстановить пароль Регистрация
 
viking-san
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 5
25.01.2014, 04:10     что-то вроде события в консоли #1
пробую сделать что-то вроде змейки в консольке, но ни как не пойму как гуглить такую проблему:
по маленькому полю перемещается курсор, каждую секунду двигаясь в определенном направлении, а как в этом цикле сделать так, чтобы по нажатию клавиши он менял свое направление(в данном случае менять значение обычной переменной).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <time.h>
#include <conio.h>
 
using namespace std;
 
int main()
{
    // Pole - место для маневра, поле по которому будет перемещаться объект
    // а - как будет выглядеть объект, select - кнопка направления движения объекта
    char Pole[400],a('+'),select;
    // b - местоположение объекта в "поле", f - реализация движения(+1 это вправо, 
    // +80 это вниз, -1 влево, -80 вверх)
    // переменные c и d, в данном случае, позволяют в цикле каждую секунду выполнять перемешение
    int b(130),f(1),c(clock()/1000),d(c-1);
 
    // рисуем поле
    for(int i(0);i<400;i++)
        Pole[i] = ' ';  
    
    Pole[400] = '\0';
    Pole[b] = a;
 
    // сам процесс
    while(1)
    {
        // обычный гетч, по очевидным причинам, тут не подходит
        //select = _getch();
 
        //switch(select)
        //{
        //  case 75:/*b--;*/    f = -1; break;
        //  case 72:/*b-=80;*/  f = -80;break;
        //  case 77:/*b++;*/    f = 1;  break;
        //  case 80:/*b+=80;*/  f = 80; break;
        //}
 
        // благодаря данному if'у действие происходит каждую секунду 
        if(c == d + 1)
        {
            // последнее место положение становиться пустым, а на новом отображается объект
            Pole[b] = ' ';
            b += f;
            Pole[b] = a;
            // каждый раз приходиться рисовать "поле" =/
            system("cls");
            cout << Pole;
            // это чтобы в следующую секунду сработал тот if
            c++;
        }
 
        // эти чтобы объект не выходил за рамки "поля"
        if(b >= 400)    b -= 400;
        if(b <= 0)      b += 400;
        
        // чтобы проверять первый if
        d = clock()/1000;
    }
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.01.2014, 10:39     что-то вроде события в консоли #2
http://msdn.microsoft.com/en-us/library/58w7c94c.aspx
viking-san
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 5
26.01.2014, 00:34  [ТС]     что-то вроде события в консоли #3
подозрительно хорошо подошло, премного благодарен
на случай если кто-то будет гуглить опциональное использование getch():

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <time.h>
#include <conio.h>
 
using namespace std;
 
int main()
{
    const int pole(1840);
    int b(130),f(1),c(clock()/300),d(c-1);
    char Pole[pole],a('+'),select;
 
    for(int i(0);i<pole;i++)
        Pole[i] = ' ';
    Pole[pole] = '\0';
    Pole[b] = a;
 
    while(1)
    {
        while(_kbhit())
        {
            select = _getch();
            switch(select)
            {
            case 75:    f = -1; break;
            case 72:    f = -80;break;
            case 77:    f = 1;  break;
            case 80:    f = 80; break;
            }
        }
 
        if(c == d + 1)
        {
            Pole[b] = ' ';
            b += f;
            Pole[b] = a;
            system("cls");
            cout << Pole;
            c++;
        }
 
        if(b >= pole)   b -= pole;
        if(b <= 0)      b += pole;
        
        d = clock()/300;
    }
    return 0;
}
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
26.01.2014, 01:44     что-то вроде события в консоли #4
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
Для этого я писал свою функцию для проверки нажатий нужных мне клавиш.
Пишу с мобильного,поэтому код не смогу привести,могу объяснить:
1.функцией CreateFile создаем дескриптор,который будет иметь доступ к буферу консоли с помощью CONIN$
2. отслеживаю нажата ли какая-нибудь клавиша функцией khbit()
3.функцией ReadConsole читаю буфер консоли(что было нажато)
4.получаю собственно нажатую клавишу
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
26.01.2014, 01:51     что-то вроде события в консоли #5
Цитата Сообщение от Bretbas Посмотреть сообщение
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
все правильно
Цитата Сообщение от viking-san Посмотреть сообщение
while(_kbhit())
нажата клавиша зашли в цикл, не нажата не зашли
а в цикле берем код нажатой клавиши
Цитата Сообщение от viking-san Посмотреть сообщение
select = _getch();
и обработали её
эта мулька известна еще со времен ДОС
правда здесь while нафиг не нужен достаточно if
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
26.01.2014, 01:59     что-то вроде события в консоли #6
Не прокатит...ибо на _getch() нам нужно будет что нибудь нажать,что не подходит нашим условиям.Происходит два нажатие клавиши,одно на _khbit(),второе на _getch()
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
26.01.2014, 02:13     что-то вроде события в консоли #7
Цитата Сообщение от Bretbas Посмотреть сообщение
Происходит два нажатие клавиши,одно на _khbit(),второе на _getch()
а ты с какой скорость клавиши нажимаешь?
проверь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "conio.h"
 
int main()
{
while(1)
  {
    if(_kbhit())
    {
    char ch = _getch();
    switch(ch)
        {
         case 'a':
         case 'A':   printf("A"); break;
          }
     if(ch=='Q' || ch=='q')
     break;
      }
 
   }
return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от Bretbas Посмотреть сообщение
Происходит два нажатие клавиши,одно на _khbit(),второе на _getch()
клавиша нажата
_khbit() возврашает ИСТИНУ входим в блок
и тут же срабатывает _getch()
он не ждет отпускания и нажатия клавиши
нет конечно можно умудрится между двумя этими функциями отпусть клавишу
но это нужно очень сильно постараться
Bretbas
22 / 17 / 1
Регистрация: 05.08.2013
Сообщений: 468
Завершенные тесты: 1
26.01.2014, 02:15     что-то вроде события в консоли #8
Не могу)Завтра только за компом буду)Проверю обязательно)Может ты и прав...но у меня тоже работает хихи :-p
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 02:18     что-то вроде события в консоли
Еще ссылки по теме:

Структуры (Что-то вроде базы данных по бытовой технике) C++
Нужен пример того, что работать вроде не должно, но работает C++
C++ Вроде переполнение, а вроде бы и нет

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,058
26.01.2014, 02:18     что-то вроде события в консоли #9
второй вариан показывает что обработка практически в реальном времени
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "conio.h"
 
int main()
{
char tst='0';
while(1)
    {
    if(_kbhit())
     {
    char ch = _getch();
      switch(ch)
          {
           case 'a':
           case 'A': tst++; break;
           case 'z':
           case 'Z': tst--; break;
           }
     if(ch=='Q' || ch=='q')
     break;
       }
  printf("%c",tst);
   }
    return 0;
}
Yandex
Объявления
26.01.2014, 02:18     что-то вроде события в консоли
Ответ Создать тему
Опции темы

Текущее время: 14:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru