| 
				
				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  |  
| 
 | 
 |    |     
		
		 
 |