Рейтинг темы:
  • Голосов: 0 - Средняя оценка: 0. Если голосов меньше 5 оценка не показывается.
  • 1
  • 2
  • 3
  • 4
  • 5
Помогите написать модуль "Трубопроводчик"
#1
Доброй ночи.
Прошу опытных программистов помочь с написанием модуля
Замый ближайший аналог - старая игрушка Трубопроводчик
Есть локация состоящая из сетки произвольного размера (допустим 5х5)
Генерируется лабиринт из 5х5 тайлов с различными конфигурациями труб и методом верчения тайлов нужно провести воду от входа в лабиринт к его выходу. я ни как не могу сообразить, как это сделать без тупого перебора вариантов с ифами на все возможные позиции. Очень прошу помочь.

 
Ответить
#2
На каком языке?

 
Ответить
#3
@9382efe0, порнофорум самое то место что бы искать алгоритм поиска пути. В гугле пробовал?
Существует около 9 алгоритмов:
https://ru.wikipedia.org/wiki/%CF%EE%E8%F1%EA_%EF%F3%F2%E8

Механика простая - четырехмерный массив с концами 0 или 1, вращение меняет параметры, а алгоритм проверяет если путь найден.

 
1
Ответить
#4
(25.11.2018, 09:16)7c78cee3 писал(а): На каком языке?

QSP

 
Ответить
#5
(25.11.2018, 19:47)6f2196ee писал(а): QSP
Продолжай дальше уточнять, ты должен поностью описать порядок действий и возможностей со стороны игрока. Любой кто возьмется тебе помочь должен знать:
1) какие трубы возможны
2) кто генерирует карту и закладывается ли в генератор хотя бы одно 100% возможное решение
3) зачем искать решение если это задача игрока и алгоритму нужно лишь проверить рабочее его решение или нет?


В общем написал код для проверки есть ли жизнь на марсе готовый путь, для понимания кода нужен уровень чуть выше среднего:
Код:
if $args[0] = '':
  gs 'maze', 'init'
  gs 'maze', 'generate_test_field'
  gs 'maze', 'check'
end

if $args[0] = 'init':
  'maze_init'
  maze_size_w = 5
  maze_size_h = 5
  maze_directions_size = 8
  
  maze_offset[0] = 1                &! право        [0]
  maze_offset[1] = -1               &! влево        [1]
  maze_offset[2] = maze_size_w      &! вниз         [2]
  maze_offset[3] = -maze_size_w     &! вверх        [3]
  maze_offset[4] = maze_size_w + 1  &! вниз-вправо  [4]
  maze_offset[5] = maze_size_w - 1  &! вниз-влево   [5]
  maze_offset[6] = -maze_size_w + 1 &! вверх-вправо [6]
  maze_offset[7] = -maze_size_w - 1 &! вверх-влево  [7]
  
  maze_directions[0] = 1  
  count = 1  
  :maze_directions_init_loop
  if count < maze_directions_size:
    &! Каждое возможное направление задается как номер бита, 1 2 4 8 и т.д.
    &! Таким образом если есть несколько направлений, то сложив мы получим итоговое значение клетки
    &! Например есть навправление вправо[0] и вверх[3], итоговое значение клетки = 2^0 + 2^3 = 1 + 8 = 9
    maze_directions[count] = maze_directions[count - 1] * 2    
    count = count + 1
    jump 'maze_directions_init_loop'
  end
  
  maze_size = maze_size_w * maze_size_h - 1
  maze_count = maze_size
  
  maze_start = 0
  maze_end = maze_size
  : maze_init_loop
  if maze_count >= 0:
    maze[maze_count] = 0 &! генератор должен заполнить нормальными значениями
    maze_count = maze_count - 1
    jump 'maze_init_loop'
  end
end

if $args[0] = 'generate_test_field':
  ![s--7x]
  ![xxx|x]
  ![xxx|x]
  ![xxx|x]
  ![xxxLf]
  maze[0] = 1 &!(вправо)
  maze[1] = 3 &!(влево + вправо)
  maze[2] = 3
  maze[3] = 2 + 4 &!(влево + вниз)
  maze[8] = 4 + 8 &!(вниз + вверх)
  maze[13] = 4 + 8 &!(вниз + вверх)
  maze[18] = 4 + 8 &!(вниз + вверх)
  maze[23] = 8 + 1 &!(вверх + вправо)
end

if $args[0] = 'check':
  'maze_check'
  maze_to_check[0] = 1 &! количество клеток для проверки
  maze_to_check[1] = maze_start
  
  'Идем из <<maze_start>> в <<maze_end>>:'
  
  :maze_check_loop
  cur_cell_id = maze_to_check[maze_to_check[0]]
  maze_to_check[0] = maze_to_check[0] - 1  
  maze_check[cur_cell_id] = 1
  '<<cur_cell_id>>'
  
  if maze_end = cur_cell_id:
    jump 'maze_check_success'
  end
  maze_cur_cell = maze[cur_cell_id]
  
  count = 0
  :maze_directions_check_loop
  if (maze_cur_cell and maze_directions[count]):
    next_cell_id = cur_cell_id + maze_offset[count]
    if next_cell_id >= 0 and next_cell_id <= maze_size and maze_check[next_cell_id] <> 1:
      ! можно попасть в эту клекту из текущей и она не проверена, добавляем в список на проверку
      maze_to_check[0] = maze_to_check[0] + 1
      maze_to_check[maze_to_check[0]] = next_cell_id
    end
  end
  count = count + 1
  
  if count < maze_directions_size:
    jump 'maze_directions_check_loop'
  end
  
  if maze_to_check[0] > 0:
    jump 'maze_check_loop' &! продолжаем проверять
  else
    jump 'maze_check_fail' &! проверили все клетки и путь не найден
  end
  
  :maze_check_success
  'Путь найден'
  jump 'maze_check_end'
  :maze_check_fail
  'Путь не найден'
  :maze_check_end
end

 
Ответить
#6
@188fb8f5,  Суть модуля следующая.
Демона вызывают через пентаграмму.
Ты играешь за демона.
Для того, чтобы вызов сработал, тебе нужно своей магией найти в хаосе междумирья тропу и пройти по ней до источника сигнала. Каждый поворот тайла требует затрат маны
(IF Тек_мана > 0:
Тек_мана = Тек_мана - 1
!Поворот тайла путем замены картинки-ссылки
ELSE
MSG "У вас не хватает маны"
END)
Поворот тайла осуществляется по клику на саму картинку (с вызовом кода через gs)
Видов труб 4:
1. Прямая (Два выхода)
2. Поворот (Два выхода)
3. Врезка (Три выхода)
4. Крест (Четыре выхода)
Генерацию карты можно сделать рандомом. 100% решение не обязательно чисто теоретически. Тоесть, сам игрок может решить, браться ему за такой вызов или нет, тратить ману на поиски решения или нет. Задача только проверить, рабочее решение или нет

 
Ответить
#7
6f2196ee писал(а):Видов труб 4:
1. Прямая (Два выхода)
2. Поворот (Два выхода)
3. Врезка (Три выхода)
4. Крест (Четыре выхода)
Значит всего максимум 4 возможных перехода из тайла. Ставишь в моем коде maze_directions_size = 4.
6f2196ee писал(а):Генерацию карты можно сделать рандомом. 100% решение не обязательно чисто теоретически.
Ок, не идеально но самый простой выбор.
6f2196ee писал(а):!Поворот тайла путем замены картинки-ссылки
Код:
gs 'maze', 'turn_tile', x, y &! x, y числа от 1 до размера лабиринта
6f2196ee писал(а):Задача только проверить, рабочее решение или нет
Код:
gs 'maze', 'check'
Только вот рандомный генератор обычно сразу делает лабиринт с готовым решением.

В общем вот тебе ссылка на то что у меня получилось: https://mega.nz/#!j4AwWIIQ!UWpeGNSer8VNFaB_MFBMBKp-NhifJsJDEXViXdLakZQ

Тебе нужно только нарисовать тайлы для каждого перехода, всего 15 тайлов и вывести лабиринт на экран.

 
Ответить
#8
@188fb8f5, Дичайшее тебе спасибо! А то я себе голову сломал, как это сделать нормально. Укажу твой ник в благодарностях к игре )

 
Ответить
#9
@188fb8f5, прочитай ЛС пожалуйста

 
Ответить


Переход:


Просматривают эту тему: 1 Гость(ей)