Skip to content

Commit

Permalink
imitate: добавление гена подражания в поведении
Browse files Browse the repository at this point in the history
    Команда копирует случайный участок генома другого бота
    в свой геном и передает туда управление.
  • Loading branch information
xlam committed Aug 13, 2018
1 parent a1665fe commit e48d120
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 2 deletions.
54 changes: 52 additions & 2 deletions ru/cyberbiology/test/Bot.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ru.cyberbiology.test;


import java.util.Random;
import ru.cyberbiology.test.gene.GeneCareAbsolutelyDirection;
import ru.cyberbiology.test.gene.GeneCareRelativeDirection;
import ru.cyberbiology.test.gene.GeneChangeDirectionAbsolutely;
Expand All @@ -11,6 +12,7 @@
import ru.cyberbiology.test.gene.GeneFullAroud;
import ru.cyberbiology.test.gene.GeneGiveAbsolutelyDirection;
import ru.cyberbiology.test.gene.GeneGiveRelativeDirection;
import ru.cyberbiology.test.gene.GeneImitate;
import ru.cyberbiology.test.gene.GeneIsHealthGrow;
import ru.cyberbiology.test.gene.GeneIsMineralGrow;
import ru.cyberbiology.test.gene.GeneIsMultiCell;
Expand Down Expand Up @@ -84,7 +86,7 @@ public class Bot implements IBot
geneController[47] = new GeneMineralToEnergy();//47 преобразовать минералы в энерию
geneController[48] = new GeneMutate();//48 мутировать


geneController[50] = new GeneImitate(); // 50 имитация, подражание
}

public static final int MIND_SIZE = 64; //Объем генома
Expand Down Expand Up @@ -1226,4 +1228,52 @@ public void genAttack()
this.botGenAttack(this);

}
}

@Override
public int imitate(int dir) {
// на выходе пусто - 2 стена - 3 органик - 4 бот - 5
health = health - 4; // бот теряет на этом 4 энергии в независимости от результата
// вычисляем относительное направление действия
int xt = xFromVektorR(this, direction);
int yt = yFromVektorR(this, direction);
if ((yt < 0) || (yt >= world.height)) { // если там стена возвращаем 3
return 3;
}
Bot bot = world.matrix[xt][yt];
if (bot == null) { // если клетка пустая возвращаем 2
return 2;
}
if (bot.alive <= LV_ORGANIC_SINK) { // если там оказалась органика
return 4; // возвращаем 4
}

Random rnd = new Random();

// размер копируемого участка от четверти до половины генома
int len = (int)(MIND_SIZE / 4) + rnd.nextInt((int)(MIND_SIZE / 4));

// адрес начала участка копирования из генома другого бота
int adrFrom = (int)(Math.random() * MIND_SIZE);

// адрес начала участка записи в геном бота
// следующая ячейка после параметра команды imitate
int adrTo = adr + 2;

// копируем данные самым примитивным способом
for (int i=0; i<len; i++) {
adrFrom += i;
if (adrFrom > MIND_SIZE - 1) {
// TODO проверить граничные условия
adrFrom -= MIND_SIZE;
}
adrTo += i;
if (adrTo > MIND_SIZE - 1) {
// TODO проверить граничные условия
adrTo -= MIND_SIZE;
}
setMind((byte)adrTo, bot.mind[adrFrom]);
}

return 2;
}
}
29 changes: 29 additions & 0 deletions ru/cyberbiology/test/gene/GeneImitate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ru.cyberbiology.test.gene;

import ru.cyberbiology.test.prototype.IBot;
import ru.cyberbiology.test.prototype.gene.ABotGeneController;

/**
* Имитирование, подражание в поведении.
* Команда копирует случайный участок генома друго бота в свой геном.
*
* @author Sergey Sokolov <[email protected]>
*/
public class GeneImitate extends ABotGeneController {

@Override
public boolean onGene(IBot bot) {
// направление действия
int dir = bot.getParam() % 8;
// адрес начала копирования в геноме другого бота
bot.incCommandAddress(bot.imitate(dir));
// команда завершающая
return true;
}

@Override
public String getDescription(IBot bot, int i) {
return "имитирование";
}

}
2 changes: 2 additions & 0 deletions ru/cyberbiology/test/prototype/IBot.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,6 @@ public interface IBot
public void genAttack();
public IWorld getWorld();

public int imitate(int dir);

}

0 comments on commit e48d120

Please sign in to comment.