Помощь с генерацией карты (свой способ)

Темы, связанные с проектированием и программированием roguelike-игр

Модераторы: Sanja, Максим Кич

Ответить
Varag
Сообщения: 6
Зарегистрирован: 28 янв 2015, 05:45

Помощь с генерацией карты (свой способ)

Сообщение Varag » 03 фев 2015, 17:20

Здравствуйте сразу извиняюсь за код и другое, я ещё школьник 9 класс.

Решил надрать всем... Одно место и показать что рогалики способны на многое. А точнее выиграть конкурс генерацией и прочим что является особенностью рогалика. Но при создании игры вышла проблема, дело в том что я ленивый да и толком не знающий решил сделать такую генерацию глобальной карты(цель сгенерировать материк, кругло-образный) сделал это по алгоритму находим символ и в случайную сторону (возможно в несколько сторон) ставим этот же символ. Делаю на Pascal'e собственно код:

Код: Выделить всё

x := 12;
  y := 12;
  
  GotoXY(x, y);
    //TextColor(LightGreen);
  glmap[x, y].charc := '.';
   //Write('0');
  
  obr := false;
  
  for k := 1 to 4 do
  begin
    if obr = false then
    begin
      i1 := 33;
      obr := true;
    end
          else
    if obr = true then
    begin
      obr := false;
      wl := true;
    end;
    
    for j := 2 to 33 do //-----------------------------------------
    begin
      wl := true;
      i1 := 33;
      for i := 2 to 33 do //-------------------------------------------
      begin
          //Delay(5);
        if (obr = false) then
        begin
          if wl = true then
          begin
            i1 := 33;
            wl := false;
          end
                else
          if not wl = true then
          begin
            Dec(i1);
          end;
        end
            else
        if (obr = true) then
        begin
          i1 := i;
        end;
        if (glmap[i1, j].charc = '.') then
        begin
          
              //Delay(50);
          
          n := random(2); // север
          e := random(2); // восток 
          s := random(2); // юг
          w := random(2); // запад
          
          if n = 1 then
          begin
            if (i1 < 33) and (i1 > 2) and (j < 33) and (j > 2) then
              if glmap[i1 - 1, j].charc = '~' then
              begin
                glmap[i1 - 1, j].charc := '.';
                //GotoXY(i1-1,j);
                //TextColor(White);
                //write('0');
              end
            else
            {if glmap[i1+1,j] = '~' then
            if not (glmap[i1+1,j] = '0') then
            begin
            glmap[i1+1,j]:='0';
            GotoXY(i1+1,j);
            TextColor(White);
            write('0');
            end;}
          end;
          if s = 1 then
          begin
            if (i1 < 33) and (i1 > 2) and (j < 33) and (j > 2) then
              if glmap[i1 + 1, j].charc = '~' then
              begin
                glmap[i1 + 1, j].charc := '.';
                //GotoXY(i1+1,j);
                //TextColor(White);
                //write('0');
              end;
          end;
          if e = 1 then
          begin
            if (i1 < 33) and (i1 > 2) and (j < 33) and (j > 2) then
              if glmap[i1, j + 1].charc = '~' then
              begin
                glmap[i1, j + 1].charc := '.';
                //GotoXY(i1,j+1);
                //TextColor(White);
                //write('0');
              end;
          end;
          if w = 1 then
          begin
            if (i1 < 33) and (i1 > 2) and (j < 33) and (j > 2) then
              if glmap[i1, j - 1].charc = '~' then
              begin
                glmap[i1, j - 1].charc := '.';
                //GotoXY(i1,j-1);
                //TextColor(White);
                //write('0');
              end;
          end;
        end;
      end;
    end;
  end;
увы генератор делает дело но не совсем то что нужно бывают результаты нужные а бывает что слишком искажённый материк. Помогите сделать более круглым овальным. Заранее благодарен !

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Помощь с генерацией карты (свой способ)

Сообщение Tookser » 04 фев 2015, 02:48

Добро пожаловать!
Ответ пока не очень развёрнутый, потом еще напишу.

По поводу генерации: есть вариант — описывать некую фигуру вокруг результата и смотреть, все ли клетки лежат в ней. Если не так, перегенерировать, и так много раз. Можно использовать какой-то другой критерий овальности, главное, чтобы критерий был хорошим и карта хоть иногда получалась подходящей под критерий.

По коду: вместо 33 повсюду используй константу max=33, да и вместо 2 тоже. Всё-таки код более менее сложный.

По желанию генерации: есть вариант просто сделать овал вначале, а потом его модифицировать по краям. Добавить неровный берег, лакуны можно еще.

По Pascal: используй оператор in, он достаточно удобен при проверке на принадлежность числа отрезку.

Аватара пользователя
Alchemist
Мастер
Сообщения: 203
Зарегистрирован: 13 дек 2006, 09:15
Откуда: Нижний Тагил, Иваново
Контактная информация:

Re: Помощь с генерацией карты (свой способ)

Сообщение Alchemist » 04 фев 2015, 11:35

Рекомендую почитать эти статьи:
http://habrahabr.ru/post/111538/ и http://habrahabr.ru/post/249027/.

Для начинающего может быть сложновато, но возможно лучше сразу двигаться в правильном направлении и учиться комплексным решениям.
Указанные в статьях решения, думаю, можно найти и в Паскаль-реализациях.
Совершенство - это не тогда, когда уже нечего добавить,
но тогда, когда уже ничего нельзя убрать.
Антуан де Сент-Экзюпери.

Varag
Сообщения: 6
Зарегистрирован: 28 янв 2015, 05:45

Re: Помощь с генерацией карты (свой способ)

Сообщение Varag » 04 фев 2015, 19:02

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

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Помощь с генерацией карты (свой способ)

Сообщение Tookser » 06 фев 2015, 06:52

Немного по строкам:

Код: Выделить всё

  for k := 1 to 4 do
  begin
    if obr = false then
    begin
      i1 := 33;
      obr := true;
    end
          else
    if obr = true then
    begin
      obr := false;
      wl := true
    end
Удобнее писать if obr then … else … , то есть не сравнивать булевые переменнын с булевыми значениями, и не писать второго условного оператора.

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: Помощь с генерацией карты (свой способ)

Сообщение BreakMT » 06 фев 2015, 08:40

А я бы посоветовал называть переменные нормально, осмысленно. Не какие-то obr и wl, а нормальным английским языком :)

Тогда, кстати, отпадут и эти абсолютно лишние комментарии:

Код: Выделить всё

   n := random(2); // север
   e := random(2); // восток 
   s := random(2); // юг
   w := random(2); // запад
если написать

Код: Выделить всё

   north := random(2);
   east := random(2);
   south := random(2);
   west := random(2);
Короче, желательно писать так чтобы было понятно что происходит, чтобы и самому не мучиться через пару недель, вспоминая что это за obr и wl такие, и людям на форуме помимо кучи циклов была понятна логика.

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Помощь с генерацией карты (свой способ)

Сообщение Tookser » 06 фев 2015, 09:38

Вот n e w s — нормальные сокращения. А булевые переменные не совсем понятны. Ту часть кода с циклами нужно было бы покомментировать. Объяснить логику и т.д.

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

Ещё вариант генерации — наложить несколько кругов разного размера.

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: Помощь с генерацией карты (свой способ)

Сообщение BreakMT » 06 фев 2015, 11:05

Tookser писал(а):Вот n e w s — нормальные сокращения. А булевые переменные не совсем понятны. Ту часть кода с циклами нужно было бы покомментировать. Объяснить логику и т.д.
Не нормальные, если требуются комментарии. И если логику без комментариев не видно - это тоже признак плохого кода. В этом случае следует разбивать простыню на более мелкие функции/методы (также с понятными названиями).

С другой стороны - для школьника 9 класс и так уже хорошо :)

Tookser
Сообщения: 155
Зарегистрирован: 08 апр 2010, 11:09

Re: Помощь с генерацией карты (свой способ)

Сообщение Tookser » 06 фев 2015, 11:27

BreakMT писал(а):
Tookser писал(а):Вот n e w s — нормальные сокращения. А булевые переменные не совсем понятны. Ту часть кода с циклами нужно было бы покомментировать. Объяснить логику и т.д.
Не нормальные, если требуются комментарии. И если логику без комментариев не видно - это тоже признак плохого кода. В этом случае следует разбивать простыню на более мелкие функции/методы (также с понятными названиями).

С другой стороны - для школьника 9 класс и так уже хорошо :)
Иногда можно писать не самый хороший и понятный код, но хорошо его комментировать. К примеру, когда очень мало времени и требуется хоть какой-то код, пусть даже неподдерживаемый и глючный (тоже не люблю такие требования, но они бывают, к примеру, в олимпиадном программировании). N e w s — кажутся очевидными в контексте карты. Obr и wl — требуют объяснения, причём похоже, что один из них не нужен.

В коде можно ещё те 4 почти одинаковые части убрать в одну функцию (там одна немного отличается).

Забавно, что ни одного комментария по смыслу кода. Я пока не очень хорошо его понимаю.

Аватара пользователя
BreakMT
WANDER Team
Сообщения: 933
Зарегистрирован: 27 ноя 2006, 12:16

Re: Помощь с генерацией карты (свой способ)

Сообщение BreakMT » 07 фев 2015, 10:05

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

Ну а так - да, вернемся к теме обсуждения :) Я попытался его запустить, допилив, как сам предположил - в итоге вывелась одна точка. WTF, автор? :D

Varag
Сообщения: 6
Зарегистрирован: 28 янв 2015, 05:45

Re: Помощь с генерацией карты (свой способ)

Сообщение Varag » 01 мар 2015, 05:56

Спасибо за ответы, комментировать не очень люблю только ту часть где уж совсем запутаться можно, да код не идеален ) Я заменил данную генерацию на другую. Не запуститься ибо из 2000 кода это где то 500-600 строк :с

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 36 гостей