Пишем на Python оригинальную игру-головоломку в стиле Flip-Flop. Программируем графический интерфейс (GUI) с применением библиотеки Tkinter. Автором идеи поля 2х2х5 является Сергей Полозков.
Игра в стиле Flip-Flop с полем 2х2 клетки. В каждой клетке-кнопке может сменяться одна из пяти картинок. В начале игры, выбор картинки для каждой кнопки происходит случайным образом. Когда игрок кликает по кнопке меняются картинки в трёх соседних клетках. Картинки меняются в строго определённом в начале игры порядке (по очереди). Цель игры - вывести на все кнопки одинаковые картинки.
В качестве картинок мы выбрали логотипы олицетворяющие операционные системы:
Рис. 1. Linux, FreeBSD, Android, MacOS, Windows.
В этой программе создадим игровое поле из Button объектов по шаблону, разработанному в статье Игровое поле из Button:
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 5 # столбцы
row = 5 # строки
btn = [] # список кнопок
img = []
files = ['red.png', 'yellow.png', 'gold.png',
'green.png', 'emerald.png', 'cyan.png',
'blue.png', 'pink.png','azure.png',
'bronze.png', 'purple.png', 'scarlet.png',
'steel.png', 'silver.png']
def play(n): # функция обработчик нажатия на кнопку
shuffle(img)
btn[n].config(image = img[0])
tk = Tk()
imgBL = PhotoImage(file="blank.png")
for i in files:
img += [PhotoImage(file=i)]
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, image=imgBL)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(command=lambda n=i*column+j:play(n))
mainloop()
Лист. 1.
Изменим количество кнопок (переменные column и row) и картинки. Строка imgBL = PhotoImage(file="blank.png") в этой программе нам не нужна.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 2 # столбцы
row = 2 # строки
btn = [] # список кнопок
img = []
files = ['android.png', 'apple.png', 'FreeBSD.png', 'PenguinLinux.png', 'windows.png']
def play(n): # функция обработчик нажатия на кнопку
shuffle(img)
btn[n].config(image = img[0])
tk = Tk()
for i in files:
img += [PhotoImage(file=i)]
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, image=img[i*column+j])]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(command=lambda n=i*column+j:play(n))
mainloop()
Лист. 2.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 2 # столбцы
row = 2 # строки
btn = [] # список кнопок
img = []
files = ['android.png', 'apple.png', 'FreeBSD.png', 'PenguinLinux.png', 'windows.png']
playGround = [0,1,2,3]
def play(n): # функция обработчик нажатия на кнопку
playGround[n] = (playGround[n]+1)%5
btn[n].config(image = img[playGround[n]])
tk = Tk()
for i in files:
img += [PhotoImage(file=i)]
shuffle(img)
shuffle(playGround)
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, image=img[i*column+j])]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(command=lambda n=i*column+j:play(n))
mainloop()
Лист. 3.
#!/usr/bin/env python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-
#
# flip-flop2x2x5.py
# Copyleft 2023 Aleksandr Diorditsa
# The author of the idea of the 2x2x5 field is Sergey Polozkov
#
# flip-flop2x2x5.py is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# flip-flop2x2x5.py is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program. If not, see http://www.gnu.org/licenses/.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 2 # столбцы
row = 2 # строки
btn = [] # список кнопок
img = []
files = ['android.png', 'apple.png', 'FreeBSD.png', 'PenguinLinux.png', 'windows.png']
playGround = [0,1,2,3]
def play(n): # функция
for i in range(4):
if i != 3-n:
playGround[i] = (playGround[i]+1)%5
btn[i].config(image = img[playGround[i]])
tk = Tk()
for i in files:
img += [PhotoImage(file=i)]
shuffle(img)
shuffle(playGround)
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, image=img[playGround[i*column+j]])]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(command=lambda n=i*column+j:play(n))
mainloop()
Лист. 4.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 2 # столбцы
row = 2 # строки
btn = [] # список кнопок
img = [] # список объектов с картинками
play_ground = []
visible = [0]*row*column
files = ['android.png', 'apple.png', 'FreeBSD.png', 'PenguinLinux.png', 'windows.png'] # список файлов с картинками
tmp = [0,1,2,3,4]
for i in range(column*row):
shuffle(tmp)
play_ground += tmp
def play(n): # функция обработчик onclick
for i in range(row*column):
if i != n:
visible[i] += 1 if visible[i] < 4 else -4
for i in range(column*row):
btn[i].config(image=img[play_ground[i*5+visible[i]]])
tk = Tk()
for i in files:
img += [PhotoImage(file=i)]
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
n = i*column+j
btn += [Button(f, width=200, height=200)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(image=img[play_ground[n*5]])
btn[-1].config(command=lambda n=n:play(n))
mainloop()
Лист. 5.