Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2025, 21:26   #1
barbos34435
Новичок
Джуниор
 
Регистрация: 14.08.2025
Сообщений: 2
По умолчанию нужна помощь по змейке на си++

Здравствуйте всем. я новичок изучаю си++ решил создать змейку с этого источника
https://habr.com/ru/articles/733664/ и какая проблема. получается выводиться только синий экран и яплоко не каких кординат и признаков жизни нет болше не движения змейки не чего словно как зависло на одном месте,прошу помочь что не так в коде
вот код:

Код:
#include <chrono>
#include <random>
#include <vector>
#include <string>
#include <curses.h>

using namespace std;
using namespace std::chrono;


bool game_exit = false;

struct vector2di {
    int x = 0;
    int y = 0;
};

int main()
{
    // переключаем шрифт для отображения кириллицы
    system("chcp 1251");
    // инициализируем экран curses
    initscr();
    // прячем курсор
    curs_set(0);
    // запускаем цветной режим
    start_color();
    // режимы цветов 1,2,3,4,5
    init_pair(1, COLOR_WHITE, COLOR_BLUE);
    init_pair(2, COLOR_MAGENTA, COLOR_BLUE);
    init_pair(3, COLOR_GREEN, COLOR_BLUE);
    init_pair(4, COLOR_RED, COLOR_BLUE);
    init_pair(5, COLOR_YELLOW, COLOR_BLACK);
    //цвет фона, режим 1
    bkgd(COLOR_PAIR(1));
    // начальные координаты головы змейки
    vector2di snake_head{ 10,10 };
    // направление и шаг перемещения змейки
    vector2di vector_step{ 1,0 };
    // постоянные координаты яблока 
    vector2di apple{ 15,15 };
    // случайные координаты яблока
    vector2di rnd_apple;
    // динамический массив координат хвоста змеи 
    vector<vector2di> snake_tail;
    // частота смены кадров
    int frame_rate = 100;
    // количество собранных яблок
    int eaten_apples = 0;

    // **** начало работы генератора случайных чисел ****
    // момент системного времени
    long long seed = system_clock::now().time_since_epoch().count();
    // запуск генератора случайных чисел
    default_random_engine rnd(static_cast<unsigned int>(seed));
    // установка диапазона случайных координат яблока
    uniform_int_distribution<int> apple_x(10, 97);
    uniform_int_distribution<int> apple_y(5, 22);
    // **** конец работы генератора случайных чисел ****

    // разрешаем использовать специальные клавиши в нашем случае стрелки для управления змейкой   
    keypad(stdscr, true);
    // выключает отображение нажатых клавиш на экране
    noecho();

    // **** игровой цикл ****
    while (!game_exit) {
        // присваиваем случайные значения переменным случайных координат яблока
        rnd_apple.x = apple_x(rnd);
        rnd_apple.y = apple_y(rnd);
        // рисуем игровое поле
        void show_map(const vector2di & apple, const int& eaten_apples);

         {

            // очистка экрана
            clear();
            // перемещение курсора
            move(2, 55);
            // устанавливаем атрибуты для текста яркость и номер цветовой пары
            attrset(A_DIM | COLOR_PAIR(1));
            // выводим текст в консоль
            printw("Змейка\t\t");
            attrset(A_BOLD | COLOR_PAIR(5));
            printw(" количество собранных яблок < ");
            // значение целочисленной переменной переводим в строковое
            string s_eaten_apples = to_string(eaten_apples);
            // выводим значение переменной
            printw(s_eaten_apples.c_str());
            printw(" > ");
            attrset(A_DIM | COLOR_PAIR(1));
            // рисуем игровое поле 
            for (int y = 4; y < 28; y++) {

                for (int x = 5; x < 112; x++) {

                    if (y == 4 || y == 27 || x == 5 || x == 111) {

                        move(y, x);
                        printw("*");
                    }
                }
            }
            // рисуем яблоко
            move(apple.y, apple.x);
            attrset(A_BOLD | COLOR_PAIR(2));
            printw("@");
        }
        // перемещаем змейку по игровому полю
         void move_snake(vector2di & snake_head, vector2di & vector_step, vector<vector2di>&snake_tail,
             vector2di & apple, vector2di rnd, int& eaten_apples);
         // устанавливаем цвет змейки
         attrset(A_BOLD | COLOR_PAIR(3));

         // Если  змейка с хвостом, рисуем хвост
         if (!snake_tail.empty()) {

             for (auto const& mov : snake_tail) {

                 move(mov.y, mov.x);

                 printw("#");
             }
         }
         // изменяем координаты головы змейки
         snake_head.x += vector_step.x;
         snake_head.y += vector_step.y;

         // перемещаем курсов в координаты головы змейки
         move(snake_head.y, snake_head.x);

         // проверяем символ в установленных координатах курсора
         auto s = static_cast<char>(winch(stdscr));

         // *** Если змейка столкнулась с хвостом или границами игрового поля
         //  ### Выводим игровое меню ###
         if (s == '*' || s == '#') {

             attrset(A_BOLD | COLOR_PAIR(4));
             move(13, 55);
             printw("Конец игры");
             move(14, 42);
             printw("Выход - < q >  Начать заново - < n >");
             // *** Цикл выбора игрового меню ***
             do {
                 if (getch() == 'q') {
                     // выход из игры
                     game_exit = true;
                     return;
                 }
                 if (getch() == 'n')
                 {
                     // рестарт задаём начальные координаты переменным
                     snake_head = { 10,10 };
                     vector_step = { 1,0 };
                     snake_tail.clear();
                     apple = { 15,15 };
                     eaten_apples = 0;
                     return;
                 }
             } while (true);
             // *** Конец цикла выбора игрового меню ***
         }

        // частота сменны игрового кадра
        timeout(frame_rate);

        // **** управление змейкой и игрой ****
        // проверка нажатой клавиши
        switch (getch()) {
        case KEY_UP:
            if (vector_step.y == 0) {

                vector_step.y = -1;
                vector_step.x = 0;
                frame_rate = 170;
            }
            break;
        case KEY_DOWN:
            if (vector_step.y == 0) {

                vector_step.y = 1;
                vector_step.x = 0;
                frame_rate = 170;
            }
            break;
        case KEY_LEFT:
            if (vector_step.x == 0) {

                vector_step.x = -1;
                vector_step.y = 0;
                frame_rate = 100;
            }
            break;
        case KEY_RIGHT:
            if (vector_step.x == 0) {

                vector_step.x = 1;
                vector_step.y = 0;
                frame_rate = 100;
            }
            break;
        case 'q':
            game_exit = true;
            break;
        default:
            break;
        }
        // ****  конец управления змейкой и игрой **** 
    }
    // **** конец игрового цикла ****
    endwin();
    return 0;
}

Последний раз редактировалось BDA; 14.08.2025 в 22:21.
barbos34435 вне форума Ответить с цитированием
Старый 14.08.2025, 22:32   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,433
По умолчанию

У меня ваш код в студии даже не собрался. Не нужно код функций show_map и move_snake засовывать внутрь кода main. Разместите их над main, а в коде main оставьте вызовы, как сделано в статье.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 15.08.2025, 06:25   #3
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,053
По умолчанию

если исправить два return-а, то даже запускается, но не шаволится
https://onlinegdb.com/5E_LA-Esq
Алексей1153 вне форума Ответить с цитированием
Старый 15.08.2025, 06:29   #4
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,053
По умолчанию

по этому признаку
Цитата:
using namespace std;
можно сразу было сказать, что автор ничему хорошему не научит


такую змейку можно нарисовать без всяких curses, просто стандартом.
А вот для поллинга клавиш придётся ОС-зависимый костыль вставить

Для начала пусть змея сама ищет яблоки, тогда чисто стандартом можно обойтись
Алексей1153 вне форума Ответить с цитированием
Старый 15.08.2025, 10:16   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,373
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Для начала пусть змея сама ищет яблоки
Хо-хо, мсье знает толк
Но это хороший тест - тех, кто с этим справятся можно брать на работу
waleri вне форума Ответить с цитированием
Старый 15.08.2025, 11:26   #6
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,053
По умолчанию

waleri, поиск пути не сложно пишется

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

Интересный момент будет, когда путь невозможно будет найти из-за длины змеи, но этот путь ещё может открыться, пока змея будет ползти примерно в сторону цели

Последний раз редактировалось Алексей1153; 15.08.2025 в 11:33.
Алексей1153 вне форума Ответить с цитированием
Старый 16.08.2025, 01:05   #7
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,890
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Интересный момент будет, когда путь невозможно будет найти из-за длины змеи, но этот путь ещё может открыться, пока змея будет ползти примерно в сторону цели
Этот момент автоматически будет учтен, если в алгоритме поиска пути при продвижении на каждый шаг просчитывать и движение змеи.
Arigato вне форума Ответить с цитированием
Старый 16.08.2025, 06:45   #8
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,053
По умолчанию

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

и даже тут возможны варианты. Помнится, в детстве играл в змейку, иногда внутри своего кольца приходилось кружить зигзагами, пока хвост не уедет с дороги :D Это уже на терминальной стадии обжорства
Алексей1153 вне форума Ответить с цитированием
Старый 16.08.2025, 12:59   #9
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,890
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
автоматически то не будет.
Будет. По сути змейка сдвигается на число пройденных клеток. Единственное усложнение, что до одной и той же клетки можно добраться за разное число шагов. И не всегда в данном случае меньшее число шагов означает лучшее решение, так как двигаясь по более длинному пути можно дождаться ухода хвоста.
Arigato вне форума Ответить с цитированием
Старый 16.08.2025, 13:56   #10
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,053
По умолчанию

Arigato, ну, можно как в шахматах - просчитать ходы вперёд (благо, обычно такой пятачок уже небольшой). Если с некоторого будущего места появляется открытый путь, то начать двигаться к этому месту (причём, во время движения путь искать уже не нужно, ведь всё было просчитано заранее)
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка пузырьком матрицы по змейке Mirazhana Помощь студентам 1 24.06.2013 12:53
Как сделать в змейке? Baburek Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 12.12.2010 16:52
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12