Найти - Пользователи
Полная версия: Life 2
Начало » Python проекты » Life 2
1 2
pasaranax
Описание
Написана под впечатлением от игры "Жизнь“ и от желания написать арену с программируемыми роботами. До полноценной арены с полноценными роботами дело не дошло, поэтому ограничился простыми ”элементами“ или ”частицами".
Суть такова: есть поле (арена), ограниченное размерами окна, и набор классов элементов, которые можно плодить в неограниченных количествах. Элементы имеют доступ к списку всех элементов на поле и могут что-то делать в зависимости от ситуации. Элементы реализованы в виде плагинов, чтобы добавить новый, надо создать 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
TODO
- Сделать бесконечное поле (циклическое, как в пакмане)
- Доработать интерфейс до более-менее приятного
- Оптимизировать скорость работы, сейчас сильно грузит проц
- Добавить траекторию движения элементов. Сейчас можно включить использование QPath, но нужно ограничить его длину, иначе сильная нагрузка на проц
- Добавить новых интересных элементов с красивым графическим телом

BitBucket
Zubchick
здорово!

Тока вылетает ошибка если запускать так:
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
ZZZ
Мне понравилось. Прикольно.

pasaranax
- Сделать бесконечное поле (циклическое, как в пакмане)
Не думаю, что это хорошая идея.

pasaranax
- Оптимизировать скорость работы, сейчас сильно грузит проц
Посмотри на Cython.

pasaranax
- Добавить новых интересных элементов с красивым графическим телом
Я бы пока обошёлся без красивостей.

ИМХО:
* стоит сменить название;
* проект на bitbucket'е;
* смерть и рождение;
* мутации (сложно!).

После второго пункта, я могу подключиться, так как именно сейчас у меня есть немного времени и хочется по-программить.

P.S. Меня всегда завораживали подобные вещи, но сам начинать не решался.
pasaranax
Zubchick
Тока вылетает ошибка если запускать так:
Угу. Я так и не разобрался как получить в область видимости соседние с main.py файлы.

ZZZ
pasaranax написал:
- Сделать бесконечное поле (циклическое, как в пакмане)

Не думаю, что это хорошая идея.
А мне кажется, что так правильнее. А то некторые элементы забиваются в угол и колбасятся там пока не расплодятся до неимоверного количества или пока их не схавают. В любом случае функцию можно (даже стоит) сделать опциональной.

ZZZ
pasaranax написал:
- Оптимизировать скорость работы, сейчас сильно грузит проц

Посмотри на Cython.
Первым делом думаю перенести отрисовку графики на OpenGL, вроде в Qt это просто делается.

ZZZ
Я бы пока обошёлся без красивостей.
потому я и написал это последним пунктом :)

ZZZ
ИМХО:
* стоит сменить название;
* проект на bitbucket'е;
* смерть и рождение;
* мутации (сложно!).
Мне тоже не очень нравится Life, назвал Elements. Репозиторий: https://bitbucket.org/pasaranax/elements
На счет смерти, рождения и мутаций, сложно пока себе это представить :)

Если есть желание - подключайся, в команде всегда интереснее, и меньше шансов загнуться проекту. Если кого-то еще заинтересовало, но пока не готов влиться полностью, то можно создавать новые или дорабатывать существующие элементы.
Я сам хочу в первую очередь сделать более приятный интерфейс. Но сейчас ацкое время для студентов, поэтому пока забросил этот проект на пару-тройку недель.
PooH
ZZZ
pasaranax
- Сделать бесконечное поле (циклическое, как в пакмане)
Не думаю, что это хорошая идея.
Почему? Земля то - круглая! ;)
ZZZ
PooH
Почему? Земля то - круглая! wink
Круглая, а не торообразная. :-)
Мне кажется, что если сделать просто круглое поле, проблема углов решиться и при этом будет меньше геморроя с расчётом действующих сил. KISS, блин!

pasaranax
Первым делом думаю перенести отрисовку графики на OpenGL, вроде в Qt это просто делается.
Если знаешь OpenGL, то да.
Я пока до кода не добрался… Если у тебя всё сделано правильно и отрисовка не зависит от логики я бы подумал о переходе на SDL, чтобы не зависеть от Qt и получить больше возможностей.

pasaranax
На счет смерти, рождения и мутаций, сложно пока себе это представить smile
На самом деле не особо. Посмотри GenePool… Но там код – отвал бошки!

pasaranax
сейчас ацкое время для студентов, поэтому пока забросил этот проект на пару-тройку недель.
Ну вот… Ни PooH'а тебе… :-D
PooH
ZZZ
Ну вот… Ни PooH'а тебе… :-D
Укушу!!! ;)
ZZZ
:-P
ZZZ
Глянул код… Критика нужна?

Первое и главное – слишком зависит от Qt. Даже хранилище элементов – QWidget.

1. Сделай хранищище элементов с простым и быстрым доступом к ним – model.
2. Оставь Qt только для отрисовки – view.
3. Сделай класс, рассчитывающий поведение элементов и говорящий view, что положение изменилось – controller.
4. Сдай сессию…
Alex2ndr
Возможно я тоже подключусь к разработке. Интересно, блин :)
Тоже посмотрел код и тоже подумал о MVC.
QT я пока не знаю, только GTK. Но не думаю, что это долго изучать. В крайнем случае могу делать логику.

Но конечно все это после сессии. Удачи!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB