Новогоднее настроение 2020

или как взломать сейф Деда Мороза

Добрый день! Представляю первую статью из серии материалов, описывающих обучение детей ( да и в принципе и взрослых ) в нашей школе робототехники и программирования ROBOSCHOOL.RU. Сразу скажу, что не претендую на научную новизну и практическую значимость представленного материала, но замечу следующее:

• опыт показал, что через игровые и захватывающие алгоритмы интереснее осваивать программирование;
• перед схваткой за «гранит» Unity не мешало бы основы синтаксиса понять.

Итак, скоро 2020 год и уже ощущается запах мандарин и елки, хочется праздника. Какой праздник может быть у  программиста, чем можно удивить пап, мам друзей если не писать вирусы? Конечно создать головоломку. Магия чисел 2020 наталкивает на мысль о сейфе Деда Мороза. Несколько минут рассуждений о сейфе и вспоминается великий советский фильм «Новые приключения неуловимых», где юный герой пытается вскрыть сейф с картами, перемещая ручки по вертикали и поворачивая ручку двери.

(Кадр из кинофильма Новые приключения неуловимых», Киноконцерн «Мосфильм», 1968 год)

Повторим сейф, используя язык Object Pascal ( бесплатная версия предоставляется Embarcadero в Community Edition), считаем, что у Вас установлена данная среда.

Ставим задачу:

  1. Программа загадывает кодовое слово 2020 (код нового года).
  2. Если все ползунки в «сейфе» установлены правильно и соответствуют коду, начать воспроизводить новогоднюю песенку и выводить деда мороза в разных областях формы.

Начинаем. Создадим новый проект с формой: File- New- VCL Form Application.

Теперь необходимо  настроить отображаемый заголовок формы. Для этого свойство Caption формы меняем на «Сейф Деда Мороза», в итоге получится следующее:

Далее необходимо разместить элементы отображения кодовой информации. Для этого будет использоваться элемент Label. Всего на форме необходимо разместить 4 элемента (как на рисунке ниже).

Необходимо настроить данный элемент для нашей задачи:

• в свойстве Caption задать 0;

• размер задать 20 пикселов (свойство Font – Size- 20).

Новинка – разметим на форме новый компонент ползунок – TrackBar (4 элемента) и настроим его.  Перемещение ползунка будет отображаться в элементах Label, а также заносится в переменные вводимого кода

Необходимо настроить следующие свойства компонентов TrcakBar:

• ориентация компонента на форме – вертикальная (Orientation- trVertical);

• максимальное положение ползунка должно быть 9 (Max-9).

Добавим на форму кнопку и переименуем свойство Caption в «Открыть». Также на форме разместить компонент Image и MediaPlayer, Timer . Собранная форма приведена ниже.

В свойстве Picture загрузить файл с картинкой деда мороза, свойство Visible, элемента  Image1 задать значение false (при загрузке формы картинка будет спрятана).

Для элемента MediaPlayer1 задать в свойстве FileName путь до музыкального файла, свойство Visible установить значение false. Свойство AutoOpen установить значение true.

Для Timer1 свойство Enabled установить значение false.

Два раза кликнем по форме и попадем в редактор кода обработчика события создания формы – FormCreate. Перейдем в секцию глобальных переменных и объявим переменные для секретного числа, и числа вводимого с ползунков:

x1,x2,x3,x4,y1,y2,y3,y4:integer; (x1- x4  секретное число, y1-y4 – вводимое число с ползунков)

Далее перейти в обработчик события FormCreate и ввести код присвоения переменным секретного числа:

x1:=2;

x2:=0;

x3:=2;

x4:=0;

Теперь необходимо обеспечить присвоение в переменные вводимого числа состояние ползунков и отображать положение ползунка на метке Label. Для кликнуть два раза по ползунку TrackBar1 и ввести следующий код:

label1.Caption:=IntToStr(trackbar1.Position);

y1:=trackbar1.Position;

Для TrackBar2 код выглядит следующим образом:

label2.Caption:=IntToStr(trackbar2.Position);

y2:=trackbar2.Position;

Догадайтесь как будет выглядеть код для двух оставшихся компонентов…

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

if((x1=y1)and(x2=y2)and(x3=y3)and(x4=y4)) then

timer1.Enabled:=true;

 Дважды кликнем по таймеру и введем в него код, который срабатывает при совпадении числа сейфа:

MediaPlayer1.Play();

Randomize();

Image1.Left:=Random(600);

Image1.Top:=Random(300);

Image1.Visible:=true;

label1.Visible:=false;

label2.Visible:=false;

label3.Visible:=false;

label4.Visible:=false;

trackbar1.Visible:=false;

trackbar2.Visible:=false;

trackbar3.Visible:=false;

trackbar4.Visible:=false;

Ну вот практически все готово. Компилируем программу через меню Run-Run или через кнопку быстрого доступа Run. Результат работы программы приведен ниже:

Далее предлагаем Вам самостоятельно ограничить работу сюрприза, а при неправильном вводе кода можно например вызывать звук хрюшки ….

И так мы создали небольшое веселое приложение. Если интересно более сложные интересные задачи и вообще качественное программирование, тогда Вам в школу ROBOSCHOOL.RU.

P.S. Всем тем, кто предпочитает Python, C++ или С# мы учим и на этих языках, но мое сугубо личное мнение, что учить язык программирования лучше начинать c Pascal, а если знаешь один язык программирования, то поймешь и разберешься с любым другим. Но это совсем новая статья с рабочим названием «Трудности перевода».

Ссылка на архив с проектом на Яндекс.Диск    https://yadi.sk/d/tdBZ68RURgJ8Nw

Листинг  программы «Сейф Деда Мороза»

var

  Form1: TForm1;

x1,x2,x3,x4,y1,y2,y3,y4:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

if((x1=y1)and(x2=y2)and(x3=y3)and(x4=y4)) then

timer1.Enabled:=true;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

x1:=2;

x2:=0;

x3:=2;

x4:=0;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

begin

MediaPlayer1.Play();

Randomize();

Image1.Left:=Random(600);

Image1.Top:=Random(300);

Image1.Visible:=true;

label1.Visible:=false;

label2.Visible:=false;

label3.Visible:=false;

label4.Visible:=false;

trackbar1.Visible:=false;

trackbar2.Visible:=false;

trackbar3.Visible:=false;

trackbar4.Visible:=false;

end;

procedure TForm1.TrackBar1Change(Sender: TObject);

begin

label1.Caption:=IntToStr(trackbar1.Position);

y1:=trackbar1.Position;

end;

procedure TForm1.TrackBar2Change(Sender: TObject);

begin

label2.Caption:=IntToStr(trackbar2.Position);

y2:=trackbar2.Position;

end;

procedure TForm1.TrackBar3Change(Sender: TObject);

begin

label3.Caption:=IntToStr(trackbar3.Position);

y3:=trackbar3.Position;

end;

procedure TForm1.TrackBar4Change(Sender: TObject);

begin

label4.Caption:=IntToStr(trackbar4.Position);

y4:=trackbar4.Position;

end;

end.