Ваши идеи по поводу моей идеи(Эволюция в МК

5,018
47
783
Даровствуйте все, граждане. Начитался книжек про антропологию и эволюцию и вспомнил про мод Darwin Mod, которые в незапамятные времена, когда еще землю покрывал толстый слой льда, а люди в шкурах охотились на мамонтов и играли на 1.6.4, который был написан неким ноунеймом. Данный мод весьма ограниченно, но в целом верно попытался воссоздать возможности эволюции мобов в майнкрафте. Т.к я в мобах не шарю почти, решил на этом примере попробовать их изучить.

У меня на данный момент такие мысли - необходимо создать некую псевдоДНК моего животного опр. стартового вида(допустим их четыре, как в Darwin Mod), которая будет записана в нбт(не помню есть ли у блока нбт), которое будет двумерным массивом n элементов из 4 случайных цифр(или лучше сразу символов - ABCD), где каждая буква должна иметь свой индекс. И эти буквы ABCD могут располагаться в любом возможном сочетании индексов(ABDC, ABDC и так далее). Всего вариантов получается 35. А вот последнее значение является пустым в этой матрице. Но у нас же компуктер, тут все точно, поэтому пусть будет.
Как пример приведу эту матрицу генокода любого живого существа на Земле - 36 комбинация как раз пустая, в ней только одна АК, как видите.
d0b3d0b5d0bd-d0bad0bed0b4.jpg
Причем массив условно не ограниченный, т.е элементов n может быть столько, сколько вместит какой нить лонг. И не обязательно чтобы количество элементов, конечно, было размером с long

Основная проблема Darwin Mod - ограниченность. Там имеется по 4 ноги, 4 руки, 4 хвоста, уха и так далее. И они комбинируются и так дальше, хоть и вариаций можно много сделать, но внешний вид даже через много много поколений будет все таким же одинаковым. Я же хочу сделать, чтобы размеры кубиков тела, головы, хвоста и так далее определялись исходя из днк. Это гораздо сложней, вот и обращаюсь за советом. Ваши мысли?
 
Последнее редактирование:
5,018
47
783
Причем тут количество мобов? Мобы мои будут, изначальные. К примеру свинья, корова, лошадь, овца. И даже постоянно скрещивая овцу с овцой, в итоге можно будет получить уже нихрена не овцу. Вот в чем суть)
 
2,932
44
598
Кстати,а теория хаоса сможет тебе в этом помочь?
(Тайм код 5:41)
В ролике тоже про визуализацию, может это натолкнёт на какие-то идеи.
 
5,018
47
783
Ты вообще ниче не понял из моей идеи, Гарик)
 
2,932
44
598
Та я понял, хочешь сделать генетику, чтоб у какой-то семьи овец случайно родился "баран" с другим окрасом, или у волков появились более мирные волки.

Может можно сделать какую-то математическую формулу, как в видео выше, и с помощь неё это дело проворачивать?
 
5,018
47
783
Тут не нужно ничего придумывать, природа уже все придумала и я это расписал в топике)
Я спрашиваю сейчас о конкретных вариантах реализации этого в коде и в визуальной реализации. Расчет рандомных последовательностей 4 букв на сервере сделать и записать в нбт дело нетрудное.
 
5,018
47
783
В принципе у меня сейчас получилось что то такое:
(замутил квадруплетами, так проще)
Java:
public class Main {

    public static final int NUCLEOTIDE[] = new int[]{0, 1, 2, 3};
    static int n, k;
    static int[] CODONE;

    static int[][][][] DNA;
    public static void main(String[] args) {

        n = NUCLEOTIDE.length;
        k = NUCLEOTIDE.length;

        int count = (calcFactorial(n+k-1)/(calcFactorial(n-1)*calcFactorial(k)));
        CODONE = new int[k];
        System.out.println("CODONE_VAR " + count);
        calcCodone(0,1);

        Random rand = new Random();
        int DNA_L = rand.nextInt(100);
        System.out.println("DNA_LENGHT = " + DNA_L);


        for(int i = 0; i <= DNA_L  ; i++) {
            DNA = new int[CODONE[0]][CODONE[1]][CODONE[2]][CODONE[3]];
        }
        System.out.println( "DNA + "Arrays.deepToString(DNA));
    }
    static int calcFactorial(int n){
        int result = 1;
        for (int i = 1; i <= n; i++){
            result = result*i;
        }
        return result;
    }

    static void calcCodone(int pos, int maxUsed) {

        if(pos == k) {
            System.out.println(Arrays.toString(CODONE));
        } else {
            for(int i = maxUsed; i <= n; i++) {
                CODONE[pos] = i;
                calcCodone(pos+1,i);

            }
        }
    }
Вроде примерно как надо делает, только я чет никак не могу сообразить, как мне запихивать кодоны теперь в этот массив.

Java:
CODONE_VAR 35
[1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 1, 3]
[1, 1, 1, 4]
[1, 1, 2, 2]
[1, 1, 2, 3]
[1, 1, 2, 4]
[1, 1, 3, 3]
[1, 1, 3, 4]
[1, 1, 4, 4]
[1, 2, 2, 2]
[1, 2, 2, 3]
[1, 2, 2, 4]
[1, 2, 3, 3]
[1, 2, 3, 4]
[1, 2, 4, 4]
[1, 3, 3, 3]
[1, 3, 3, 4]
[1, 3, 4, 4]
[1, 4, 4, 4]
[2, 2, 2, 2]
[2, 2, 2, 3]
[2, 2, 2, 4]
[2, 2, 3, 3]
[2, 2, 3, 4]
[2, 2, 4, 4]
[2, 3, 3, 3]
[2, 3, 3, 4]
[2, 3, 4, 4]
[2, 4, 4, 4]
[3, 3, 3, 3]
[3, 3, 3, 4]
[3, 3, 4, 4]
[3, 4, 4, 4]
[4, 4, 4, 4]
DNA_LENGHT = 30
DNA [[[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]], [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]], [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]], [[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]], [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]]]
 
4,045
63
645
Я думаю, что ты помучаешься немного и забьёшь, патамашта сложна.
...
А если серьёзно, я считаю, что нет смысла строить эволюцию исключительно на мутациях... В конечном итоге ты получишь только несуразных мутантов.
А за неимением естественного отбора исправить ситуацию будет нечем.
А естественный отбор ты в жизни в майне не напишешь.
...
Так что всё равно придётся ограничиваться 4-мя вариантами... Ну и зачем тебе, в таком случае, пареписывать Дарвин мод?
 
1,038
57
229
Я же хочу сделать, чтобы размеры кубиков тела, головы, хвоста и так далее определялись исходя из днк
Дело в том, что если ты напишешь например соверешенно случайный лабиринт, снова и снова. То в голове игрока он совершенно не сохранится (он не вспомнит где он был и возможно даже что он там делал). Я к тому что хаус не делает игру играбельной. Поэтому все делают управляемый хаус. Это например seed в майнкрафт картах где можно указать дату своего рождения и этот мир будет всегда всегда одинаковым (что очень удобно, изучив его, ты всегда будешь знать где и что лежит в отличии от тех кто придёт на него играть впервые). Проще говоря это знания, которые в дальнейшем тебе хотя бы пригодятся, и именно поэтому его интересно изучать и запоминать.
Если ты сделаешь тварей с совершенно случайными параметрами игрок перестанет их различать. Обрати внимание на Spore, в которой виды подчинялись определенным законам. Поэтому это ABCD, это как раз то самое ограничение, чтобы игрок узнавал виды. Чтобы уже знал модель поведения и т.д.
Самая удобная (и из самых интересных) это модель нашего с вами гороскопа. 13 знаков зодиака и 12 животных для каждого года. Во первых её знает каждый второй, во вторых уже всё расписано, не надо ничего придумывать. А вот воплотить... если вы не создатель Sims, очень даже проблематично.
 
5,018
47
783
А если серьёзно, я считаю, что нет смысла строить эволюцию исключительно на мутациях.
Но ведь изменения не будут столь кардинальными.

Насчет свойств, ZZZCubec, я не собираюсь делать мод, который будет играбелен в выживании. Суть - креативный мод, в котором надо заниматься скрещиванием мобов чисто из интереса, как в дарвин моде
 
5,018
47
783
Итак, добрался до записи кодонов в цельную днк, но почему то все записываются как 35-й. Кто шарит в чем дело?

Java:
public class Main {

    static ArrayList<int[]> codelist = new ArrayList<int[]>();
    public static final int NUCLEOTIDE[] = new int[]{0, 1, 2, 3};
    static int n, k;
    static int[] CODONE;

    static int[] DNA;
    public static void main(String[] args) {

        n = NUCLEOTIDE.length;
        k = NUCLEOTIDE.length;

        int count = (calcFactorial(n+k-1)/(calcFactorial(n-1)*calcFactorial(k)));
        CODONE = new int[k];
        System.out.println("CODONE_VAR " + count);
        
        calcCodone(0,1);

        
        System.out.println(codelist.size());

        
        
        Random rand = new Random();
        int DNA_L = rand.nextInt(100);
        System.out.println("DNA_LENGHT = " + DNA_L);

        
        
        int j = rand.nextInt(35);
        System.out.println( j);
        for(int i = 0; i <= DNA_L  ; i++) {   
            System.out.println(Arrays.toString(codelist.get(i)));
        }
        System.out.println( Arrays.toString(DNA));
    }
    static int calcFactorial(int n){
        int result = 1;
        for (int i = 1; i <= n; i++){
            result = result*i;
        }
        return result;
    }   

    static void calcCodone(int pos, int maxUsed) {
    
        if(pos == k) {
            System.out.println(Arrays.toString(CODONE));
            codelist.add(CODONE);
            
        } else {
            for(int i = maxUsed; i <= n; i++) {
            
                CODONE[pos] = i;
                calcCodone(pos+1,i);
                
            }
        }
        
    }

Java:
CODONE_VAR 35
[1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 1, 3]
[1, 1, 1, 4]
[1, 1, 2, 2]
[1, 1, 2, 3]
[1, 1, 2, 4]
[1, 1, 3, 3]
[1, 1, 3, 4]
[1, 1, 4, 4]
[1, 2, 2, 2]
[1, 2, 2, 3]
[1, 2, 2, 4]
[1, 2, 3, 3]
[1, 2, 3, 4]
[1, 2, 4, 4]
[1, 3, 3, 3]
[1, 3, 3, 4]
[1, 3, 4, 4]
[1, 4, 4, 4]
[2, 2, 2, 2]
[2, 2, 2, 3]
[2, 2, 2, 4]
[2, 2, 3, 3]
[2, 2, 3, 4]
[2, 2, 4, 4]
[2, 3, 3, 3]
[2, 3, 3, 4]
[2, 3, 4, 4]
[2, 4, 4, 4]
[3, 3, 3, 3]
[3, 3, 3, 4]
[3, 3, 4, 4]
[3, 4, 4, 4]
[4, 4, 4, 4]
35
DNA_LENGHT = 40
16
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
[4, 4, 4, 4]
 
Сверху