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

Перемещение по лабиринту

26.06.2022, 12:36. Показов 1571. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В проекте билдера форма состоит из изображения и кнопки. По кнопке генерируется лабиринт как вектор векторов и циклом закрашивается в компонент картинки.
Как можно реализовать передвижение второй картинки сверху, так называемого "героя" по пустым коридорам лабиринта в его пределах?
//не бейте тапками только, я не разбираюсь совсем..

И дополнительно, как правильно по картине подкрасить вручную несколько пикселей? Лабиринт получается со сплошной рамкой без входа/выхода, хочу сделать фиксированные слева и справа картинки лабиринта на середине изображения...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.06.2022, 12:36
Ответы с готовыми решениями:

перемещение персонажа по лабиринту
Здравствуйте подскажите как дописать код плиз!!!! Реализовать перемещение персонажа по лабиринту стрелками влево, вправо, вверх и вниз....

Построения лабиринту
помогите написать програму (Построения лабиринту).

Проход по лабиринту
Привет всем. Помогите пожалуйста с задачей на С/C++ идёт практика я не понимаю как сделать задачу просто даже не представляю училка...

8
Заблокирован
26.06.2022, 14:11
так что нужно то лабиринт построить, или дорогу найти?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 22
26.06.2022, 14:15  [ТС]
Лабиринт есть, он уже генерируется и закрашивается в картинку, поиск выхода не нужен, нужен именно интерактив, пользователь тыкает кнопки и перемещает "героя" по пустому пространству лабиринта
0
Заблокирован
26.06.2022, 15:53
Цитата Сообщение от YukaChan Посмотреть сообщение
он уже генерируется и закрашивается в картинку
где всё это богатство?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 22
26.06.2022, 15:57  [ТС]
Генерация такая, если речь об этом
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
#include "maze_gen.hpp"
#include <random>
#include <stdexcept>
 
 
namespace mz {
 
std::vector<std::vector<bool>> generate(std::size_t width, std::size_t height) {
 
 
 
  // Инициализируем размер конечной матрицы maze
  // Ячейки будут представлять из себя фрагменты 2x2 + 1 одно значение сверху и слева для стен
  const std::size_t output_height = height * 2 + 1;
  const std::size_t output_width  = width * 2 + 1;
  // Инициализируем указатель на лабиринт
  std::vector<std::vector<bool>> maze;
  // Зарезервируем размер лабиринта по высоте
  maze.reserve(output_height);
 
  // Инициализируем построчно пустой лабиринт со стенами по периметру и "опорами" (стенами) в нижнем правом углу ячеек 2x2
  // #######
  // #     #
  // # # # #
  // #     #
  // #######
  for (std::size_t i = 0; i < output_height; ++i) {
    std::vector<bool> row;
    row.reserve(output_width);
    for (std::size_t j = 0; j < output_width; ++j)
      // Если этот элемент в строке является ячейкой в левом верхнем углу области 2x2 - то это пустая ячейка в лабиринте
      if ((i % 2 == 1) && (j % 2 == 1))
        row.push_back(false);
      else
        // Если это область для стены справа или область для стены снизу - то инициализируем этот элемент пустой ячейкой в лабиринте
        if (((i % 2 == 1) && (j % 2 == 0) && (j != 0) && (j != output_width - 1))
          || ((j % 2 == 1) && (i % 2 == 0) && (i != 0) && (i != output_height - 1)))
          row.push_back(false);
        else
          // Во всех остальных случаях устанавливаем стену
          row.push_back(true);
    maze.push_back(std::move(row));
  }
 
  //1. Создаём первую строку лабиринта. Ни одна ячейка не будет принадлежать какому - либо множеству.
  // Инициализируем вспомогательную строку, которая будет содержать в себе принадлежность ко множеству для ячейки из алгоритма
  std::vector<std::size_t> row_set;
  row_set.reserve(width);
  // 0 - будет означать, что ячейка не принадлежит никакому множеству
  for (std::size_t i = 0; i < width; ++i)
    row_set.push_back(0);
  // Счетчик для множеств
  std::size_t set = 1;
  // Генератор случайных чисел
  std::random_device rd;
  std::mt19937       mt(rd());
  // от 0 до 2 (2 не входит) и после привидения к int будет либо 0 - где стены нет, либо 1 - стену решили установить
  std::uniform_int_distribution<int> dist(0, 2);
  // Организуем цикл алгоритма Эллера
  for (std::size_t i = 0; i < height; ++i) {
    //2. Присвоить каждой ячейке, которая не входит ни в одно множество, своё уникальное множество.
    for (std::size_t j = 0; j < width; ++j)
      if (row_set[j] == 0)
        row_set[j] = set++;
 
    //3. Создаём правые стены для ячеек, двигаясь слева направо, следующим образом :
    for (std::size_t j = 0; j < width - 1; ++j) {
      //    Случайным образом решаем, добавлять стену или нет
      const auto right_wall = dist(mt);
      //        Если текущая ячейка и ячейка справа являются членами одного и того же множества, всегда создаём между ними стену(чтобы предотвратить петли)
      if ((right_wall == 1) || (row_set[j] == row_set[j + 1]))
        maze.at(i * 2 + 1 /*верхний ряд в i-ом ряду ячеек 2x2*/).at(j * 2 + 2 /*Правый столбец в (i;j) ячейке 2x2*/) = true; /*Создаем стену*/
      else {
        //      * Если не добавляем стену, то объединяем множества, к которым относятся текущая ячейка и ячейка справа
        const auto changing_set = row_set[j + 1];
        for (std::size_t l = 0; l < width; ++l)
          if (row_set[l] == changing_set)
            row_set[l] = row_set[j];
      }
    }
 
    //4. Создаём нижние стены, двигаясь слева направо :
    for (std::size_t j = 0; j < width; ++j) {
      //    * Случайным образом решаем, добавлять нижнюю стену или нет.
      const auto bottom_wall = dist(mt);
      //        * Если ячейка является единственным членом своего множества, то не создаём нижнюю стену
      std::size_t count_current_set = 0;
      for (std::size_t l = 0; l < width; ++l)
        // считаем количество ячеек текущего множества
        if (row_set[j] == row_set[l])
          count_current_set++;
      //        * Если ячейка является единственным членом своего множества, которая не имеет нижней стены, то не создаём нижнюю стену
      if ((bottom_wall == 1) && (count_current_set != 1))
        maze.at(i * 2 + 2).at(j * 2 + 1) = true;
    }
 
    //5. Продолжаем добавлять строки 
    //  * Если вы решите добавить еще одну строку :
    if (i != height - 1) {
      //Каждая область имеет по крайней мере одну ячейку без нижней стены(это предотвратит создание изолированных областей)
      for (std::size_t j = 0; j < width; ++j) {
        std::size_t count_hole = 0;
        for (std::size_t l = 0; l < width; ++l)
          if ((row_set[l] == row_set[j]) && (maze.at(i * 2 + 2).at(l * 2 + 1) == false))
            count_hole++;
        if (count_hole == 0)
          maze.at(i * 2 + 2).at(j * 2 + 1) = false;
      }
 
      //        * скопируем текущую строку
      //        * удаляем в новой строку все правые стены
      /// Правые стенки в инициализированном массиве уже отсутствуют в каждой новой строке
      //        * удаляем ячейки с нижней стеной из их множества
      for (std::size_t j = 0; j < width; ++j)
        if (maze.at(i * 2 + 2 /* Проверим надичие нижней стены у текущего ряда*/).at(j * 2 + 1) == true)
          // Если стенка есть, то удаляем ячейку из множества
          row_set[j] = 0;
      //        * удаляем все нижние стены
      /// Нижние стены в каждом новом ряду ячеек отсутствуют (заложено при инициализации)
    }
    //      * продолжить с шага 2.
  }
 
  //    * Закончиваем лабиринт :
  //        *добавляем нижнюю стену каждой ячейке
  /// Нижняя стена построена при инициализации лабиринта
  //        * перемещаемся слева направо :
  for (std::size_t j = 0; j < width - 1; ++j) {
    //          *Если текущая ячейка и ячейка справа являются членами разных множеств, то :
    if (row_set[j] != row_set[j + 1])
      //            *удалить правую стену
      maze.at(output_height - 2).at(j * 2 + 2) = false;
    //          * объединить множества, к которым принадлежат текущая ячейка и ячейка справа
    /// Это делать не обязательно, так как row_set мы больше не будем использовать,
    /// а все множества в конечном итоге станут одним, после удаления стен
    //          * вывод итоговой строки
  }
  // вернем указатель на полученный лабиринт
  return maze;
}
}// namespace mz
0
Заблокирован
26.06.2022, 16:42
помощи просите у форума про мышиный клик и отрисовку, а выкладываете фрагмент, проект нужен полностью в архиве, может кому не лень будет его скачать
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 22
26.06.2022, 16:47  [ТС]
Мне просто нужен совет по реализации, каким образом это можно сделать. События там, что подвязывать туда..
0
Модератор
 Аватар для D1973
9915 / 6452 / 2455
Регистрация: 21.01.2014
Сообщений: 27,386
Записей в блоге: 3
26.06.2022, 17:02
Цитата Сообщение от YukaChan Посмотреть сообщение
События там, что подвязывать туда
А какие "события" в вышеприведенном обрывке?
0
0 / 0 / 0
Регистрация: 09.04.2020
Сообщений: 22
26.06.2022, 17:08  [ТС]
Простите, но я немного не могу понять связи. Сверху генератор. Цель моего запроса - описание общего решения...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2022, 17:08
Помогаю со студенческими работами здесь

Проход по лабиринту
Описать класс, реализующий стек. Написать программу, использующую этот класс для отыскания прохода по лабиринту. Лабиринт...

Проход по лабиринту
Нужно составить программу, использующую стек для нахождения прохода по лабиринту и вывода координат прохода. Лабиринт представляет собой...

Зацикливается прохождение по лабиринту
Суть задачи: даны матрица NxM, даны 2 точки точка входа в лабиринт и выхода(пока отрубил,беру поиск с верхней точки), необходимо пройтись...

Провести человека по лабиринту
Здравствуйте товарищи программисты! У меня к вам просьба. Задали по учебе сделать программу на бейсике а я в нем мягко скажем не совсем...

Отыскания прохода по лабиринту
Рабочая программа, но криво в моем Vstudio выводит. Поправьте пожайлуйста. Задание: Описать класс, реализующий стек. Написать...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru