Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 1 / 1
Регистрация: 16.05.2018
Сообщений: 31

Змейка: реализовать постоянное движения без удерживания кнопки

06.10.2018, 13:47. Показов 1848. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите с реализацией постоянного движения. Получается, что змейка движется только когда нажата кнопка, а нужно чтобы она не останавливалась
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
 
using namespace std;
 
class Snake {
public:
    int maxSize, size;
    int * body;
    int headX, headY;
    int lastB;
public:
    Snake(int mS, int hX, int hY) {
        maxSize = mS;
        body = new int[maxSize];
        headX = hX;
        headY = hY;
        size = 0;
    }
    int setHead(int arr[10][10]) {
        arr[headX][headY] = 2;
        return arr[headX][headY];
    }
    int motionUp(int arr[10][10]) {
        arr[headX][headY] = 0;
        headX--;
        if (arr[headX][headY] == 1) exit(1);
        else {
            arr[headX][headY] = 2;
            return arr[headX][headY];
        }
    }
    int motionDown(int arr[10][10]) {
        arr[headX][headY] = 0;
        headX++;
        if (arr[headX][headY] == 1) exit(1);
        else {
            arr[headX][headY] = 2;
            return arr[headX][headY];
        }
    }
    int motionRight(int arr[10][10]) {
        arr[headX][headY] = 0;
        headY++;
        if (arr[headX][headY] == 1) exit(1);
        else {
            arr[headX][headY] = 2;
            return arr[headX][headY];
        }
    }
    int motionLeft(int arr[10][10]) {
        arr[headX][headY] = 0;
        headY--;
        if (arr[headX][headY] == 1) exit(1);
        else {
            arr[headX][headY] = 2;
            return arr[headX][headY];
        }
    }
};
 
int main() {
    system("chcp 1251 > null");
 
    int arr[10][10] = { {1,1,1,1,1,1,1,1,1,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,0,0,0,0,0,0,0,0,1},
                        {1,1,1,1,1,1,1,1,1,1} };
 
    Snake * snake = new Snake(100, 5, 5);
    snake->setHead(arr);
 
    do {
        system("cls");
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (arr[i][j] == 1) cout << "#";
                if (arr[i][j] == 0) cout << " ";
                if (arr[i][j] == 2) cout << "*";
            }
            cout << endl;
        }
        if (_kbhit()) {
            switch (_getch()) {
            case 'w':
                snake->motionUp(arr);
                break;
            case 's':
                snake->motionDown(arr);
                break;
            case 'a':
                snake->motionLeft(arr);
                break;
            case 'd':
                snake->motionRight(arr);
                break;
            }
        }
    } while (true);
 
 
    system("pause");
    return 0;
}
P.S. Еще не реализовано увеличение змейки и прочее, но советы по коду в целом с радостью почитаю.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2018, 13:47
Ответы с готовыми решениями:

"Змейка", не работают кнопки направления движения
Всем привет! Нашёл рабочий программный код змейки в С++,откомпилированный и запущенный в Dev C++ При запуске не работают кнопки...

функция удерживания кнопки
Народ, необходимо реализовать функцию удерживания кнопки.Виполнялась процедура по удержанию кнопки на 1секунду на 2с и на 3с.Возможноли...

Обработка удерживания кнопки
пытался на pressed() повесить слот типа такого: while (1) { if (!ui-&gt;rotateButton-&gt;isDown()) break; Sleep(50) ...

6
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
06.10.2018, 13:51
Цитата Сообщение от SourLemon Посмотреть сообщение
P.S. Еще не реализовано увеличение змейки и прочее,
и не будет. подход тут в принципе неверный
0
165 / 114 / 59
Регистрация: 12.07.2018
Сообщений: 277
06.10.2018, 14:03
Цитата Сообщение от SourLemon Посмотреть сообщение
Помогите с реализацией постоянного движения.
Добавьте в класс int dir, в котором храните направление движения, например, 0..3. На каждом ходе игры двигайте змейку в направлении dir, а нажатие кнопок используйте для изменения dir.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
06.10.2018, 14:05
Бард, этого мало, он ещё не понимает
0
2 / 1 / 1
Регистрация: 16.05.2018
Сообщений: 31
06.10.2018, 14:18  [ТС]
А какой тогда верный?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
06.10.2018, 15:00
Лучший ответ Сообщение было отмечено SourLemon как решение

Решение

Я бы завёл массив (список, а лучше очередь) из координат точек змейки. Всех точек тела, а не только головы или хвоста, все должны храниться как минимум в массиве.
Но т.к. я предпочитаю очередь, сделал бы так....(код следует)

Добавлено через 31 минуту
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
#include <windows.h>
#include <list>
using namespace std;
int main()
{
    list<COORD> snake({ { 5, 0 },{ 4, 0 },{ 3, 0 },{ 2, 0 },{ 1, 0 } });
    COORD dir = { 1, 0 };
    bool gameover = false;
    HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
    while (!gameover)
    {
        if (GetAsyncKeyState(VK_LEFT) & 0x1) dir = {-1, 0};
        if (GetAsyncKeyState(VK_UP) & 0x1) dir = { 0, -1 };
        if (GetAsyncKeyState(VK_DOWN) & 0x1) dir = { 0, 1 };
        if (GetAsyncKeyState(VK_RIGHT) & 0x1) dir = { 1, 0 };
 
        COORD head = snake.front();
        head.X += dir.X;
        head.Y += dir.Y;
        {///пишем пробел в хвост
            unsigned long  written;
            SetConsoleCursorPosition(out, snake.back());
            WriteConsole(out, " ", 1, &written, NULL);
        }
        snake.pop_back();//удаляем хвост
        for (list<COORD>::iterator it = snake.begin(); it != snake.end() && !gameover; ++it)
            gameover = (it->X == head.X && it->Y == head.Y);//проверка всех клеток на столкновение с головой.
 
        snake.push_front(head);//добавим голову
        {///пишем клетку в голову
            unsigned long  written;
            SetConsoleCursorPosition(out, head);
            WriteConsole(out, "*", 1, &written, NULL);
        }
        Sleep(300);
    }
    return 0;
}
1
0 / 0 / 0
Регистрация: 30.05.2020
Сообщений: 5
16.05.2021, 11:54
Можете пожалуйста рассказать поподробнее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.05.2021, 11:54
Помогаю со студенческими работами здесь

Обработка удерживания кнопки нажатой
Выручайте, так и не смог правильный вопрос гуглу задать, мне нужно чтобы зажатая кнопка приводила к итерации события, но в поиске под...

Обработка удерживания кнопки нажатой WPF
Решил самостоятельно сделать NumericUpDown (ну не доверяю я уже готовым вариантам, лучше самому написать). Сделал текстовое поле, две...

Засечь время удерживания кнопки мыши
Здравствуйте! Решил сегодня написать макрос на мышь (Logitech G700s): EnablePrimaryMouseButtonEvents(true); local t=0; function...

Выделять текст БЕЗ удерживания ЛКМ
Текст: Это нереально осуществить? Задача: Выделение текста двумя кликами (I - текстовый курсор): 1й делаем здесь: Это неIреально...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru