Написана под впечатлением от игры "Жизнь“ и от желания написать арену с программируемыми роботами. До полноценной арены с полноценными роботами дело не дошло, поэтому ограничился простыми ”элементами“ или ”частицами".
Суть такова: есть поле (арена), ограниченное размерами окна, и набор классов элементов, которые можно плодить в неограниченных количествах. Элементы имеют доступ к списку всех элементов на поле и могут что-то делать в зависимости от ситуации. Элементы реализованы в виде плагинов, чтобы добавить новый, надо создать py-файл в папке plugins и в нем класс унаследованный от класса Element с переопределенным методами do (отвечает за поведение), paint (по жалению, отвечает за внешний вид), __init__ (по желанию, там задаются параметры). Написана с использованием PyQt4.
Скриншотик
Элементы в базовой поставке
Attractor - притягивается к другим элементам
Rejector - отталкивается от других элементов
Stoppic - стоит на месте; если есть кто-то в поле его действия, то отталкивается от него
Haotic - меняет свою скорость и направление хаотично
Eater - двигается к ближайшему элементу и хавает его, увеличиваясь на пиксель в размере
Copier - копирует поведение ближайшего элемента
Cloner - отталкивается от других и делает своего клона, если кто-то находится слишком близко
Freezer - притягивается к другим и “замораживает” их
Pusher - притягивается к другим и пинает их
Teleporter - телепортируется в случайную точку, если кто-то подходит слишком близко
Пример плагина
# -*- coding: utf-8 -*-
from Element import Element
from PyQt4.QtCore import *
class Attractor(Element):
"""Элемент, притягивающийся к другим"""
def __init__(self):
Element.__init__(self)
self.color = Qt.red
self.reactionDist = 200
def do(self, elements):
xSpeedInc = 0
ySpeedInc = 0
for elem in elements:
if elem is not self:
if self.distanceTo(elem) <= self.reactionDist:
xSpeedInc -= (self.x() - elem.x()) / self.reactionDist
ySpeedInc -= (self.y() - elem.y()) / self.reactionDist
self.xSpeed += xSpeedInc
self.ySpeed += ySpeedInc
- Сделать бесконечное поле (циклическое, как в пакмане)
- Доработать интерфейс до более-менее приятного
- Оптимизировать скорость работы, сейчас сильно грузит проц
- Добавить траекторию движения элементов. Сейчас можно включить использование QPath, но нужно ограничить его длину, иначе сильная нагрузка на проц
- Добавить новых интересных элементов с красивым графическим телом
BitBucket