From b4cd02f8cec7c67313931d247f8f061859170c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9C=D0=B8?= =?UTF-8?q?=D1=85=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= <36783314+stalin-777@users.noreply.github.com> Date: Mon, 23 Dec 2019 16:19:29 +0600 Subject: [PATCH 1/2] Update WildlifeSanctuary.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Когда волк и заяц находятся на одной клетке, логично, что заяц должен быть съеден. Для имитации поедания зайца, недостаточно удалить зайца из локального списка beasts, также требуется удалить его и из переменной экземпляра текущего класса. Поэтому была добавлена переменная ateHares для хранения списка съеденных зайцев. В конце выполнения очередной итерации, эти зайцы съедены и удаляются из программы --- .../forest/fauna/WildlifeSanctuary.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/ru/neolab/forest/fauna/WildlifeSanctuary.java b/src/ru/neolab/forest/fauna/WildlifeSanctuary.java index 6afa79a..5937ca0 100644 --- a/src/ru/neolab/forest/fauna/WildlifeSanctuary.java +++ b/src/ru/neolab/forest/fauna/WildlifeSanctuary.java @@ -38,10 +38,10 @@ public void addListener(final WildlifeSanctuaryListener listener) { listeners.add(listener); } - //-------------------------------------- + //-------------------------------------- ðàáîòà ñ äâèæåíèåì è âîçìîæíûìè êîîðäèíàòàìè /** - * . , + * Çàäàþòñÿ ïðàâèëà ïåðåäâèæåíèÿ ïî ïîëþ. Ìîæíî çäåñü íàêèäàòü ïðåïÿòñòâèé, îâðàãîâ è ïð è äð è òä */ private boolean possibleMove(final Coordinates from, final Coordinates to, final double speed) throws SanctuaryException { if (!checkIsPossible(from)) { @@ -53,7 +53,7 @@ private boolean possibleMove(final Coordinates from, final Coordinates to, final } /** - * , + * Çàäàåòñÿ ãåîìåòðèÿ ïîëÿ, òóò ìîæíî õîòü êðóã íàðèñîâàòü */ boolean checkIsPossible(final Coordinates coordinates) { return coordinates.x >= 0 @@ -88,19 +88,20 @@ public final List getPossibleMoves(final Coordinates from, final do return coordinates; } - //-------------------------------------- + //-------------------------------------- èòåðàöèè public void addBeast(final Beast beast, final Coordinates coordinates) { beasts.put(beast, new BeastSanctuaryState(beast, coordinates)); } /** - * . , , , - * . + * Ïðîâîäèì èòåðàöèþ èçìåíåíèÿ ìèðà. Ïîêà ìèð íàø ïðîñò, áåç ýêñöåññîâ, âñå âûáèðàþò ÷òî îí áóäóò äåëàòü, ïîòîì + * ýòî ïðîèñõîäèò. *

- * - , - , - , - - * . + * Ê ïðèìåðó çàÿö ñêàçàë - áóäó äâèãàòüñÿ òóäà, âîëê - áóäó ðàçìíîæàòüñÿ, à òðàâêà - ÷òî îíà îòðàñòåò, à âòîðîé çàÿö - + * ÷òî áóäó æðàòü êàê íå â ñåáÿ è íàñëàæäàòüñÿ æèçíüþ. */ private void iteration() throws SanctuaryException { + List ateHares = new ArrayList(); if (!events.isEmpty()) { throw new SanctuaryException("Not empty state"); } @@ -138,7 +139,7 @@ private void iteration() throws SanctuaryException { grass.stepDone(0); } } - // + // âîñïðîèçâîäñòâî òðàâû ïîñëå òîãî êàê åå âñþ ñúåëè for (final Coordinates coordinate : grasses.keySet()) { final Grass grass = grasses.get(coordinate); if (grass.getKilocalories() <= 0) { @@ -154,12 +155,18 @@ private void iteration() throws SanctuaryException { grass.growGrass(numPossibleParents); } } - // .... + // ìåíÿåì ýòîò ìèð.... for (final Event event : events) { if (event.beast.isDead()) continue; event.apply(this); } events.clear(); + + if (!ateHares.isEmpty()) { + for (Hare ateHare : ateHares) { + this.beasts.remove(ateHare); + } + } } public void addEvent(final Event event) { @@ -174,7 +181,7 @@ public double getDistance(final Coordinates c1, final Coordinates c2) { return Math.sqrt(Math.pow(c1.x - c2.x, 2) + Math.pow(c1.y - c2.y, 2)); } - //----------------------------------- + //----------------------------------- ðåàëèçàöèÿ ïðèìåíåíèÿ íàêîïëåííûõ ðåøåíèé èçìåíåíèé ìèðà void moveBeast(final Beast beast, final Coordinates to) throws SanctuaryException { final BeastSanctuaryState beastSanctuaryState = beasts.get(beast); @@ -192,10 +199,10 @@ void beastAte(final Beast beast, final double kilocalories) { beast.kilocaloriesAte(kilocalories); } - //----------------------------------- + //----------------------------------- äëÿ ïðîðèñîâêè ìèðà /** - * + * Ïîëó÷èòü æèâîòíûõ â ýòîé ÿ÷åéêå ìèðà */ public List getBeasts(final Coordinates coordinate) { final ArrayList out = new ArrayList<>(); From ed78d318a00853d57ce098509436680f47c8b49a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9=20=D0=9C=D0=B8?= =?UTF-8?q?=D1=85=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2=D0=B8=D1=87?= <36783314+stalin-777@users.noreply.github.com> Date: Wed, 8 Jan 2020 03:12:19 +0600 Subject: [PATCH 2/2] Update WildlifeSanctuary.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Прошу прощения за мою невнимательность и настойчивость. 1) Вы сказали, что "Добавленный код ничего не делает, тк добавления элементов в ateHares не происходит". И это действительно так. Все из-за моей невнимательности. Дело в том, что я редактировал код через веб-версию гита и пропустил одну строчку - №118 ateHares.add(ateHare); 2) Есть два списка beasts. Один объявлен в строке 15 и это действительно не локальный список, а переменная класса. Но речь в моем комментарии шла о локальной переменной beasts объявленной в строке №115. и удаление зайца из строки №120 beasts.remove(ateHare); происходит именно из этой переменной, а не из переменной класса WildlifeSanctuary 3) Я, таки настаиваю, что в вашей реализации заяц попавший на одну клетку с волком бежит себе дальше, так как далеко не один раз протестировал работу симулятора на скорости в 10 раз ниже дефолтной и всякий раз происходило то, о чем я говорю. После моей редакции этого не происходило, заяц съедался полностью. вариант с попадание в одну клетку двух зайцев я исключаю, т.к. считаю, что протестировал достаточное количество раз и ни разу не получил обратного результата. --- src/ru/neolab/forest/fauna/WildlifeSanctuary.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ru/neolab/forest/fauna/WildlifeSanctuary.java b/src/ru/neolab/forest/fauna/WildlifeSanctuary.java index 5937ca0..2daaad6 100644 --- a/src/ru/neolab/forest/fauna/WildlifeSanctuary.java +++ b/src/ru/neolab/forest/fauna/WildlifeSanctuary.java @@ -115,6 +115,7 @@ private void iteration() throws SanctuaryException { final List beasts = getAliveBeast(whereBeast(wolf), Hare.class); if (beasts.size() == 0) continue; final Hare ateHare = beasts.get((int) (beasts.size() * Math.random())); + ateHares.add(ateHare); events.add(new Event.BeastAte(wolf, ateHare.getKilocalories())); beasts.remove(ateHare); }