Форум сайта python.su
Описание
Написана под впечатлением от игры "Жизнь“ и от желания написать арену с программируемыми роботами. До полноценной арены с полноценными роботами дело не дошло, поэтому ограничился простыми ”элементами“ или ”частицами".
Суть такова: есть поле (арена), ограниченное размерами окна, и набор классов элементов, которые можно плодить в неограниченных количествах. Элементы имеют доступ к списку всех элементов на поле и могут что-то делать в зависимости от ситуации. Элементы реализованы в виде плагинов, чтобы добавить новый, надо создать 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
Отредактировано (Июнь 3, 2010 17:19:27)
Офлайн
здорово!
Тока вылетает ошибка если запускать так:
zubchick ~ % cd /home/zubchick/Загрузки/src 16:45
zubchick ~/Загрузки/src % py main.py 16:45
Traceback (most recent call last):
File "main.py", line 6, in <module>
os.chdir(os.path.dirname(__file__))
OSError: [Errno 2] No such file or directory: ''
zsh: exit 1 env python main.py
Офлайн
Мне понравилось. Прикольно.
pasaranaxНе думаю, что это хорошая идея.
- Сделать бесконечное поле (циклическое, как в пакмане)
pasaranaxПосмотри на Cython.
- Оптимизировать скорость работы, сейчас сильно грузит проц
pasaranaxЯ бы пока обошёлся без красивостей.
- Добавить новых интересных элементов с красивым графическим телом
Офлайн
ZubchickУгу. Я так и не разобрался как получить в область видимости соседние с main.py файлы.
Тока вылетает ошибка если запускать так:
ZZZА мне кажется, что так правильнее. А то некторые элементы забиваются в угол и колбасятся там пока не расплодятся до неимоверного количества или пока их не схавают. В любом случае функцию можно (даже стоит) сделать опциональной.
pasaranax написал:
- Сделать бесконечное поле (циклическое, как в пакмане)
Не думаю, что это хорошая идея.
ZZZПервым делом думаю перенести отрисовку графики на OpenGL, вроде в Qt это просто делается.
pasaranax написал:
- Оптимизировать скорость работы, сейчас сильно грузит проц
Посмотри на Cython.
ZZZпотому я и написал это последним пунктом :)
Я бы пока обошёлся без красивостей.
ZZZМне тоже не очень нравится Life, назвал Elements. Репозиторий: https://bitbucket.org/pasaranax/elements
ИМХО:
* стоит сменить название;
* проект на bitbucket'е;
* смерть и рождение;
* мутации (сложно!).
Офлайн
ZZZПочему? Земля то - круглая! ;)pasaranaxНе думаю, что это хорошая идея.
- Сделать бесконечное поле (циклическое, как в пакмане)
Офлайн
PooHКруглая, а не торообразная. :-)
Почему? Земля то - круглая! wink
pasaranaxЕсли знаешь OpenGL, то да.
Первым делом думаю перенести отрисовку графики на OpenGL, вроде в Qt это просто делается.
pasaranaxНа самом деле не особо. Посмотри GenePool… Но там код – отвал бошки!
На счет смерти, рождения и мутаций, сложно пока себе это представить smile
pasaranaxНу вот… Ни PooH'а тебе… :-D
сейчас ацкое время для студентов, поэтому пока забросил этот проект на пару-тройку недель.
Отредактировано (Май 21, 2010 11:13:09)
Офлайн
ZZZУкушу!!! ;)
Ну вот… Ни PooH'а тебе… :-D
Офлайн
:-P
Офлайн
Глянул код… Критика нужна?
Первое и главное – слишком зависит от Qt. Даже хранилище элементов – QWidget.
1. Сделай хранищище элементов с простым и быстрым доступом к ним – model.
2. Оставь Qt только для отрисовки – view.
3. Сделай класс, рассчитывающий поведение элементов и говорящий view, что положение изменилось – controller.
4. Сдай сессию…
Офлайн
Возможно я тоже подключусь к разработке. Интересно, блин :)
Тоже посмотрел код и тоже подумал о MVC.
QT я пока не знаю, только GTK. Но не думаю, что это долго изучать. В крайнем случае могу делать логику.
Но конечно все это после сессии. Удачи!
Офлайн