Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

25.01.2014, 04:10. Просмотров 613. Ответов 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++):

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

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

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

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

что то вроде программки,которая проверяет Hosts и лечит - C++
void main (){ int c=0; FILE *f=fopen(&quot;C:\WINDOWS\system32\drivers\etc\hosts&quot;, &quot;a&quot;); while((c=getc(f))!=EOF){ ...

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

8
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.01.2014, 10:39 #2
http://msdn.microsoft.com/en-us/library/58w7c94c.aspx
1
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;
}
0
Bretbas
Каждому свое
351 / 121 / 32
Регистрация: 05.08.2013
Сообщений: 1,299
Завершенные тесты: 1
26.01.2014, 01:44 #4
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
Для этого я писал свою функцию для проверки нажатий нужных мне клавиш.
Пишу с мобильного,поэтому код не смогу привести,могу объяснить:
1.функцией CreateFile создаем дескриптор,который будет иметь доступ к буферу консоли с помощью CONIN$
2. отслеживаю нажата ли какая-нибудь клавиша функцией khbit()
3.функцией ReadConsole читаю буфер консоли(что было нажато)
4.получаю собственно нажатую клавишу
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,332
26.01.2014, 01:51 #5
Цитата Сообщение от Bretbas Посмотреть сообщение
полностью _khbit() вам не подойдет,так как она отслеживает нажатие клавиши,а вот какой именно?)
все правильно
Цитата Сообщение от viking-san Посмотреть сообщение
while(_kbhit())
нажата клавиша зашли в цикл, не нажата не зашли
а в цикле берем код нажатой клавиши
Цитата Сообщение от viking-san Посмотреть сообщение
select = _getch();
и обработали её
эта мулька известна еще со времен ДОС
правда здесь while нафиг не нужен достаточно if
0
Bretbas
Каждому свое
351 / 121 / 32
Регистрация: 05.08.2013
Сообщений: 1,299
Завершенные тесты: 1
26.01.2014, 01:59 #6
Не прокатит...ибо на _getch() нам нужно будет что нибудь нажать,что не подходит нашим условиям.Происходит два нажатие клавиши,одно на _khbit(),второе на _getch()
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,332
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
Каждому свое
351 / 121 / 32
Регистрация: 05.08.2013
Сообщений: 1,299
Завершенные тесты: 1
26.01.2014, 02:15 #8
Не могу)Завтра только за компом буду)Проверю обязательно)Может ты и прав...но у меня тоже работает хихи :-p
0
ValeryS
Модератор
6749 / 5158 / 493
Регистрация: 14.02.2011
Сообщений: 17,332
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
Привет! Вот еще темы с ответами:

OpenGL что не так в коде? вроде все нормально - C++
Собственно вот код, я сижу под убунтой 9.10 и он ругаеться пишет #include&lt;GL/glut.h&gt; int N = 3; int n = 0; int x; int y; ...

Нужен пример того, что работать вроде не должно, но работает - C++
Есть у кого то парочка тем для размышления:):) каких то конструкций, где вроде бы так делать нельзя, но почему то работает или не работает!?

Посмотрите пожалуйста программу ,вроде все должно работать ,но что-то не так - C++
#include &lt;iostream&gt; using namespace std; int main() { int a,b,c,i,z; c=0; cout&lt;&lt; &quot;enter the number&quot;&lt;&lt; endl; cin &gt;&gt; a; ...

Программа для отправки сообщений smtp с произвольного сервера (что-то вроде MDA) - C++
Нашёл в интернете, немного дороботал пример отправки сообщений через smtp. Ничего толкового не получилось, программа способна, так...


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

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

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