beldmit: (Программизм)
Dmitry Belyavskiy ([personal profile] beldmit) wrote2010-01-05 12:11 am
Entry tags:

Змея запускаем- II

Как и планировал, начал писать на питоне вот эту игру. Из правил осталось реализовать компенсацию и банкротство, и можно будет подсовывать AI разные целевые функции и сравнивать, какая лучше.


Так я и не почувствовал, когда массив/словарь передается по ссылке, а когда - по значению. Поэтому copy() в коде расставлены хаотически.

Очень раздражает невозможность проверить синтаксис. Сообщения об ошибках тоже ясностью не отличаются.

Спроектировать разделение на классы получается тоже крайне невнятно. Понятно, что игрок - это отдельный класс, потому как ему разные стратегии выбора оптимального хода прописывать. Функции применения карт ушли в условно-главный модуль, хотя можно их выделить отдельно. "Игра", собственно, по смыслу синглтон.

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

А там, глядишь, и до интерфейса доберусь (видимо, ncurses и PyQt).


Еще бы правила оригинальной версии найти.
phd_ru: (Default)

[personal profile] phd_ru 2010-01-05 08:00 am (UTC)(link)
Всё передаётся по ссылке:
i = 42
def inc(i):
    i += 1

inc(i)
print i # => 42


l = [42]
def append(l):
    l += ['l']

append(l)
print l # => [42, 'l']
Понятно отличие?

[identity profile] beldmit.livejournal.com 2010-01-05 09:00 am (UTC)(link)
на таком уровне понятно.

[identity profile] beldmit.livejournal.com 2010-01-05 09:29 am (UTC)(link)
На самом деле нарвался я на то, что переменная, обрабатываемая в цикле, сохраняла последнее значение, а не то, которое должна.
phd_ru: (Default)

[personal profile] phd_ru 2010-01-05 01:06 pm (UTC)(link)
Ты вот это имеешь ввиду?
i = 0
f = lambda: i
i = 1
print f()
Это не цикл и не передача по ссылке, это closure. При создании lambda (или def, между ними нет разницы) запоминает ссылку на окружающее пространство имён, в котором есть ссылка на переменную i. Даже если ссылка i потом изменится, lambda-то помнит не i, а то пространство имён, в котором определена i, ну и lambda найдёт в этом запомненном пространстве имён новое значение i.