Code Monkey home page Code Monkey logo

my_genesis's Introduction

ИСКУССТВЕННАЯ ЖИЗНЬ

ВВЕДЕНИЕ

Проект является игрой, симулирующей эволюцию и жизнь замкнутой системы клеток (далее ботов, чтобы не путаться с клетками поля). Игра создана с использованием языка Python 3.8 и библиотеки PyGame 2.0.1.
Действия игры происходят на поле 180x96 клеток. Каждый ход каждый живой бот выполняет код своего уникального генома (о работе ботов будет рассказано дальше), в результате которого остается либо жив, либо умирает, либо создает своего потомка.

GETTING STARTED

  1. Склонируйте этот репозиторий
  2. pip install -r requirments.txt
  3. Запустите файл main.py для начала симуляции или продолжения предыдущей. Симуляция начнется в фоновом режиме
  4. Запустите файл saves_video_player.py для просмотра результатов симуляции. Используйте колесико мыши для изменения скорости проигрывания и режима отобрвжения (цвет ботов, энергия и минералы)
    В проекте уже есть дэмка симуляции, но, к сожалению, ГитХаб не дал выложить ее достаточно большой, так что она урезана

СТРУКТУРА

Проект состоит из функций и классов, который логично распределены по всем файлам.
Далее описаны функции всех файлов

  • consts.py - хранение всех глобальных констант, необходимых для работы каждого отдельного файла
  • bot.py - хранение класса бота
  • front.py - класс, отвечающих за обработку данных и вывода их пользователю в ЧЧФ понятном формате
  • saver.py - функции, отвечающие за сохранение кадров для отображения и состояния ботов для продолжения симуляции в будущем
  • main.py - файл, отвечающий за запуск симуляции и инициализирования игры
  • saves_video_player.py - отображение истории симуляции

ОПИСАНИЕ ПРИНЦИПОВ РАБОТЫ

Далее описаны файлы более подробно по отдельности

bot.py

Суть этого файла это хранение класса бота.
Главной функцией класса является execute_commands, как ясно из названия она выполняет код генома бота. Также этот метод использует другие дополнительные функции такие как

  • check_values для предотвращения отрицательных значений для, к примеру, здоровья метод был добавлен для предотвращения явления ходячих мертвецов
  • die_or_kill для собственной смерти или убийства жертвы
  • more_color для изменения своего цвета (об этом позже)
  • bot_double для создания своего потомка
  • и других которые постеснялись представляться

Далее разберем суть работы бота, его мозга и генома

Бот представляет из себя клетку в этом бренном мире на общем поле. Он имеет направление (пронумерованы числами 0...7 от северо-западного по часовой стрелке), геном, счетчик команды, координаты на поле, цвет и счетчики энергии (то же самое, что и здоровье) и минералов.
Поле представляет из сбея набор клеток, в каждой из которых может находиться

  • ничего (пустая клетка)
  • бот
  • стена
  • органика (труп бота)

Бот живет, чтобы питаться, а умирает, чтобы питались другие

Бот может питаться двумя способами (кажддый из них эффективен в разных ситуациях)

  • фотосинтез
  • хищник

В понятие хищник входит не только питание другими живыми ботами, но и падалью.
Бот при питании фотосинтезом получает определенное количество энергии в зависимости от высоты и сезона
При хищнеческом образе жизни бот получает часть от энергии и минералов жертвы или, если питается органикой, то лишь минералы. Минералы можно обменивать на энергию по очень выгодному курсу.
Основной валютой жизни является энергия, поэтому минералы используются для ее хранения и как метод получения энергии.

Геном состоит из 64 команд, они все представлены числом 1...63. Счетчик команды отвечает за текущий номер команды.
Далее я пытаюсь описываю каждую команду.

  • 23 - поменять свое направление на некоторый параметр (далее мы еще встретим параметр не раз и я буду это называть просто сделать что-то относительно)
    Параметр определяется следующей командой (делится на необходимое число) То есть к текущему направлению прибавляется остаток от следующей команды на 8
  • 24 - повернуться в сторону параметра (далее относительно)
    Направление равно остатку от деления параметра на 8
  • 25 - фотосинтез
    Количество энергии, получаемой ботом вычисляется по формуле
    плюс_энергия = сезон - высота // 6 Высота делится на 6, потому что поле мысленно разделено на 6 частей, то есть у самого дна, попытавшись сделать фотосинтез, бот получит отрицательный приход энергии, что делает фотосинтез эффективным лишь сверху.
  • 26, 27 - движение относительно и абсолютно соответственно.
    Бот меняет направление относительно или абсолютно и пытается двигаться. В зависимости от того, что было спереди, и смог ли он передвинуться счетчик команды меняется на 2...6. В будущем многие функции будут иметь подобную механику и я не буду заострять на этом внимания.
  • 28, 29 - съесть относительно и абсолютно соответственно.
    Бот меняется направление и пытается съесть то, что перед ним.
    Съев органику, бот получает 100 энергии и 150 минералов.
    Если перед ботом другой бот, то он пытается его съесть. Механика неприятная, поэтому если кратко, то бот сначала съедает панцирь, который определяется количеством минералов, затем энергию. Также жертва может съесть данного бота.
  • 30, 31 - посмотреть в относительно или абсолютно.
    Бот поворачивается и в зависимости от того, что перед ним, меняет счетчик команд, как было описано ранее.
  • 32, 42, 33, 52 - поделиться энергией и минералами относительно и абсолютно.
    Бот поворачивается. Если перед ним живой бот, то они разделяются между собой энергию и минералы поровну
  • 34, 50, 35, 52 - отдать энергию и минералы
    Бот поворачивается. Если перед ним другой бот, то он безвозмездно отдает четверть своих припасов
  • 36 - бот выравнивается по горизонтали.
    с шансом 0.5 поворачивается направо или налево
  • 37 - узнать свою высоту.
    В зависимости от текущей высоты меняется счетчик команд
  • 38 - узнать сколько энергии В зависимости от количества энергии меняется счетчик команд
  • 39 - узнать сколько минералов
    Опять же в зависимости от количества минералов миняется счетчик
  • 40 - размножение с созданием связанного с данным ботом потомка.
    Если бот окружен со всех сторон или если у него не хватило энергии (150) для размножения, то он в муках умирает
    Иначе создает потомка, с которым делит минералы и энергию пополам и копирует в него свой геном.
    С шансом 0.25 один ген у потомка поменяется на другой случайным. Также потомок попадает в колонию своего предка. Колонии не могут передвигаться, но боты деляется между собой энергией и минералами.
  • 41 - размножение с созданием свободного потомка
    Все то же самое размножение, но потомок не попадает в колонию предка
  • 43 - есть ли приход энергии
    Если бот в зоне, где можно выполнить фотосинтез то счетчик команд прибавляется на 1, иначе на 2
  • 46 - многоклеточный ли я
    То же самое, что и в команде 43, но с многоклеточностью
  • 47 - преобразовать минералы в энергию
    100 минералов преобразуются в энергию с коэффициентом 4
  • 48 - мутировать
    Заменяется случайный ген в своем геноме на другой случайный
  • 49 - генная атака
    Если перед ботом другой бот, то у того меняется случайный ген
  • Если ген не соответствует никакой команде, то к счетчику команд просто прибаляется

main.py

Файл содежит в себе класс игры в целом, ее инициализацию и главный игровой цикл
При запуске файла происходит вот такое

 genesis = Game()  
 genesis.init_world()

Рассмотрим строчки по отдельности

  1. класс Game
    Этот класс является основным для игры. Он реализует каждый ход.
    В ход входит:

    • выполнение генома каждого бота
    while self.bot_count < len(self.bots):
        self.bots[self.bot_count].execute_commands()
    • радиация
      В верхнем слою у каждого бота меняется случайный ген
      Она была создана, чтобы в самом начале происходили изменения
    • передвижение органики вниз
    • сохранение матрицы состояний и кадра на диск
    save_new_snapshot(file_name + '.gns', snapshot)
    save_new_matrix(file_name + '_matrix.gns', self.bots, self.world)
  2. инициализация мира
    При инициализации мира происходит загрузка мира с диска, если такое сохранение есть.
    Иначе создается пустой мир с одним ботом.

    self.world = [[0 for _ in range(WORLD_WIDTH)] for __ in range(WORLD_HEIGHT)]
    self.bots = []
    self.prev_world, self.prev_bots = deepcopy(self.world), deepcopy(self.bots)
    adam = Bot(0, WORLD_WIDTH // 2, [25] * 64, 500, 500, 3)
    adam.direction = randint(0, 7)
    self.world[adam.y][adam.x] = adam.index
    self.bots.append(adam)

    Адам находится в самом верхну мира по середине по ширине. Его гены состоят только из команд фотосинтеза.
    Благодаря радиации Адаму может повести и он начнет производить себе подобных. Однако все зависит от случая и может произойти так, что о, к примеру, начнет бесконечно двигаться и умрет а может его убьет его сын

saver.py

Данный файл отвечает за сохранение состояний игры и кадров на диск. Есть функции для:

  • создания кадра
    Кадр хранит в себе лишь изменения, чтобы не занимать много места на диске хотя и так гитхаб не дал дэмку больше 100мб закинуть, а ведь там началось самое интересное.
  • сохранения кадра в файл
  • создания матрицы состояний
    Переводит все поле и характеристики всех ботов в текст
  • сохранение матрицы состояний

front.py

Просто классический класс для рендера поля

saves_video_player.py

Данный файл загружает из файлов сохранения и показывает пользователю средствами PyGame

ВОЗМОЖНЫЕ ДОДЕЛКИ

  • оптимизация
    Ох уж это слово... оптимизация... Необходимо распараллелить процессы с предложениями писать в телегу.
  • лучше дизайн
    Отображение количества живых ботов, сезон, номер хода
  • дайте мощный сервер
    Конечно, выполнять симуляцию на ноуте, которая съедает целое ядро, каждый день параллельно работе за ним, это интересно и тепло, однако, не хочется.
    А вот будь у меня сервер, который выполнял бы это неделями без перерыва... опять же с предложениями отдать сервер даром писать в телегу.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.