Skip to content

Conversation

@stalin-777
Copy link

В ответ на:

Когда волк и заяц находятся на одной клетке, логично, что заяц должен быть съеден. Для имитации поедания зайца, недостаточно удалить зайца из локального списка beasts, также требуется удалить его и из переменной экземпляра текущего класса. Поэтому была добавлена переменная ateHares для хранения списка съеденных зайцев. В конце выполнения очередной итерации, эти зайцы съедены и удаляются из программы

Добавленный код ничего не делает, тк добавления элементов в ateHares не происходит
beasts не локальный список
Съеденные зайцы удаляются в момент съедения и съедаются со 100% вероятностью (хотя с объективной точки зрения это не так). Возможно тот факт, что волк съедает рандомного зайца, а в клетку может попасть больше одного, и создалось впечатление наличия бага в программе

Когда волк и заяц находятся на одной клетке, логично, что заяц должен быть съеден. Для имитации поедания зайца, недостаточно удалить зайца из локального списка beasts, также требуется удалить его и из переменной экземпляра текущего класса. Поэтому была добавлена переменная ateHares для хранения списка съеденных зайцев. В конце выполнения очередной итерации, эти зайцы съедены и удаляются из программы
Прошу прощения за мою невнимательность и настойчивость. 
1) Вы сказали, что "Добавленный код ничего не делает, тк добавления элементов в ateHares не происходит". И это действительно так. Все из-за моей невнимательности. Дело в том, что я редактировал код через веб-версию гита и пропустил одну строчку - №118 ateHares.add(ateHare);
2) Есть два списка beasts. Один объявлен в строке 15 и это действительно не локальный список, а переменная класса. Но речь в моем комментарии шла о локальной переменной beasts объявленной в строке №115. и удаление зайца из строки №120 beasts.remove(ateHare); происходит именно из этой переменной, а не из переменной класса WildlifeSanctuary
3) Я, таки настаиваю, что в вашей реализации заяц попавший на одну клетку с волком бежит себе дальше, так как далеко не один раз протестировал работу симулятора на скорости в 10 раз ниже дефолтной и всякий раз происходило то, о чем я говорю. После моей редакции этого не происходило, заяц съедался полностью. вариант с попадание в одну клетку двух зайцев я исключаю, т.к. считаю, что протестировал достаточное количество раз и ни разу не получил обратного результата.
Copy link
Owner

@m9ist m9ist left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Согласен, не усмотрел 115 строчку.
В коде (даже после вашего исправления) есть объективный косяк, который заключается в том, что мы создаем коллекцию в цикле beasts, а потом удаляем зайца из нее (хотя коллекция больше не будет использоваться и на что-то влиять), те строчка 119 либо лишняя (если мы идем по пути предложенного вами исправления), либо надо вообще весь ваш коммит изменить.
В моем понимании лучше было бы причесать сам код в цикле:

  1. Переименовать локальную коллекцию beasts -> aliveHaresInCell (или как-то так), чтобы она коррелировала с ее предназначением и самодокументировала код, особенно на случай выделения алгоритма поиска жертвы в функцию (класс/сервис и тд) - первый коммит, стилистический.
  2. В строчке удаления съеденного кролика из коллекции заменить локальную вспомогательную коллекцию на глобальную - второй коммит.

Этот вариант лучше еще и с точки зрения логики, тк в ячейке может оказаться 2 волка и они не должны съесть одного зайца, поэтому удалять жертву с поля нужно сразу. В качестве бонуса, алгоритм будет менее многословен.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants