[Alimir_BootModal_Login]

Создание конфигураций 1С: пишем "Крестики-нолики" часть 3/3

Автор уроков и преподаватель школы: Владимир Милькин

Заключительная часть разработки Крестиков-ноликов на 1С. После четырнадцатого
krestiki-nolikiшага мы создали пустую процедуру "ХодКомпьютера" и добавили её вызов сразу после нашего хода.

Если вы прерывались (закрывали конфигуратор) после предыдущей части - выполните шаг №2 (открытие конфигуратора) и шаг №3 (открытие дерева конфигурации) . В дереве конфигурации откройте обработку "КрестикиНолики":
- найдите в ней закладку "Формы"
- откройте там элемент "Форма"
- перейдите в модуль формы (закладка "Модуль" внизу)
- уже после этого переходите к шагу №15

Шаг №15: добавляем переменную Поле для хранения состояний кнопок

Чтобы компьютер смог походить ему нужно проанализировать текущее состояние поля - какие клетки заняты, а какие свободны. Специально для хранения нашего поля заведём переменную "Поле" и расположим её в самом начале модуля:

56

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

 
 

Шаг №16: добавляем обработчик открытия формы

Чтобы попасть в этот обработчик - вернёмся в визуальное представление формы (закладка "Форма") и выделим (двойным щелчком) элемент "Форма" в окне с элементами:

51

В окне свойств формы (справа) промотаем полосу прокрутки вниз и найдём там событие "ПриОткрытии". Щелкнем на кнопке с лупой:

52

Программа предлагает нам создать обработчик для этого события. Выберем вариант "Создать на клиенте" и нажмем кнопку "ОК":

53

Мы перенеслись снова в модуль формы в новую автоматически созданную процедуру "ПриОткрытии". Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Весь код, написанный в этой процедуре будет выполнятся каждый раз при открытии формы обработки:

54

 
 

Шаг №17: в обработчике открытия формы инициализируем переменную Поле

Обработчик ПриОткрытии создан. Чем будем инициализировать переменную Поле? А давайте ещё раз вспомним, что именно мы собираемся в ней хранить. Мы собираемся хранить состояние поля. А вернее состояние его ячеек. Для хранения набора каких-то однотипных данных идеально подойдёт тип массив. Вот его мы и создадим в переменной Поле.

Наша задача вставить в процедуру ПриОткрытии код, который создаст в переменной Поле массив, который будет содержать в себе 3 элемента. Каждый из этих элементов будет также массивом на 3 элемента. Получится поле 3х3.

Чтобы вам стало понятнее, что из себя будет представлять массив "Поле" я приведу такую картинку:

07

Массив "Поле" это двумерная таблица, к элементам которой мы сможем обращаться по номеру строки и номеру столбца.

Но нужно не только создать этот массив 3х3, но и установить в каждую из его ячеек пустую строку, чтобы показать, что все ячейки свободны.

Вставим в эту процедуру следующий код:

55

Я попробовал написать сам, покажите мне эталонный вариант

Код очень простой и с подробными комментариями. Все конструкции должны быть вам хорошо знакомы по первым двум модулям обучения, в которых мы изучали встроенный язык 1С. Если это не так, пожалуйста, вернитесь к изучению внутреннего языка 1С (модуль №1 и модуль №2).

 
 

Шаг №18: переименовываем все кнопки

Следующая задача дать кнопкам на форме такие имена, чтобы мы смогли  из кода легко находить имя кнопки по номеру строки и столбца на поле.

К примеру, кнопку располагающуюся в нулевой строке и нулевом столбце (отсчет будем вести с нуля)  назовём "Кнопка00", а кнопку в первой строке и втором столбце "Кнопка12" и т.д.

Для этого перейдем в визуальное представление формы (закладка "Форма")  и выделим двойным щелчком кнопку с именем "НажатиеНаКнопку":

57

В окне свойств этой кнопки (справа) найдём свойство "Имя" и изменим его значение на "Кнопка00":

06

Изменим имена всех кнопок так, чтобы в итоге все кнопки в группах назывались следующим образом:

58

 
 

Шаг №19: пишем содержание процедуры ХодКомпьютера

Наконец, мы можем определить работу процедуры "ХодКомпьютера". Что будет делать эта процедура? В ней нужно будет пробежаться по каждой из ячеек массива Поле, в котором хранятся состояния ячеек (свободна, занята компьютером, занята игроком). Сравнить каждую из ячеек с пустой строкой (признак того, что она свободна и в неё можно походить) . И если такая ячейка найдётся, поставить в неё "Х" (признак того, что в неё походил компьютер) и не забыть отобразить крестик в соответствующей кнопке на форме.

Код будет таким:

59

Я попробовал написать сам, покажите мне эталонный вариант

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

 
 

Шаг №20: уже можно играться!

Запустим 1С в режиме Предприятие (меню "Отладка"->"Начать отладку"), откроем обработку ("Сервис"->"Крестики нолики") и убедимся, что, в принципе, уже можно играть:

60

Но вот незадача - компьютер перезатирает наши ходы! А всё дело в том, что в процедуре "НажатиеНаКнопку" мы нолик-то на кнопке отображаем, а вот в массив "Поле" этот нолик не ставим. Поэтому компьютер и не видит наши ходы.

 
 

Шаг №21: избавляемся от затирания наших ходов

Изменим процедуру "НажатиеНаКнопку" так, чтобы наш ход проставлялся не только на кнопке, но и в массиве "Поле" (добавленный код очерчен жёлтым цветом):

61

Я попробовал написать сам, покажите мне эталонный вариант

Попробуем запустить 1С в режиме Предприятие (меню "Отладка"->"Начать отладку") вновь и поиграть с компьютером. На этот раз наши ходы не будут перезатираться компьютером.

 
 

Шаг №22: программируем логику окончания игры

Но есть другая проблема - логика игры не учитывает её окончание, когда один из игроков выстроил свои крестики или нолики в строку, столбец или диагональ.

Добавим такую проверку. Для этого напишем отдельную функцию "ИграОкончена", которая будет возвращать Истина или Ложь в зависимости от того - присутствует ли на поле выигрышная комбинация.

Пока определим эту функцию пустой (добавьте её в конец модуля формы) , всегда возвращающей Ложь:

62

Далее изменим код процедуры "НажатиеНаКнопку", так чтобы после каждого хода (нашего или компьютера) делалась проверка на конец игры. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Будем вызывать функцию "ИграОкончена" и, если функция вернёт Истина, то будем выдавать соответствующее сообщение:

65

Я попробовал написать сам, покажите мне эталонный вариант