Pull to refresh

Игра «Жизнь» на 1С 7.7 (30 строк кода)

Доброго времени суток. Так заманчиво наблюдать, как шествует по «Хабру» негласный фестиваль в 30 строчек кода. И не только знатоки JavaScript участвуют, но и другие языки программирования присоединяются к этому очень увлекательному шествию. Вот и я не выдержал и решил по участвовать. Но так уж сложилось, что я не знаю сейчас на должном уровне других языков, кроме 1С.
По сему встречайте:

image


К сожалению из за попыток запихнуть в 30 сток, управление совершенно примитивно. А так же не реализована безграничность поля. Ну и понятно, что не «совсем честно» говорить о том, что здесь лишь 30 строк.

«Кликаем» на поле и выставляем начальный узор клеток, далее просто жмем кнопку «Сделать ход». Вот и все.

Собственно код обработки:
Процедура Установить(Х,У)
	Таблица.Область("R"+У+"C"+Х).ЦветФона(0,0,0);Таблица.Область("R"+У+"C"+Х).ЦветТекста(0,0,0);Таблица.Область("R"+У+"C"+Х).Значение=1;
КонецПроцедуры
Процедура Удалить(Х,У)
	Таблица.Область("R"+У+"C"+Х).ЦветФона(255,255,255);Таблица.Область("R"+У+"C"+Х).ЦветТекста(255,255,255);Таблица.Область("R"+У+"C"+Х).Значение=0;
КонецПроцедуры
Процедура Очистить()
	Для У=12 По 38 Цикл Для Х=2 По 42 Цикл Удалить(Х,У); КонецЦикла; КонецЦикла;
КонецПроцедуры
Процедура Ход()
	сз_Установить = СоздатьОбъект("СписокЗначений");
	сз_Удалить = СоздатьОбъект("СписокЗначений");
	Для У=12 По 38 Цикл Для Х=2 По 42 Цикл
			Итого = Таблица.Область("R"+(У-1)+"C"+(Х-1)).Значение+Таблица.Область("R"+(У-1)+"C"+Х).Значение+Таблица.Область("R"+(У-1)+"C"+(Х+1)).Значение
			      + Таблица.Область("R"+(У)+"C"+(Х-1)).Значение+Таблица.Область("R"+(У)+"C"+(Х+1)).Значение+Таблица.Область("R"+(У+1)+"C"+(Х-1)).Значение
			      + Таблица.Область("R"+(У+1)+"C"+Х).Значение+Таблица.Область("R"+(У+1)+"C"+(Х+1)).Значение;
			Если (Итого=3) И (Таблица.Область("R"+У+"C"+Х).Значение=0) Тогда сз_Установить.ДобавитьЗначение(Х,У); КонецЕсли;
			Если ((Итого=2) ИЛИ (Итого=3)) И (Таблица.Область("R"+У+"C"+Х).Значение=1) Тогда Продолжить; КонецЕсли;
			Если ((Итого<=1) ИЛИ (Итого>3)) И (Таблица.Область("R"+У+"C"+Х).Значение=1) Тогда сз_Удалить.ДобавитьЗначение(Х,У); КонецЕсли;
	КонецЦикла; КонецЦикла;
	Для СчетчикЦикла = 1 По сз_Установить.РазмерСписка() Цикл Х = сз_Установить.ПолучитьЗначение(СчетчикЦикла,У); Установить(Х,У); КонецЦикла;
	Для СчетчикЦикла = 1 По сз_Удалить.РазмерСписка() Цикл Х = сз_Удалить.ПолучитьЗначение(СчетчикЦикла,У); Удалить(Х,У); КонецЦикла;
КонецПроцедуры
Процедура ПриВыбореЯчейкиТаблицы(Адрес,Значение)
	ВремАдрес = СтрЗаменить(Адрес,"R","");
	У = Число(Лев(ВремАдрес,Найти(ВремАдрес,"C")-1)); Х = Число(Прав(ВремАдрес,СтрДлина(ВремАдрес)-Найти(ВремАдрес,"C")));
	Если (Х<=1) ИЛИ (Х>=43) ИЛИ (У<=11) ИЛИ (У>=39) Тогда Возврат; Иначе
		Если Таблица.Область("R"+У+"C"+Х).Значение = 1 Тогда Удалить(Х,У); Иначе Установить(Х,У); КонецЕсли;
	КонецЕсли;
КонецПроцедуры


P.S.: Изображение на картинке получено из узора в форме стрелки, а не нарисовано руками.

Ссылка на файл обработки: Life.ert
Почитать про игру «Жизнь» на Википедии: Жизнь (игра)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.