Пишем на 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.