Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
viking-san
0 / 0 / 1
Регистрация: 25.01.2014
Сообщений: 5
1

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

25.01.2014, 04:10. Просмотров 748. Ответов 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 04:10
Ответы с готовыми решениями:

События по таймеру (в консоли)
Как в консоли можно сделать что бы какой-то участок кода выполнялся через...

Не обрабатываются события мыши в консоли
Препод дал код, который ,как пример, показывает обработку событий мыши. Так...

Обработка события нажатия клавиши мыши в консоли
Здравствуйте господа програмисты!!!Может кто нибудь написать элементарный...

Что-то вроде базы данных
Извините за название темы, лучше не смог обозвать ее. Простите если напсал не...

Что-то вроде класса в C (без плюсов)
Сразу прошу меня простить, за то что задаю вопрос о С без плюсов. Раздел с С я...

8
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.01.2014, 10:39 2
http://msdn.microsoft.com/en-us/library/58w7c94c.aspx
1
viking-san
0 / 0 / 1
Регистрация: 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;
}
0
Bretbas
Каждому свое
519 / 205 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
26.01.2014, 01:44 4
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
Для этого я писал свою функцию для проверки нажатий нужных мне клавиш.
Пишу с мобильного,поэтому код не смогу привести,могу объяснить:
1.функцией CreateFile создаем дескриптор,который будет иметь доступ к буферу консоли с помощью CONIN$
2. отслеживаю нажата ли какая-нибудь клавиша функцией khbit()
3.функцией ReadConsole читаю буфер консоли(что было нажато)
4.получаю собственно нажатую клавишу
0
ValeryS
Модератор
7266 / 5520 / 692
Регистрация: 14.02.2011
Сообщений: 18,713
26.01.2014, 01:51 5
Цитата Сообщение от Bretbas Посмотреть сообщение
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
все правильно
Цитата Сообщение от viking-san Посмотреть сообщение
while(_kbhit())
нажата клавиша зашли в цикл, не нажата не зашли
а в цикле берем код нажатой клавиши
Цитата Сообщение от viking-san Посмотреть сообщение
select = _getch();
и обработали её
эта мулька известна еще со времен ДОС
правда здесь while нафиг не нужен достаточно if
0
Bretbas
Каждому свое
519 / 205 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
26.01.2014, 01:59 6
Не прокатит...ибо на _getch() нам нужно будет что нибудь нажать,что не подходит нашим условиям.Происходит два нажатие клавиши,одно на _khbit(),второе на _getch()
0
ValeryS
Модератор
7266 / 5520 / 692
Регистрация: 14.02.2011
Сообщений: 18,713
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()
он не ждет отпускания и нажатия клавиши
нет конечно можно умудрится между двумя этими функциями отпусть клавишу
но это нужно очень сильно постараться
0
Bretbas
Каждому свое
519 / 205 / 81
Регистрация: 05.08.2013
Сообщений: 1,610
Завершенные тесты: 2
26.01.2014, 02:15 8
Не могу)Завтра только за компом буду)Проверю обязательно)Может ты и прав...но у меня тоже работает хихи :-p
0
ValeryS
Модератор
7266 / 5520 / 692
Регистрация: 14.02.2011
Сообщений: 18,713
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;
}
1
26.01.2014, 02:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.01.2014, 02:18

Структуры (Что-то вроде базы данных по бытовой технике)
Всем доброго времени суток. Дали нам задачу по работе со struct. Мне нужно...

что то вроде программки,которая проверяет Hosts и лечит
void main (){ int c=0; FILE...

OpenGL что не так в коде? вроде все нормально
Собственно вот код, я сижу под убунтой 9.10 и он ругаеться пишет...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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