Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 24

Управляемая точка в командной строке

03.08.2012, 17:11. Показов 2819. Ответов 11

Студворк — интернет-сервис помощи студентам
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <iostream>
#include <string>
#include <Windows.h>
#include <stdio.h>
 
using namespace std;
string x[1000];
string y[1000];
int acikl, bcikl;
void vniz();
void vverh();
void vlevo();
void vpravo();
 
void vniz()
{
            for (int a = 0; a < 1000; ++a)
            {
                cout << y[bcikl+a] << x[acikl] << ".";
                system("cls");
                if (GetAsyncKeyState(VK_UP))
                {
                    bcikl += a;
                    vverh();
                }
                if (GetAsyncKeyState(VK_LEFT))
                {
                    bcikl += a;
                    vlevo();
                }
                if (GetAsyncKeyState(VK_RIGHT))
                {
                    bcikl += a;
                    vpravo();
                }
                
            }
}
 
void vverh()
    {
        for (int a = 0; a < 1000; ++a)
        {
            cout << y[bcikl-a] << x[acikl] << ".";
            system("cls");
            if (GetAsyncKeyState(VK_DOWN))
            {
                bcikl = bcikl-a;
                vniz();
            }
            if (GetAsyncKeyState(VK_LEFT))
            {
                bcikl = bcikl - a;
                vlevo();
            }
            if (GetAsyncKeyState(VK_RIGHT))
            {
                bcikl = bcikl - a;
                vpravo();
            }
        }
    }
 
void vlevo()
    {
                for (int a = 0; a < 1000; ++a)
                {
                    cout << y[bcikl]<< x[acikl-a] << ".";
                    system("cls");
                    if (GetAsyncKeyState(VK_UP))
                    {
                        acikl = acikl - a;
                        vverh();
                    }
                    if (GetAsyncKeyState(VK_DOWN))
                    {
                        acikl = acikl - a;
                        vniz();
                    }
                    if (GetAsyncKeyState(VK_RIGHT))
                    {
                        acikl = acikl - a;
                    vpravo();
                    }
                }
    }
 
void vpravo()
    {
        for (int a = 0; a < 1000; ++a)
        {
            cout << y[bcikl]<< x[acikl+a] << ".";
            system("cls");
            if (GetAsyncKeyState(VK_DOWN))
            {
                acikl += a;
                vniz();
            }
            if (GetAsyncKeyState(VK_UP))
            {
                acikl += a;
                vverh();
            }
            if (GetAsyncKeyState(VK_LEFT))
            {
                acikl += a;
                vlevo();
            }
        }
    }
 
int main()
{
    for (int i = 0; i < 1000; ++i)
    {
        for(int b = 0; b < i; ++b)
        {
            x[i] += " ";
        }
    }
    for (int i = 0; i < 1000; ++i)
    {
        for(int b = 0; b < i; ++b)
        {
            y[i] += "\n";
            
        }
    }
 
    for (int i = 0; i < 1000; ++i)
    {
            if (GetAsyncKeyState(VK_DOWN))
            {
                vniz();
            }
            if (GetAsyncKeyState(VK_UP))
            {
                vverh();
            }
            if (GetAsyncKeyState(VK_LEFT))
            {
                vlevo();
            }
            if (GetAsyncKeyState(VK_RIGHT))
            {
                vpravo();
            }
            Sleep(1000);
    }
}
Можно ли упростить этот код? Или его вообще стоит переписать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.08.2012, 17:11
Ответы с готовыми решениями:

Кодировка в командной строке
пишу программу на ассемблере MASM, программа должна выводить какое-то сообщение и некий массив чисел но столкнулся с проблемой- когда...

Тетрис в командной строке
Возможно ли написать тетрис прямо в командной строке?Если да то как вывести квадрат который в тетрисе основа всех фигур)

Компиляция в командной строке
Всем привет!!! Ребят не могу откомпилить файлик. Имеется 2 файлика директория котрых: ...

11
0 / 0 / 0
Регистрация: 03.08.2012
Сообщений: 6
03.08.2012, 19:56
avlodush, можно упростить.
Я так думаю, что:
1. Проще будет взять двухмерный массив field[y][x] тебе самому будет удобнее работать;
2. Его просто отобразить
C++
1
2
3
4
5
6
7
  for(int y = 0; y < 13; y++) {
    for(int x = 0; x < 20; x++) {
      field[y][x] = ' ';
    }
  cout << '\n';
  }
}
3. Точкой управлять проще, отрисовывая ее через позицию курсора, координаты которого задают кнопки управления.
4. Детектировать нажатие удобнее через функцию _getch(), а коды перенаправлять в конструкцию switch{}, где будут задаваться координаты курсора.
5. А в сочетании с enum keys {} визуально будет совсем просто.
0
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 24
03.08.2012, 19:58  [ТС]
Цитата Сообщение от Faerror Посмотреть сообщение
avlodush, можно упростить.
Я так думаю, что:
1. Проще будет взять двухмерный массив field[y][x] тебе самому будет удобнее работать;
2. Его просто отобразить
C++
1
2
3
4
5
6
7
  for(int y = 0; y < 13; y++) {
    for(int x = 0; x < 20; x++) {
      field[y][x] = ' ';
    }
  cout << '\n';
  }
}
3. Точкой управлять проще, отрисовывая ее через позицию курсора, координаты которого задают кнопки управления.
4. Детектировать нажатие удобнее через функцию _getch(), а коды перенаправлять в конструкцию switch{}, где будут задаваться координаты курсора.
5. А в сочетании с enum keys {} визуально будет совсем просто.
Спасибо большое, буду пробовать
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
03.08.2012, 22:47
Цитата Сообщение от avlodush Посмотреть сообщение
Можно ли упростить этот код? Или его вообще стоит переписать?
- Переписать стоит и упростить можно
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
#include <stdio.h>
#include <windows.h>
 
BOOL ParseVirtualKey(int vKey)
{
    BOOL bRet = FALSE;
    if(GetAsyncKeyState(vKey))
        bRet = GetAsyncKeyState(vKey);
    return bRet;
}
 
int main()
{
    BOOL bExit = FALSE;
    printf("PARSING ARROWS\n");
    printf("ESC FOR EXIT\n");
    while(!bExit)
    {
        if(ParseVirtualKey(VK_LEFT))
            printf("LEFT ARROW\n");
        else
        if(ParseVirtualKey(VK_RIGHT))
            printf("RIGHT ARROW\n");
        else
        if(ParseVirtualKey(VK_DOWN))
            printf("DOWN ARROW\n");
        else
        if(ParseVirtualKey(VK_UP))
            printf("UP ARROW\n");
        else
        if(bExit = ParseVirtualKey(VK_ESCAPE))
            printf("ESCAPE - PROGRAM CLOSE\n");
        Sleep(100);//Чтобы не нагружать CPU
    }
    return 0;
}
Миниатюры
Управляемая точка в командной строке  
1
03.08.2012, 22:49

Не по теме:

PS: avlodush, можно нескромный вопрос - вы код из моего блога брали
https://www.cyberforum.ru/blogs/34326/blog263.html ???
Если да, то зачем повыбрасывали

C
1
 keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);//Отжимаем кнопку
она ведь нужна была (иначе нажатие на стрелку приводит к двойной индикации, так что имейте это ввиду;)

0
0 / 0 / 0
Регистрация: 12.10.2011
Сообщений: 24
06.12.2012, 06:49  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

PS: avlodush, можно нескромный вопрос - вы код из моего блога брали
https://www.cyberforum.ru/blogs/34326/blog263.html ???
Если да, то зачем повыбрасывали

C
1
 keybd_event(VK_LEFT, 0, KEYEVENTF_KEYUP, 0);//Отжимаем кнопку
она ведь нужна была (иначе нажатие на стрелку приводит к двойной индикации, так что имейте это ввиду;)

Нет, код брал не из вашего блога, но спасибо буду знать =)
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
06.12.2012, 07:21
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(GetAsyncKeyState(vKey))
bRet = GetAsyncKeyState(vKey);
А в чём глубинный смысл двойного вызова?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
06.12.2012, 12:05
Deviaphan, первый кнопка вниз,второй вверх,т.е фиксим нажатие кнопки
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
06.12.2012, 13:10
Какой ещё кнопка вверх? Если нажать кнопку и не отпускать (пол часа, например), то в течении этого получаса она будет возвращать "нажатое" состояние. Поэтому функция ParseVirtualKey вдвое уменьшает частоту срабатывания кнопки и всё. Т.е. Sleep сделал бы это гораздо надёжнее. Эта функция не обрабатывает нажатия и отпускания, она возвращает текущее состояние кнопки, каким бы оно ни было.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
08.12.2012, 16:50
Deviaphan, и при отпускании кнопки через пол часа получили бы сигнал вверх и при концепции - одна GetAsyncKeyState с одного нажатия кнопки получили бы 2 возврата ИСТИНА,тобишь посчитали за 2 нажатия одно!
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.12.2012, 09:36
Всё, прочитал описание. Ты почти прав. Я с чего-то взял, что она BOOL возвращает, а там упакованная информация.
По идее, нужно функцию ParseVirtualKey переписать так, чтобы она отрабатывала именно на "нажать-отпустить", т.е. проверять, изменилось ли состояние кнопки между проверками. Версия которая у тебя, работает корректно только при быстрых нажатиях (а когда повышаю частоту опроса клавиатуры, то и твоя функция не правильно отрабатывает).
Я вообще по глупости вручную хранил предыдущее состояние клавиш, а она в API уже реализовано, как оказывается. Таааак стыыыдноо.)

Разобрался, почему у меня второго срабатывания не было. Это другой поток успевал в процессе работы опросить состояние и младший бит сбрасывался.
0
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
18.05.2014, 11:45
зачем вы всё усложняете, я задачи со стрелками в школе проходил:

у каждой стрелочки есть свой код, вверх это 72, влево 75, вправо 77, вниз 80, вот программа ,которая при нажатии на клавишу будет показывать её код(сам написал, не копипаст):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
    char a;
    while((a = getch())!=27) // выходит, если клавиша, которую ввёл равна 27(27 - Esc)
    {
        cout << (int)a << endl; /* выводится код самой клавиши с преобразованием в число, иначе бы вывелись символы H M и что-то ещё, 1ое число будет -37, это означает что какая-то стрелка, а потом даётся код этой стрелки */
    }
}
ещё, если кому-нибудь понадобится, есть функция kbhit() которая возвратит true, если нажата клавиша, к примеру
char a;
while(true)
if(kbhit())
cout << a = getch();

kbhit() не требует нажимать клавишу ещё раз, чтобы она попала в getch()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2014, 11:45
Помогаю со студенческими работами здесь

Задачи в командной строке
Ребята прошу помощи ! Нужно решить такую задачу в командной строке Заранее благодарен !

PHP в командной строке
Вообще ни одну из функций не видит! Call to undefined function curl_init()!

Параметры в командной строке
При запуске программы с командной строки, ей также с cmd передаются параметры. Затем в программе эти параметры присваиваются или char a или...

Иероглифы в командной строке
Пользуюсь visual studio2017 community,изучаю язык С. Пишу первую программу по учебнику Прата: #include &lt;stdio.h&gt; int main(void) ...

Изображения в командной строке
Какие инструменты/функции надо для того чтобы выводить изображения в командную строку windows, для того чтобы можно было рисовать символами...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru