Пятнашки: игра на ООП в 1С

18.02.25

Задачи пользователя - Игры

Когда охота "настоящего" ООП, но не знаешь, как его взять в 1С. Массив форм в форме нам поможет )))

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Бесплатно
Пятнашки, игра на ООП в 1С
.cf 80,44Kb
34
34 Скачать бесплатно

Всем привет!

В этот раз я не буду писать пространных сообщений на тему и без, ибо в заголовке все сказано. Скажу только, что игры проще делать на ООП, т.к. игровой объект - это свойства и подпрограммы, которые им управляют. Так давайте же поуправляем.

 

ОСНОВНАЯ ГИПОТЕЗА

Изойду из того (да, да, русский язык - это мой второй, после 1С), что в 1С можно неплохо так попробовать ООП на базе обработок. У них есть поля, методы, и даже публичные методы. В итоге ты, такой, пишешь что-то типа "МойКрутойМассив.Добавить(Обработки.МояОбработка.Создать())". Но в общем и целом подобное позволяет делать все эти плывущие или текущие штуки. И я вот ни разу не против.

Но игры - они на клиенте. И на клиенте для того, чтобы хранить массивы и методы мы вполне можем использовать форму. И пусть 1С дает советы не делать в формах экспортных методов. Хочу - и делаю )))

 

ПРОСТОЙ ПРИМЕР

Я сегодня рано встал, ибо в мыслях созрела игра "Пятнашки", которая должна быть написана таким вот ужасным способом - ООПшным!

Для этого я создал две формы. Даже две общих формы. Но это могли бы быть две любые формы. Но я художник, я так вижу )))

ПЕРВЫЙ...

Итак, первая форма - это форма игрового поля. Ничего там такого - поля сверху и слева, размеры по ширине и высоте, кнопки перемещения (я их на нумпад завязал, но с контрл, ибо без контрла у меня не заработало).

ВТОРОЙ...

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

ФЛОУ (я не в курсе, что это, но у нас на работе так любят говорить)

При запуске приложения открывается основная форма игрового поля.

Далее происходит следующее:

1. Оформляем поле, устанавливая ширину и высоту колонок в пределах заданных полей и размера игрового поля. Это можно сделать на сервере при том самом создании.

2. Создаем объекты фишек:

	СЧ = Новый ГенераторСлучайныхЧисел;
	СЗ = Новый СписокЗначений;

	Для А = 1 ПО ВысотаПоля Цикл 
		Для Б = 1 По ШиринаПоля Цикл 
			СЗ.Добавить(Новый Структура("Верх, Лево", А, Б), СЧ.СлучайноеЧисло(100,999));
		КонецЦикла;
	КонецЦикла;

	СЗ.Удалить(0);

	СЗ.СортироватьПоПредставлению();
	
	Для Каждого Ст ИЗ СЗ Цикл
		Параметр = Ст.Значение;
		Параметр.Вставить("Номер", Фишки.Количество() + 1);
		Фишки.Добавить(
				ПолучитьФорму("ОбщаяФорма.Фишка", Параметр, ЭтотОбъект, Истина)
			);
	КонецЦикла;

	Рендер();

Здесь сначала мы создаем фишки в списке значения, заполняя случайным числом представление, чтобы потом смешать фишки на поле. Да, я за утро ничего лучше не придумал, так что не ругайте сильно )))

Дальше удаляем первую фишку, чтобы было пустое место.

Дальше мы создаем объекты фишек, после чего рендерим.

Рендер - это просто вызов "Показать" для каждой фишки.

	Для Каждого Ст ИЗ Фишки Цикл 
		Ст.Значение.Показать();
	КонецЦикла;

Фишки хранятся на форме в списке значений, поэтому "Ст.Значение.Показать()".

Ну и объект сам там все знает, где он и с кем.

Ну и дальше блок управления. Т.к. я не храню пустую фишку, то приходится повозиться с определением ее позиции. Ну там сами в коде гляните, если захотите.

Инициализация фишки происходит так:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Параметры.Свойство("Лево", ПоложениеЛево);
	Параметры.Свойство("Верх", ПоложениеВерх);
	Параметры.Свойство("Номер", Номер);
	Изменение = Истина;
КонецПроцедуры

Просто засовываю внутрь положение и номер. А вот так вот мне захотелось.

Показать и скрыть тоже элементарно сделаны:

&НаКлиенте
Процедура Показать() Экспорт 

	Если Изменение Тогда
		Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.БольшойПунктир,2,1);
		Изменение = Ложь;
		Область = ПолучитьОбласть();
		Область.Текст = Номер;
		Область.ЦветФона = WebЦвета.Бирюзовый;
		Область.Шрифт = Новый Шрифт(,,,Истина);
		
		Область.ГраницаСверху = Линия;
		Область.ГраницаСлева = Линия;
		Область.ГраницаСнизу = Линия;
		Область.ГраницаСправа = Линия;
		
		Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
		Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Скрыть()
	Линия = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии,0,0);
	Изменение = Ложь;
	Область = ПолучитьОбласть();
	Область.Текст = "";
	Область.ЦветФона = Новый Цвет;
	Область.Шрифт = Новый Шрифт();
	
	Область.ГраницаСверху = Линия;
	Область.ГраницаСлева = Линия;
	Область.ГраницаСнизу = Линия;
	Область.ГраницаСправа = Линия;
	
	Область.ГоризонтальноеПоложение = ГоризонтальноеПоложение.Центр;
	Область.ВертикальноеПоложение = ВертикальноеПоложение.Центр;
КонецПроцедуры

В общем, все для человека!

 

Ладно, завязываю.

Всем всех благ. Читайте ленты, ставьте лайки, подписывайтесь на каналы, качайте за стартмани и прочие шалости производите. Не болейте!

ЗЫ: cf-ник был сделан на последней платформе 1С для обучения. 8.3.26+.

См. также

Игры Платформа 1С v8.3 Бесплатно (free)

Игра Змейка на объектах форм, а ля ООП, или что можно сотворить за час )))

20.02.2025    975    33    starik-2005    8    

13

Игры Платформа 1С v8.3 Бесплатно (free)

Знакомы с серией игр Football Manager? Вся суть подобных симуляторов состоит в том, чтобы путем грамотного управления и контроля за спортивным, инфраструктурным и финансовым учетом привести свой футбольный клуб к успехам. Это ли не задача для платформы 1С - помочь в контроле учета предприятия (читай футбольного клуба)?

10.01.2025    3721    87    KamranV21    4    

32

Игры Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Бесплатно (free)

Вариация классической игры Линес в честь года змеи 2025 на шестиугольном поле, с препятствиями, для сборки змейки из 7 шаров.

29.12.2024    606    34    miniogn    0    

6

Игры Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Я Федор, ведущий разработчик 1С. На хакатоне компании команда под моим руководством перенесла игру «Герои меча и магии III» на платформу 1С. Расскажу, как устроена конфигурация «1С: Герои меча и магии» с технической точки зрения.

10.10.2024    50263    PROSTO-1C    55    

167

Игры Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

Классическая игра Морской бой, с необычным дизайном. Из особенностей: Поле игрока формируется автоматически, но есть возможность корректировать расстановку фигур. Пример игры в приложенном видео.

29.07.2024    1435    84    user1693438    3    

9

Игры Платформа 1С v8.3 1C:Бухгалтерия Россия Бесплатно (free)

Простейшие крестики-нолики с маленьким полем.

24.07.2024    1457    103    user2015123    0    

7

Игры Платформа 1С v8.3 1C:Бухгалтерия 1С:Бухгалтерия 3.0 Бесплатно (free)

Классическая игра пасьянс Паук, на платформе 1С.

15.04.2024    2073    99    user1693438    3    

18

Игры Пользователь Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Бесплатно (free)

Игра "Змейка" в классическом варианте на управляемых формах в 1С. Собирайте яблоки и ставьте рекорд!

09.02.2024    5296    313    emilyabochkova    15    

31
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. o.nikolaev 216 18.02.25 12:04 Сейчас в теме
Мне кажется для натягивания совы на глобус вкорячивания ООП в 1С все-таки лучше использовать общие модули. В этом случае первым параметром каждого метода такого "ОО-модуля" будет структура с данными. Т.е. что-то типа:
...
ОбщийМодуль.Автомобиль

(Все ОО-примеры должные делаться на примере автомобиля)
...
Функция Автомобиль(ПараметрыКонструктора)
    Результат = Новый Структура();
    Результат.Вставить("Марка", МаркиАвтомобилей.Mitsubishi);
    Результат.Вставить("Модель", Модели.Outlander);
    Результат.Вставить("ГодВыпуска", ПараметрыКонструктора.ГодВыпуска);
    Возврат Результат;
КонецФункции

Функция ПроверитьСостояниеДвигателя(Автомобиль)
    Двигатель = Автомобиль.Двигатель;
    ...
КонецФункции
Показать


Правда это приведет к ужасно огромному количеству общих модулей. Не знаю, можно ли технически добавить в EDT плагин, который ввел бы понятие "Пакет" и позволил бы относить объекты конфигурации к пакетам и отображать их в разрезе пакетов.
2. starik-2005 3153 18.02.25 12:17 Сейчас в теме
(1) Ага, и придется еще хранить эти структуры. Правда в них можно засунуть модуль в какое-нить свойство, но тогда придется, опять же, писать МояСтруктура.Модуль.СделатьДело(МояСтруктура, ПараметрыДела) - ужос... Ну и флюенс-стиль не мутнуть, а форма может себя возвратить и продолжить.
3. o.nikolaev 216 18.02.25 13:00 Сейчас в теме
(2) Флюенс-стиль можно и для модуля мутнуть (модуль тоже сам себя может возвратить), но получается ужасно дико. Про отладку и говорить нечего. Ну и потеря контекстной подсказки.

Структура хранится сама по себе и ходит куда угодно, собственно.

Возможно добавить ей поле "_Тип" и при вызове методов проверять что МойАвтомобиль._Тип = "Автомобиль".

Но это все конечно КВИР программирование, но раз уже тема есть, то почему бы и не порассуждать.
4. starik-2005 3153 18.02.25 13:51 Сейчас в теме
(3)
но раз уже тема есть, то почему бы и не порассуждать
Да, в 1С не хватает легковесного какого-нить клиентского объекта, который можно было бы быстро создать и вызвать его методы. Создание формы упирается в платформу - примерно 100 форм в секунду в пределе на моем I7 11-го поколения. При том 10к форм с минимальным набором реквизитов занимают 1,5 гига. Ну это ж бред.

ЗЫ: легковесный серверный объект тоже бы не помешал. Но обработки, наверное, много памяти не занимают. Не пробовал их тысячами создавать.
5. o.nikolaev 216 18.02.25 15:32 Сейчас в теме
(4) Обработку не получится гонять между клиентом и сервером без трудностей. В то время как структуру - легко. В модуле клиент-сервер - методы для всего, если что-то из базы подтянуть - серверный модуль соовтетственно.

ОО_Автомобиль
ОО_АвтомобильСервер
6. starik-2005 3153 18.02.25 15:57 Сейчас в теме
(5) Ну вот и теряется вся полезность ООП, в котором объединены данные и методы. Да, методы - они отдельно, конечно, но объект о них все знает. Если бы была возможность в поля структуры методы фигачить, как в С, то это было бы уже неплохо. Тогда можно было бы создать конструктор, который в структуру добавлял и данные, и методы (адреса). Но все-равно проблемы с контекстом. Ибо this отсутствует, в итоге придется таскать контекст с собой.
И в итоге простое:
Для Каждого Объект ИЗ МассивОбъектов Цикл
  Объект.Метод()
КонецЦикла
превращается в нечто несуразное:
Для Каждого Объект ИЗ МассивОбъектов Цикл
  Объект.Модуль.Метод(Объект)
КонецЦикла
Ну и никаких тебе приватных данных.
7. o.nikolaev 216 18.02.25 17:34 Сейчас в теме
(6) Или так
Для каждого Машинка Из Машинки Цикл
    ОО_Автомобиль.ПоставитьНаУчет(Машинка);
КонецЦикла;


Что касается private то об этом даже не мечтаем.
8. starik-2005 3153 18.02.25 17:45 Сейчас в теме
(7)
Или так
А если у нас машинки разные - грузовые, легковые, прочие. У разных машинок разные поля, а может это самолеты/вертолеты/дроны... ООП дает существенное преимущество при различных объектах. Например, у тебя есть шахматы, там 6 вроде бы фигур, они по разному ходят. В итоге вот у тебя объект - доска, а вот коллекция фигур. И тебе не надо там думать при проверке хода - просто Объект.ПроверитьХод(НоваяПозиция). Он знает свою старую позицию, знает, куда ему можно ходить. И если мы будем оо_шахматы.Проверить(фигура, новаяпозиция), то нам придется дофига всего написать в одном месте - все эти если/конец если по типу фигуры. А так этот код будет раскидан по модулям фигур, и не будет путаницы.

В общем, ООП в части манипуляции с объектами - это очень хорошая штука. И в части тестирования, т.к. код четко прописан для конкретного объекта с конкретным поведением, максимально разделен. И повторное использование кода отлично решается наследованием. В 1С, к сожалению, без костылей ничего такого не сделаешь.
VyacheslavShilov; +1 Ответить
13. Antoska 16 20.02.25 07:33 Сейчас в теме
(7) в модуле формы на клиенте можно объявить переменные модуля (не экспортные) - это подходит по приватные свойства?
14. starik-2005 3153 24.02.25 14:24 Сейчас в теме
(13)
это подходит по приватные свойства
Так как раз с инкапсуляцией проблем нет, они есть с наследованием. Т.е. нельзя создать объект на основании другого объекта. Можно лишь обратиться к форме-владельцу.
11. alex_sayan 56 19.02.25 17:14 Сейчас в теме
(2) общие модули будут статическим классом, т.е. без хранимого на борту состояния
9. SerVer1C 872 19.02.25 10:11 Сейчас в теме
От ООП здесь только Обычное Однообразное Программирование.
Но за игру спасибо!
10. starik-2005 3153 19.02.25 10:20 Сейчас в теме
(9) Ну не скажи. Полиморфизм тут вполне реализуем с инкапсуляцией. И даже "наследование" в каком-то роде есть, правда оно выражено в том, что идет обращение к владельцу формы (для отображения фишки). Да, обращаться к методам "родителя" в варианте реализации на форме нельзя, т.к. условно нет "прототипа", а создавать еще одну форму для этого - ну это как бы да....

Следующей игрой на таком принципе буду делать змейку. Я ее делал на всем уже, чем только можно - от ассемблера (да, прям под линухом запилил, syscall для системных вызовов ядра в части управления выводом в консоль, но не разобрался с неблокирующим перехватом событий клавиатуры к окну терминала), до бейсиков всех мастей. Пришла пора карапузов 1С "зарамсить проблему" )))

Да, оказалось, что нумпадовские кнопки без контрла отрабатывают, так что управление в змейке будет попроще )))
12. starik-2005 3153 19.02.25 22:37 Сейчас в теме
Я хз, что творится с инфостартом, но он пипец как глючит. Добавляю бесплатный файл, а он пишет, что нельзя бесплатно - нужно указать цену, и ставит 1 стартмани. При том в этой статье он поставил бесплатно, ибо игры не продаются )))
Прикрепленные файлы:
Оставьте свое сообщение