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

Обработка нажатия клавиш

07.01.2018, 02:38. Показов 719. Ответов 3
Метки нет (Все метки)

Помогите, пожалуйста понять где ошибка.

Есть функции: Move - двигает прямоугольник по консоли в зависимости от того, какая нажата стрелка, Fall - перемещает прямоугольник вниз через определенные промежутки времени. По отдельности они работают корректно.

Что нужно сделать, чтобы совместить их (чтобы прямоугольник падал вниз , а если нажимать стрелки - перемещался в стороны, а затем снова падал до следующего нажатия)?

Сделал так - просто падает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
while (1) 
    {
        if (_kbhit())
        {
            Move(mas, x, y);
        }
 
        else 
        {
            Fall(mas, x, y);
        }
    }
Если нужно выложить код полностью - выложу.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.01.2018, 02:38
Ответы с готовыми решениями:

Обработка нажатия клавиш
Здравствуйте! Необходимо решить следующую задачу: Есть консольное приложение, которое...

Обработка нажатия клавиш-стрелок
Добрый вечер, я делаю пошаговую демонстрационную программу различных методов сортировок в консоли,...

Обработка нажатия клавиш OPENGL
Привет! Столкнулся с такой проблемой, что для opengl, если пользуемся glutspecialfunc( для...

Обработка нажатия клавиш (Win32 Console Application)
товарищи,помогите нубу!надо написать прогу в консоли на visual studio на c++.Сама прога то простая...

3
1265 / 1023 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
07.01.2018, 09:37 2
Например:
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>
#include <ctime>
 
while (...) // внешний цикл
{
    ...
 
    clock_t start = clock();
 
    do
    {
        if (_kbhit())
        {
            // обработка нажатия клавиш
        }
 
        t = (clock() - start) / CLOCKS_PER_SEC;
    }
    while (t < tMax); // tMax - время в секундах между падениями
 
    Fall(mas, x, y);
 
    ...
}
1
0 / 0 / 1
Регистрация: 12.07.2017
Сообщений: 55
07.01.2018, 21:32  [ТС] 3
likehood, спасибо за подсказку, но так тоже только движение без падения получается - или я что-то неправильно понимаю.

Приведу свой код полностью. В цикле закомментированы строки - работает функция move, если закомментировать ее - работает функция fall. А вместе - не могу соединить.

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include<iostream>
#include <windows.h>
#include<conio.h>
#include<time.h>
using namespace std;
 
enum { Down = 80, Up = 72, Left = 75, Right = 77 };
 
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
 
void setCursor(int x, int y)
{
    COORD c = { x,y };
    SetConsoleCursorPosition(hStdOut, c);
}
 
void print(char mas[][4], int x, int y);
void clear(int x, int y);
void move(char mas[][4], int x, int y);
void fall(char mas[][4], int x, int y);
 
int main()
{
    int x = 10, y = 1;
    setCursor(x, y);
 
    char mas[4][4] = { '*','*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*', '*' };
 
    while (1)
    {
        /*if (!_kbhit())
            fall(mas, x, y);
        else*/
            move(mas, x, y);
    }
    return 0;
}
 
void print(char mas[][4], int x, int y)
{
    for (int i = 0; i < 4; i++)
    {
        setCursor(x, y + i);
        for (int j = 0; j < 4; j++)
            cout << mas[i][j];
    }
}
 
void clear(int x, int y)
{
    for (int i = 0; i < 4; i++)
    {
        setCursor(x, y + i);
        for (int j = 0; j < 4; j++)
            cout << ' ';
    }
}
 
void move(char mas[][4], int x, int y)
{
    print(mas, x, y);
 
    int input;
    do
    {
        input = _getch();
        switch (input)
        {
        case Up:
        {
            if (y < 1)
                break;
            else
            {
                clear(x, y);
                y--;
                print(mas, x, y);
            }
        } break;
 
        case Down:
        {
            if (y > 20)
                break;
            else
            {
                clear(x, y);
                y++;
                print(mas, x, y);
            }
        } break;
 
        case Left:
        {
            if (x < 2)
                break;
            else
            {
                clear(x, y);
                x--;
                print(mas, x, y);
            }
        } break;
 
        case Right:
        {
            if (x > 20)
                break;
            else
            {
                clear(x, y);
                x++;
                print(mas, x, y);
 
            }
        } break;
        }
    } while (input != 27);
}
 
void fall(char mas[][4], int x, int y)
{
    while (y < 20)
    {
        clear(x, y);
        y++;
        print(mas, x, y);
        Sleep(1000);
    }
}
0
1265 / 1023 / 469
Регистрация: 25.12.2016
Сообщений: 3,331
07.01.2018, 22:31 4
Pupil_, в вашем коде нет вызова функции clock(). Может в этом проблема?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.01.2018, 22:31

Потоки:обработка нажатия клавиш; вычисления,прорисовка
Доброго времени суток,господа! Делаю курсовую - игру &quot;змейка&quot;,тема изъезженная,да и не об этом...

Нажатия клавиш
В mfc нужно чтобы при нажатии клавиш, происходило действие. С помощью WM_KEYDOWN, пытался сделать,...

Имитация нажатия клавиш
как только и не пытался всё выводит одну и туже ошибку, помогите начинающему c++ юзеру #include...

Имитация нажатия клавиш С/С++
Задача такая: Программа должна имитировать нажатие клавиш в фоновом режиме. То-есть она должна...


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

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

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