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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
viking-san
0 / 0 / 0
Регистрация: 25.01.2014
Сообщений: 5
#1

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

25.01.2014, 04:10. Просмотров 533. Ответов 8
Метки нет (Все метки)

пробую сделать что-то вроде змейки в консольке, но ни как не пойму как гуглить такую проблему:
по маленькому полю перемещается курсор, каждую секунду двигаясь в определенном направлении, а как в этом цикле сделать так, чтобы по нажатию клавиши он менял свое направление(в данном случае менять значение обычной переменной).

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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 04:10     что-то вроде события в консоли
Посмотрите здесь:
События по таймеру (в консоли) C++
C++ Не обрабатываются события мыши в консоли
Обработка события нажатия клавиши мыши в консоли C++
Что-то вроде базы данных C++
Структуры (Что-то вроде базы данных по бытовой технике) C++
что то вроде программки,которая проверяет Hosts и лечит C++
Нужен пример того, что работать вроде не должно, но работает C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 772
Завершенные тесты: 1
26.01.2014, 01:44     что-то вроде события в консоли #4
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
Для этого я писал свою функцию для проверки нажатий нужных мне клавиш.
Пишу с мобильного,поэтому код не смогу привести,могу объяснить:
1.функцией CreateFile создаем дескриптор,который будет иметь доступ к буферу консоли с помощью CONIN$
2. отслеживаю нажата ли какая-нибудь клавиша функцией khbit()
3.функцией ReadConsole читаю буфер консоли(что было нажато)
4.получаю собственно нажатую клавишу
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
26.01.2014, 01:51     что-то вроде события в консоли #5
Цитата Сообщение от Bretbas Посмотреть сообщение
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
все правильно
Цитата Сообщение от viking-san Посмотреть сообщение
while(_kbhit())
нажата клавиша зашли в цикл, не нажата не зашли
а в цикле берем код нажатой клавиши
Цитата Сообщение от viking-san Посмотреть сообщение
select = _getch();
и обработали её
эта мулька известна еще со времен ДОС
правда здесь while нафиг не нужен достаточно if
Bretbas
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 772
Завершенные тесты: 1
26.01.2014, 01:59     что-то вроде события в консоли #6
Не прокатит...ибо на _getch() нам нужно будет что нибудь нажать,что не подходит нашим условиям.Происходит два нажатие клавиши,одно на _khbit(),второе на _getch()
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
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
189 / 48 / 7
Регистрация: 05.08.2013
Сообщений: 772
Завершенные тесты: 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++ Обход упорядоченного дерева. Не могу понять на что ругается прогорамма... Ошибок вроде как нет...
С++ задача, надо зациклить, скажите что не так, ошибку выдает в switch, про точку с запятой знаю их вроде не н C++
C++ Что-то не так в программе (при нажатии кнопок со стрелками по консоли движется символ)

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6552 / 5018 / 463
Регистрация: 14.02.2011
Сообщений: 16,741
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     что-то вроде события в консоли
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru