diff --git a/src/main/java/ru/cyberbiology/BasicBot.java b/src/main/java/ru/cyberbiology/BasicBot.java index fd08871..a18a8f6 100644 --- a/src/main/java/ru/cyberbiology/BasicBot.java +++ b/src/main/java/ru/cyberbiology/BasicBot.java @@ -592,10 +592,10 @@ private void botMineral2Energy(BasicBot bot) { * @param bot ссылка на бота * @param direction направлелие * @param ra флажок(относительное или абсолютное направление) - * @return + * @return 2-пусто; 3-стена; 4-органика; 5-бот; 6-родня; + * 7-похожий по минералам; 8-похожий по энергии */ private int botMove(BasicBot bot, int direction, int ra) { - // на выходе 2-пусто 3-стена 4-органика 5-бот 6-родня int xt; int yt; if (ra == 0) { // вычисляем координату клетки, куда перемещается бот (относительное направление) @@ -620,6 +620,12 @@ private int botMove(BasicBot bot, int direction, int ra) { if (isRelative(bot, bot2) == 1) { // если на клетке родня return 6; // то возвращаем 6 } + if (properties.getBoolean("EnableRelativeByMinerals") && mineralsRelative(bot2)) { + return 7; + } + if (properties.getBoolean("EnableRelativeByEnergy") && energyRelative(bot2)) { + return 8; + } return 5; // остался только один вариант - на клетке какой-то бот возвращаем 5 } @@ -697,10 +703,10 @@ private int botEat(BasicBot bot, int direction, int ra) { * @param bot ссылка на бота * @param direction направлелие * @param ra флажок(относительное или абсолютное направление) - * @return пусто - 2 стена - 3 органик - 4 бот - 5 родня - 6 + * @return 2-пусто; 3-стена; 4-органика; 5-бот; 6-родня; + * 7-похожий по минералам; 8-похожий по энергии */ private int botSeeBots(BasicBot bot, int direction, int ra) { // на входе ссылка на бота, направлелие и флажок(относительное или абсолютное направление) - // на выходе пусто - 2 стена - 3 органик - 4 бот - 5 родня - 6 int xt; int yt; if (ra == 0) { // выясняем, есть ли что в этом направлении (относительном) @@ -720,6 +726,10 @@ private int botSeeBots(BasicBot bot, int direction, int ra) { // на входе return 4; } else if (isRelative(bot, bot2) == 1) { // если родня, то возвращаем 6 return 6; + } else if (properties.getBoolean("EnableRelativeByMinerals") && mineralsRelative(bot2)) { + return 7; + } else if (properties.getBoolean("EnableRelativeByEnergy") && energyRelative(bot2)) { + return 8; } else { // если какой-то бот, то возвращаем 5 return 5; } @@ -1034,6 +1044,18 @@ private int isRelative(BasicBot bot0, BasicBot bot1) { return 1; } + private boolean mineralsRelative(BasicBot bot) { + // 10% от своих минералов + int p = (int) (mineral * 0.01 * 10); + return Math.abs(mineral - bot.mineral) < p; + } + + private boolean energyRelative(BasicBot bot) { + // 10% от своей энергии + int p = (int) (health * 0.01 * 10); + return Math.abs(health - bot.health) < p; + } + /** * Делаем бота более зеленым на экране. * diff --git a/src/main/java/ru/cyberbiology/SettingsDialog.java b/src/main/java/ru/cyberbiology/SettingsDialog.java index e614e68..7103a93 100644 --- a/src/main/java/ru/cyberbiology/SettingsDialog.java +++ b/src/main/java/ru/cyberbiology/SettingsDialog.java @@ -86,7 +86,7 @@ private void initComponents() { .addGroup(panelSettingsGeneralLayout.createSequentialGroup() .addContainerGap() .addComponent(labelDevNote) - .addContainerGap(84, Short.MAX_VALUE)) + .addContainerGap(75, Short.MAX_VALUE)) ); tabbedPane.addTab("Общие", panelSettingsGeneral); @@ -134,7 +134,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) { .addComponent(rbMineralsAccClassic) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(rbMineralsAccHeight) - .addContainerGap(28, Short.MAX_VALUE)) + .addContainerGap(19, Short.MAX_VALUE)) ); tabbedPane.addTab("Мир", panelSettingsWorld); @@ -146,12 +146,20 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { } }); - cbRelativeByEnergy.setText("родство по энергии"); - cbRelativeByEnergy.setEnabled(false); + cbRelativeByEnergy.setText("похожие по энергии (experimental)"); + cbRelativeByEnergy.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + energyRelativeChanged(evt); + } + }); - cbRelativeByMinerals.setText("родство по минералам"); - cbRelativeByMinerals.setToolTipText(""); - cbRelativeByMinerals.setEnabled(false); + cbRelativeByMinerals.setText("похожие по минералам (experimental)"); + cbRelativeByMinerals.setToolTipText("Боты будут отличать соседей, у которых количество минералов примерно такое-же"); + cbRelativeByMinerals.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + mineralsRelativeChanged(evt); + } + }); javax.swing.GroupLayout panelSettingaBotsLayout = new javax.swing.GroupLayout(panelSettingaBots); panelSettingaBots.setLayout(panelSettingaBotsLayout); @@ -163,7 +171,7 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { .addComponent(cbMultiCell) .addComponent(cbRelativeByEnergy) .addComponent(cbRelativeByMinerals)) - .addContainerGap(145, Short.MAX_VALUE)) + .addContainerGap(49, Short.MAX_VALUE)) ); panelSettingaBotsLayout.setVerticalGroup( panelSettingaBotsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -171,10 +179,10 @@ public void stateChanged(javax.swing.event.ChangeEvent evt) { .addContainerGap() .addComponent(cbMultiCell) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(cbRelativeByEnergy) - .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(cbRelativeByMinerals) - .addContainerGap(19, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(cbRelativeByEnergy) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); tabbedPane.addTab("Боты", panelSettingaBots); @@ -228,6 +236,16 @@ private void rbMineralsAccHeightActionPerformed(java.awt.event.ActionEvent evt) changedSettings.put("MineralsAccumulation", "height"); }//GEN-LAST:event_rbMineralsAccHeightActionPerformed + private void mineralsRelativeChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_mineralsRelativeChanged + JCheckBox cb = (JCheckBox) evt.getSource(); + changedSettings.put("EnableRelativeByMinerals", cb.isSelected() ? "true" : "false"); + }//GEN-LAST:event_mineralsRelativeChanged + + private void energyRelativeChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_energyRelativeChanged + JCheckBox cb = (JCheckBox) evt.getSource(); + changedSettings.put("EnableRelativeByEnergy", cb.isSelected() ? "true" : "false"); + }//GEN-LAST:event_energyRelativeChanged + // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.ButtonGroup bgMineralsAccumulation; private javax.swing.JButton buttonCancel;