Пятница, 28 Июня 2024, 19:11

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
2D Map Generator
DeswingДата: Пятница, 06 Сентября 2013, 23:50 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Всем добра. Возможно, кто-нибудь помнит старые мои темы с вопросами про создание генератора мира.
Действительно, Fade, x-and и многие другие люди мне очень помогли, за что им низкий поклон. Я бы сам никогда не справился с такой задачей.
НО! Я так и не почувствовал радости от того, что я это написал. По крайней мере из-за того что код был написан за меня. Конечно, я человек не глупый, ковырялся в коде достаточно долго, пытался повторить самостоятельно...
НО[2]! Повтор - это слишком примитивно для меня, я хотел бы самостоятельно ПРИДУМАТЬ алгоритм генерации двумерного мира.
Так как я не очень опытный программист С++ (программирую давно, но есть большие пробелы в знаниях) мне понадобится помощь со стороны.
Т.е. я с радостью выслушаю ваши советы, прислушаюсь к ним и буду действовать.

ИТАК. Насколько мне известно первым делом мне нужно создать двумерный массив (ну или "матрицу", о чём я узнал недавно в институте). Этот массив и будет моей картой. Потом будет браться точка слева приблизительно на середине матрицы и как-то строиться кривая вплоть до правого края карты. Ну а затем, как только кривая будет построена, всё, что ниже этой кривой, будет заполнятся тем же, из чего состоит кривая (символы или спрайты - не важно, думаю smile )
Я сказал что-нибудь глупое? Заранее прошу дать подзатыльник, если это так! Я хочу учиться на своих же ошибках.

ЗАДАЧА: построить кривую от левого края к правому, причем чтобы высота "рандомно" варировалась. Пока что я нашел лишь "шум Перлина", но он мне пока что не совсем по зубам, так как единственное, что я понял оттуда, так это что надо строить волну со своей амплитудой\частотой\длиной и т.д... И что высота становится ниже\выше рандомно, ну а ширина не меняется...

Добавлено (06.09.2013, 23:50)
---------------------------------------------
Цитата (Deswing)
на середине матрицы

высоты*


Сообщение отредактировал Deswing - Пятница, 06 Сентября 2013, 23:50
TiendilДата: Суббота, 07 Сентября 2013, 10:25 | Сообщение # 2
участник
Сейчас нет на сайте
Цитата (Deswing)
Повтор - это слишком примитивно для меня, я хотел бы самостоятельно ПРИДУМАТЬ алгоритм генерации двумерного мира.

Зачем тогда спрашиваешь? Придумывай самостоятельно.

Цитата (Deswing)
ИТАК. Насколько мне известно первым делом мне нужно создать двумерный массив (ну или "матрицу", о чём я узнал недавно в институте).

Такая генерация уже придумана, ты же хочешь что-то новое придумать, не?

Цитата (Deswing)
Я сказал что-нибудь глупое? Заранее прошу дать подзатыльник, если это так! Я хочу учиться на своих же ошибках.

Разработка высокоуровневых алгоритмов слабо зависит от ЯП, так что твои знания C++ к теме вопроса слабо относятся.


Участвовал в разработке Order of War (C++ UI & логика) и WoT (Python портал worldoftanks.ru почти всё :-) )

Текущий проект: the-tale.org - indie mmozpg
DeswingДата: Суббота, 07 Сентября 2013, 14:53 | Сообщение # 3
заслуженный участник
Сейчас нет на сайте
Цитата (Tiendil)
Зачем тогда спрашиваешь? Придумывай самостоятельно.

Да, Вы верно заметили. Но я имел ввиду следующее: мне необходимо от А до Я создать алгоритм генерации, НО я не откажусь от здравой критики и взгляда со стороны. Вот сейчас я пишу реализацию "кривой", но неуверен, что у меня получится
Цитата (Tiendil)
Такая генерация уже придумана, ты же хочешь что-то новое придумать, не?

Нет, не совсем так. Моё желание: написать код САМОСТОЯТЕЛЬНО smile То есть я с удовольствием приму подсказки в алгоритмах и т.п, а вот код написать хочу сам

Добавлено (07.09.2013, 14:53)
---------------------------------------------

Код
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;

const int x = 70, y = 22;
int middle = y/2;
char map[x][y];

int generator()
{
  int h = middle;
  for(int i = 0; i < x; i++)
  {
    map[i][h] = 'x';
    h = h + rand()%3-1;
    if(h > y - 5)
    {
     h = y - 5;
    }
  }
  return 0;
}

int main()
{
  srand(time(false));
  generator();
  for(int i = 0; i < y; i++)
  {
   for(int i2 = 0; i2 < x; i2++)
   {
    cout<<map[i2][i];
   }
   cout<<endl;
  }
  _getch();
  return 0;
}

первую задачку решил. Укажите, пожалуйста, на ошибки. Как оптимизировать "это"?
(только не ругайте сильно! Я старался хД)
nonameДата: Суббота, 07 Сентября 2013, 15:44 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Цитата (Deswing)
Ну а затем, как только кривая будет построена, всё, что ниже этой кривой, будет заполнятся тем же, из чего состоит кривая (символы или спрайты - не важно, думаю


1. оптимизация:

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

2. философия:

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

Добавлено (07.09.2013, 15:44)
---------------------------------------------
..

Deswing, далее я бы посоветовал идти по двум принципиально разным направлениям:

1. решать олимпиадные задачки по программированию и математике (и почему на гцупе нет раздела для этого?)

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


все правила форумной игры Дуэль Программистов
DeswingДата: Суббота, 07 Сентября 2013, 16:00 | Сообщение # 5
заслуженный участник
Сейчас нет на сайте
Цитата (noname)
1. оптимизация:

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


Код
#include <iostream>
#include <conio.h>
#include <time.h>
#include <Windows.h>
using namespace std;

const int x = 70, y = 22;
int middle = y/2;
char map[x][y];

int generator()
{
  int h = middle;
  for(int i = 0; i < x; i++)
  {
   for(int yi = y; yi > h; --yi)
   {
    map[i][yi] = 'x';
   }
   h = h + rand()%3-1;
   if(h > y - 5)
   {
    h = y - 5;
   }
  }
  return 0;
}

int main()
{
  srand(time(false));
  generator();
  for(int i = 0; i < y; i++)
  {
   for(int i2 = 0; i2 < x; i2++)
   {
    cout<<map[i2][i];
   }
   cout<<endl;
  }
  _getch();
  return 0;
}

появилась полоска, начиная от (1;0)... Почему и как - для меня загадка sad
Ещё порой "горы" идут вплоть до самого верха

Добавлено (07.09.2013, 15:54)
---------------------------------------------
поставил
for(int yi = y-1; yi > h; --yi)
{
map[i][yi] = 'x';
}
и всё запахало. Может быть вылазил за границы массива smile

Цитата (noname)
1. решать олимпиадные задачки по программированию и математике (и почему на гцупе нет раздела для этого?)

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

Спасибо за советы, как раз-таки их придерживаться я и собираюсь со временем smile

Благодарю за помощь, повышаю Вам репутацию. Ещё как-нибудь оптимизировать код можно?

Добавлено (07.09.2013, 16:00)
---------------------------------------------

Цитата (Deswing)
Ещё порой "горы" идут вплоть до самого верха

FIX:
int generator()
{
int h = middle;
for(int i = 0; i < x; i++)
{
h = h + rand()%3-1;
if(h < 4)
{
h = rand()%2+1;
}
for(int yi = y-1; yi > h; --yi)
{
map[i][yi] = 'x';
}

}
return 0;
}
daunДата: Суббота, 07 Сентября 2013, 16:02 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Что мешает сделать точку перемещающуюся горизонтально.
Рандомно меняем изменение "изменения направления" (для плавности:) ), навешиваем кучу зависимостей то пройденного..., метод тыка.
nonameДата: Суббота, 07 Сентября 2013, 16:38 | Сообщение # 7
заслуженный участник
Сейчас нет на сайте
Цитата (Deswing)
if(h < 4)

я бы предложил

1. ограничивать h с обеих сторон: и снизу и сверху. дабы гарантированно не могло вылезти за пределы.

2. кроме заполнения снизу до h крестиками, я бы ещё заполнял остальную часть до верха массива пустотами. чтобы алгоритм, получив на входе любой массив, всегда выдавал бы гарантированно корректный результат. без мусора.

3. попробуй оформить передачу массива в функцию в качестве параметра. желательно стараться избегать использования глобальных переменных. то есть- функция в идеале должна использовать только то, что ей передают.

4. ещё можешь попробовать написать программу, читающую размер массива из файла input.txt и выдающую результат в файл output.txt. в мэйне будут вызываться четыре функции: инициализации, чтения входных данных, генерации, записи выходных данных. здесь фишка в том, чтобы уметь создавать массив произвольного размера. рекомендую использовать для этого vector.


все правила форумной игры Дуэль Программистов

Сообщение отредактировал noname - Суббота, 07 Сентября 2013, 17:07
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг