From 1fd4a27447968996e828f4c39bbb7811837fe84e Mon Sep 17 00:00:00 2001 From: Sergey Sokolov Date: Wed, 5 Dec 2018 17:07:02 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D1=81=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=B3=D0=B5=D0=BD=D0=BE=D0=B2=20=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/ru/cyberbiology/BasicBot.java | 3 + src/main/java/ru/cyberbiology/GeneQueue.java | 100 ++++++++++++++++++ src/main/java/ru/cyberbiology/MainWindow.java | 3 + .../java/ru/cyberbiology/GeneQueueTest.java | 64 +++++++++++ 4 files changed, 170 insertions(+) create mode 100644 src/main/java/ru/cyberbiology/GeneQueue.java create mode 100644 src/test/java/ru/cyberbiology/GeneQueueTest.java diff --git a/src/main/java/ru/cyberbiology/BasicBot.java b/src/main/java/ru/cyberbiology/BasicBot.java index 318c812..fd08871 100644 --- a/src/main/java/ru/cyberbiology/BasicBot.java +++ b/src/main/java/ru/cyberbiology/BasicBot.java @@ -74,6 +74,8 @@ public class BasicBot implements Bot { public byte[] mind = new byte[MIND_SIZE]; // геном бота содержит 64 команды + public GeneQueue genesHistory = new GeneQueue(100); + /** * Поля нужны для сериализации ботов координаты соседних клеток многоклеточного. */ @@ -213,6 +215,7 @@ private void execGenes() { // Получаем обработчика команды cont = geneController[command]; + genesHistory.add(command); if (cont != null) { // если обработчик такой команды назначен if (cont.onGene(this)) { // передаем ему управление break; // если обрабочик говорит, что он последний - завершаем цикл? diff --git a/src/main/java/ru/cyberbiology/GeneQueue.java b/src/main/java/ru/cyberbiology/GeneQueue.java new file mode 100644 index 0000000..46f7458 --- /dev/null +++ b/src/main/java/ru/cyberbiology/GeneQueue.java @@ -0,0 +1,100 @@ +package ru.cyberbiology; + +/** + * Класс представляет собой список выполненных генов в виде очереди. + * + *

В отличие от классической очереди, данная очередь не позволяет + * извлекать или получать элементы, их можно только добавлять. Эта очередь + * имеет фиксированный размер. При заполнении очереди, вновь добавляемые + * элементы переписывают самые старые. + * Все элементы очереди можно получить в виде массива с помощью toArray(). + * + * @author Sergey Sokolov (xlamserg@gmail.com) + */ +class GeneQueue { + + private final int size; + private final int[] data; + private int tail; + private int count = 0; + + /** + * Создает объект очереди. + * + * @param size размер очереди - максимальное количество сохраняемых элементов + */ + public GeneQueue(int size) { + this.size = size; + data = new int[size]; + } + + /** + * Проверяет пуста ли очередь. + * + * @return true если очередь пуста; + * false в противном случае + */ + public boolean isEmpty() { + return count == 0; + } + + /** + * Возвращает количество элементов в очереди. + * + * @return количество элементов в очереди + */ + public int count() { + return count; + } + + /** + * Добавляет элемент в очередь. + * + * @param i добавляемый элемент + */ + public void add(int i) { + if (++tail == size) { + tail = 0; + } + data[tail] = i; + if (count < size) { + count++; + } + } + + /** + * Возвращает представление очереди в виде массива. + * + *

Массив будет иметь размер, соответствующий количеству элементов. + * Элементы будут расположены в порядке от самого нового до самого старого. + * + * @return упорядоченный массив очереди + */ + public int[] toArray() { + if (isEmpty()) { + return null; + } + int[] result = new int[count]; + int j = tail + 1; + for (int i = 0; i < count; i++) { + if (--j < 0) { + j = size - 1; + } + result[i] = data[j]; + } + return result; + } + + @Override + public String toString() { + if (isEmpty()) { + return "[]"; + } + int[] arr = toArray(); + String result = "[" + arr[0]; + for (int i = 1; i < arr.length; i++) { + result += "," + arr[i]; + } + return result += "]"; + } +} diff --git a/src/main/java/ru/cyberbiology/MainWindow.java b/src/main/java/ru/cyberbiology/MainWindow.java index e382903..822b9d8 100644 --- a/src/main/java/ru/cyberbiology/MainWindow.java +++ b/src/main/java/ru/cyberbiology/MainWindow.java @@ -225,6 +225,7 @@ public void mouseClicked(MouseEvent e) { default: break; } + buf.append("

Выполенные гены: ").append(bot.genesHistory.toString()); buf.append("

c_blue=").append(bot.colorBlue); buf.append("

c_green=").append(bot.colorGreen); buf.append("

c_red=").append(bot.colorRed); @@ -243,6 +244,8 @@ public void mouseClicked(MouseEvent e) { buf.append(String.valueOf(i)); buf.append(" "); buf.append(cont.getDescription(bot, i)); + buf.append(" "); + buf.append(bot.mind[i]); buf.append("

"); } } diff --git a/src/test/java/ru/cyberbiology/GeneQueueTest.java b/src/test/java/ru/cyberbiology/GeneQueueTest.java new file mode 100644 index 0000000..7f1a85c --- /dev/null +++ b/src/test/java/ru/cyberbiology/GeneQueueTest.java @@ -0,0 +1,64 @@ +package ru.cyberbiology; + +import org.junit.After; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; + +/** + * + * @author Sergey Sokolov (xlamserg@gmail.com) + */ +public class GeneQueueTest { + + private final int size = 5; + private GeneQueue queue; + + @Before + public void setUp() { + queue = new GeneQueue(size); + } + + @After + public void tearDown() { + queue = null; + } + + @Test + public void newQueueIsEmpty() { + assertTrue(queue.isEmpty()); + assertEquals(0, queue.count()); + } + + @Test + public void emptyQueueToArrayReturnsNull() { + assertNull(queue.toArray()); + } + + @Test + public void queueElementsCountEqualsAddedElementsCount() { + add(3); + assertEquals(3, queue.count()); + } + + @Test + public void elementsCountDoesNotExceedQueueSize() { + add(6); + assertEquals(size, queue.count()); + } + + @Test + public void addingInFullQueueOverwritesTheOldestElement() { + add(5); + queue.add(25); + assertEquals(25, (queue.toArray())[0]); + queue.add(30); + assertEquals(30, (queue.toArray())[0]); + } + + private void add(int count) { + for (int i = 0; i < count; i++) { + queue.add(i+1); + } + } +}