Недавно я вспомнил одну настольную игру из детства, названия которой не мог вспомнить. Я долго искал её, описывал разными словами и наконец нашел что-то похожее, это игра Memory.
В моей памяти дизайн у неё был другой, но смысл игры тот же. После начала игры загорается один из цветов (красный, зеленый, синий, желтый) Далее нужно нажать на него и начнется новый круг. На новом круге загорится та же последовательность что и на предыдущим, но прибавится еще один цвет.
Одним скучным вечером мне захотелось сделать эту игру в виде программы, просто проверить, смогу ли я. Делать всё это я буду на языке программирования Python3
Сначала определимся какие нам понадобятся библиотеки. Красота мне не нужна, поэтому в качестве графической оболочки будут использовать стандартный tkinter. Так же понадобится библиотека random чтобы создавать случайную последовательность и библиотека time, чтобы можно было делать паузы.
Далее настраиваем параметры окна:
Вот что пока получилось:
Создадим 3 функции.
Create_menu - будет отвечать за то, чтобы появилась кнопка начать, внутри неё запустим функцию data, которая создаст массив со случайной последовательностью букв r g b y, это нам понадобится в далее.
А также создадим сами кнопки функция create_but, надеюсь пояснять как создавать кнопки Вам не нужно, скажи лишь, что не обращайте внимание на command=lambda: click_but("*"), позже расскажу об этом.
И функция clear_window - она будет удалять все элементы, размещенные методом place, т.к. у меня все элементы появляются через place, то эта функция просто удаляет все :))
(Если кто спросит почему data не засунуть в create_menu, то возражать не буду, просто так выглядит красивее :) )
И так, что же пока получается?
В консоли можем заметить что наша рандомная последовательность создается, а это есть хорошо.
Хорошо, а что дальше? Как вы можете заметить, если нажать на кнопку "Начать" запуститься функция start, что же она делает? Это сложная часть программы, попытайтесь вникнуть!
Нам нужно показать игроку, какая кнопка в какой последовательности идет, для этого я буду, в зависимости от последовательности которую мы сгенерировали ранее, удалять кнопку и создавать на её месте более затемнённую версию, и тогда пользователь поймет какая последовательность нажатий должна быть.
В программе это выглядит так:
Переменная perem_for_click_user будет отвечать за то, сколько раз уже нажали на кнопку на этом кругу.
Далее начинается цикл от 0 до количество кругов. Так как это первый круг, то цикл выполнится один раз, если последовательность выглядит так:
['g', 'r', 'y', 'y'.......................]
То сначала удалится светло-зеленая кнопка и на неё месте появиться темно-зеленая кнопка. Далее обновляем экран, чтобы кнопка поменяла цвет на экране, делаем небольшую паузу, чтобы пользователь заметил изменение. Затем удаляем всё с экрана и опять создаем стандартные кнопки.
Теперь вернемся к тому самому "не обращайте внимание на command=lambda: click_but("*"), позже расскажу об этом."
Если мы нажмем на красную кнопку, то она передаст "r" в функция click_but, если нажмем зеленую кнопку, то передаст "g" и так по аналогии.
А что это за функция такая click_but? А вот она!
Думаю, это самое сложное место в программе. Поэтому распишу чуть подробнее!
После того как пользователю показалась последовательность кнопок, например красная-зеленая-синяя, переменная perem_for_click_user равняется нулю. Когда пользователь нажмет на красную кнопку, в эту функцию будет передано значение "r" , далее делается проверка, если первое значение в этой последовательности равна "r" значит, пользователь нажал правильную кнопку, поэтому количество кликов на этом кругу увеличивается на 1, а если пользователь уже нажал на кнопки столько, сколько равно номеру кругу, значит круг законен. А это значит что нужно увеличить переменную круга на 1, и заново запустить показывания последовательности пользователю, где переменная perem_for_click_user обнулится и пойдет всё по новой, но добавится одна кнопка в конце последовательности. И так всё по кругу...
Если же пользователь бы нажал не правильную кнопку, то сработала бы end_game(). Тут всё просто:
Ну вот как-то так! Если хотите сами потыкать программу вручную, например поменять время задержки, или расположение кнопок или просто испоганить код, то вот ссылка на него: https://onlinegdb.com/QIvMQsH-G
Всем добра и вот еще милое фото котика!!!