Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
4 / 4 / 3
Регистрация: 13.07.2014
Сообщений: 129
1

Осуществить движение змейки без задержки на ожидания ввода

23.07.2015, 17:36. Показов 2664. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я вот пишу змейку и у меня встал вопрос. Змейка движется сама, то есть мы управляем только ее поворотом. Но управление производится с помощью _getch() который перехватывает кнопки W, A, S, D. Но когда _getch() начинает работать, змейка не может двигаться в это время, так как все переходит именно к функции _getch() и пока не нажмешь кнопу, все будет стоять на месте. Так вот, как реализовать одновременно движение змейки и ожидание клавиши?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2015, 17:36
Ответы с готовыми решениями:

Получить код нажатой клавиши без ожидания ввода в консоли
Задание сделать консольный арканоид. Естественно, что нужно получить управление и при этом игра...

Движение змейки
Никак не получается сделать движение змейки с последующим присоединением элементов к ней при...

Движение змейки
Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles...

Реализовать движение змейки
Помогите сделать курсовую из turbo pascal в ABC! uses crt,graph; {подключаем модули Crt и Graph}...

6
6 / 6 / 4
Регистрация: 13.07.2015
Сообщений: 23
23.07.2015, 17:51 2
Что такое _getch? Установите таймер и обрабатывайте сообщение WM_CHAR. Тогда змейка будет двигаться
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
23.07.2015, 17:55 3
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Есть функция kbhit (_kbhit для MSVC) она возвращает 0, если буфер клавиатуры пуст.
0
4 / 4 / 3
Регистрация: 13.07.2014
Сообщений: 129
23.07.2015, 17:56  [ТС] 4
_getch()? Ожидает нажатие клавиши и возвращает ее код

Добавлено через 34 секунды
Цитата Сообщение от shmkv Посмотреть сообщение
Есть функция kbhit (_kbhit для MSVC) она 0, если буфер клавиатуры пуст.
Попробую, спасибо
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.07.2015, 17:56 5
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
#include <windows.h>
#include <iostream>
using namespace std;
 
int main()
{
    HDC hDC = GetDC(GetConsoleWindow());
    HPEN pen = CreatePen(PS_SOLID, 5, RGB(255, 255, 255)); // ободок белый
    SelectObject(hDC, pen);
    
    int step = 1;
    double x, y;
    x = y = 10;
 
    while(true)
    {
        if(GetAsyncKeyState(VK_LEFT))
        {
            x -= step;
        }
        if(GetAsyncKeyState(VK_RIGHT))
        {
            x += step;
        }
        if(GetAsyncKeyState(VK_UP))
        {
            y -= step;
        }
        if(GetAsyncKeyState(VK_DOWN))
        {
            y += step;
        }
        if(GetAsyncKeyState(VK_ESCAPE))
        {
            exit(0);
        }
        MoveToEx(hDC, x, y, NULL);
        LineTo(hDC, x, y);
        Sleep(10);
    }
    DeleteObject(pen);
}
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
#include <iostream> 
#include <windows.h>
#include <conio.h>
using namespace std;
enum class Keys
{
    NOSET,
 
    LEFT = 75,
    RIGHT = 77,
    TOP = 72,
    DOWN = 80,
    ESC = 27,
    SPACE = 32,
    ENTER = 13,
 
};
void main()
{
    while(true)
    {
        if(_kbhit()) // слушатель нажатия на клаву
        {
            switch(static_cast<Keys>(_getch())) // ждёт нажатия на клаву без Enter после этого
            {
                case Keys::TOP: //вверх
                    cout << "Up" << endl;
                    break;
                case Keys::DOWN: //вниз
                    cout << "Down" << endl;
                    break;
                case Keys::LEFT: //влево 
                    cout << "left" << endl;
                    break;
                case Keys::RIGHT: //вправо
                    cout << "Right" << endl;
                    break;
                case Keys::ESC: //вправо
                    exit(0);
                    break;
            }           
        }       
    }   
}
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
23.07.2015, 17:58 6
Все почему-то сразу решили, что ТС пишет под win...
0
4 / 4 / 3
Регистрация: 13.07.2014
Сообщений: 129
23.07.2015, 18:23  [ТС] 7
Спасибо, разобрался! Но что-то с движением тяжко. Я за поле взял двумерный массив, который заполнен точками. А в середине три нуля, это собственно змейка. Передвижение осуществляется смещением этих нулей на какое-то расстояние, как сместить? Если еще учесть, что нули будут добавляться. Что-то не выходит: то вообще не двигается, то одна часть змейки в начале поля, а другая в конце.
0
23.07.2015, 18:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2015, 18:23
Помогаю со студенческими работами здесь

Как происходит движение змейки?
Подскажите пожалуйста,как происходит движение змейки? Вот она съедает кубик,и я делаю...

Движение змейки - разобрать код
Доброе время суток. Есть задание написать змейку, которая ползает по экрану. Искал подобные темы,...

Реализация ожидания ввода
#include&lt;stdio.h&gt; int main (void) { float kat_1 = 17850; float kat_2 = 23900; ...

Scanner без задержки
Я, если честно, хреновый пользователь jav'ой, но кое-что знаю. Так вот: когда мы пишем стандартный...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru