2D Map Generator
| |
Deswing | Дата: Пятница, 06 Сентября 2013, 23:50 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Всем добра. Возможно, кто-нибудь помнит старые мои темы с вопросами про создание генератора мира. Действительно, Fade, x-and и многие другие люди мне очень помогли, за что им низкий поклон. Я бы сам никогда не справился с такой задачей. НО! Я так и не почувствовал радости от того, что я это написал. По крайней мере из-за того что код был написан за меня. Конечно, я человек не глупый, ковырялся в коде достаточно долго, пытался повторить самостоятельно... НО[2]! Повтор - это слишком примитивно для меня, я хотел бы самостоятельно ПРИДУМАТЬ алгоритм генерации двумерного мира. Так как я не очень опытный программист С++ (программирую давно, но есть большие пробелы в знаниях) мне понадобится помощь со стороны. Т.е. я с радостью выслушаю ваши советы, прислушаюсь к ним и буду действовать.
ИТАК. Насколько мне известно первым делом мне нужно создать двумерный массив (ну или "матрицу", о чём я узнал недавно в институте). Этот массив и будет моей картой. Потом будет браться точка слева приблизительно на середине матрицы и как-то строиться кривая вплоть до правого края карты. Ну а затем, как только кривая будет построена, всё, что ниже этой кривой, будет заполнятся тем же, из чего состоит кривая (символы или спрайты - не важно, думаю ) Я сказал что-нибудь глупое? Заранее прошу дать подзатыльник, если это так! Я хочу учиться на своих же ошибках.
ЗАДАЧА: построить кривую от левого края к правому, причем чтобы высота "рандомно" варировалась. Пока что я нашел лишь "шум Перлина", но он мне пока что не совсем по зубам, так как единственное, что я понял оттуда, так это что надо строить волну со своей амплитудой\частотой\длиной и т.д... И что высота становится ниже\выше рандомно, ну а ширина не меняется...
Добавлено (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) Такая генерация уже придумана, ты же хочешь что-то новое придумать, не? Нет, не совсем так. Моё желание: написать код САМОСТОЯТЕЛЬНО То есть я с удовольствием приму подсказки в алгоритмах и т.п, а вот код написать хочу самДобавлено (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)... Почему и как - для меня загадка Ещё порой "горы" идут вплоть до самого верхаДобавлено (07.09.2013, 15:54) --------------------------------------------- поставил for(int yi = y-1; yi > h; --yi) { map[i][yi] = 'x'; } и всё запахало. Может быть вылазил за границы массива Цитата (noname) 1. решать олимпиадные задачки по программированию и математике (и почему на гцупе нет раздела для этого?)
2. попробовать сделать какой-то законченный продукт. например- обычные крестики-нолики 3x3. потом- тетрис, шашки или морской бой. а уж сделать шахматы- это вообще будет класс(там много скрытых сложностей). я не имею ввиду сложности в программировании ИИ- пусть ИИ будет простейшим рандомом. я имею ввиду что важно уметь не только задачки решать, но и уметь продумывать структуру программы, делать законченные работающие вещи. Спасибо за советы, как раз-таки их придерживаться я и собираюсь со временем
Благодарю за помощь, повышаю Вам репутацию. Ещё как-нибудь оптимизировать код можно?Добавлено (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 |
|
| |
|