Представляем версию игры Flip-Flop, написанную на Python с использованием библиотеки Tkinter. За чёрных играет королевский пингвин, за красных - перец с трезубцем.

В этой игре ведут борьбу кнопки с логотипом пингвин, как известно, олицетворяющим OS Linux и кнопки с логотипом OS FreeBSD (красный перец с рожками и с трезубцем). На рис.1 представлены наши герои.

Рис. 1.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 3                          # столбцы
row = 3                             # строки
btn = []
playground = list('ЧТОЕСТЖУ ')      # виртуальное игровое поле

def play(n):                        # функция обработчик нажатия на кнопку
    btn[n].config(text=n)

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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(text=playground[n])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 1. Шаблон для игр с игровым полем в клетку. 

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле

def play(n):                        # функция обработчик нажатия на кнопку
    btn[n].config(text=n)

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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(text=playground[n])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 1. Создано виртуальное (абстрактное) игровое поле playground. 

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
color = ['#ddd', '#dfd']            # цвет
shuffle(playground)

def play(n):                        # функция обработчик нажатия на кнопку
    btn[n].config(text=n)

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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(bg=color[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 3. Перемешиваем список playground Выбраны цвета для кнопок (клеток). 

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
color = ['#ffa', '#dfd']            # цвет
shuffle(playground)

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    btn[n].config(bg=color[playground[n]])

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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(bg=color[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 4. В функции play() инвертируем цвет нажатой игроком кнопки. 

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
color = ['#ffa', '#dfd']            # цвет
shuffle(playground)

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    for i in range (n%column, column*row, column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(bg=color[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 5. В функции play() иинвертируем цвет каждой клетки в колонке, содержащей нажаткую игроком кнопку. 

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
color = ['#ffa', '#dfd']            # цвет
shuffle(playground)

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    for i in range (n%column, column*row, column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[i]])
    for i in range (n-n%column, n-n%column+column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(bg=color[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 6. В функции play() иинвертируем цвет каждой клетки в строке, содержащей нажатую игроком кнопку. 

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
color = ['#ffa', '#dfd']            # цвет
shuffle(playground)
tk = Tk()
tk.geometry('750x750')
img =[PhotoImage(file='FreeBSD.png'),PhotoImage(file='PenguinLinux.png')]

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    for i in range (n%column, column*row, column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[i]])
    for i in range (n-n%column, n-n%column+column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(bg=color[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 7.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
color = ['#ffa', '#dfd']            # цвет
shuffle(playground)
tk = Tk()
tk.geometry('880x880')
img =[PhotoImage(file='FreeBSD.png'),PhotoImage(file='PenguinLinux.png')]

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    for i in range (n%column, column*row, column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[i]])
    for i in range (n-n%column, n-n%column+column):
        playground[i] = not(playground[i])
        btn[i].config(bg=color[playground[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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(image=img[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 8.

from tkinter import *               # графическая библиотека
from random import shuffle          # перемешать список suffle(A)
column = 8                          # столбцы
row = 8                             # строки
btn = []
playground = [0, 1]*(row*column//2) # виртуальное игровое поле
shuffle(playground)
tk = Tk()
tk.geometry('880x880')
img =[PhotoImage(file='FreeBSD.png'),PhotoImage(file='PenguinLinux.png')]

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    for i in range (n%column, column*row, column):
        playground[i] = not(playground[i])
        btn[i].config(image=img[playground[i]])
    for i in range (n-n%column, n-n%column+column):
        playground[i] = not(playground[i])
        btn[i].config(image=img[playground[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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(image=img[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

mainloop()                          # главный цикл программы

Лист. 9.

# This is my version of the game, known as Flip-Flop.
#
# Created on November 02, 2023.
# Author: Diorditsa A.
#
# LinuxOrFreeBSD.py is distributed in the hope that it will be useful, but
# WITHOUT WARRANTY OF ANY KIND; not even an implied warranty
# MARKETABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See. See the GNU General Public License for more information.
# You can get a copy of the GNU General Public License
# by link http://www.gnu.org/licenses/

from tkinter import *               # графическая библиотека
from random import choice           # выбрать случайное
column = 5                          # столбцы
row = 3                             # строки
btn = []
playground = [1]*row*column         # виртуальное игровое поле
tk = Tk()
tk.geometry('880x880')
img =[PhotoImage(file='FreeBSD.png'),PhotoImage(file='PenguinLinux.png')]

def play(n):                        # функция обработчик нажатия на кнопку
    playground[n] = not(playground[n])
    for i in range (n%column, column*row, column):
        playground[i] = not(playground[i])
        btn[i].config(image=img[playground[i]])
    for i in range (n-n%column, n-n%column+column):
        playground[i] = not(playground[i])
        btn[i].config(image=img[playground[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)]
        btn[n].pack(expand=YES, fill=BOTH, side=LEFT)
        btn[n].config(width=3, height=2)
        btn[n].config(image=img[playground[n]])
        btn[n].config(command=lambda n=n: play(n))

for i in range(1000):               # перемешать пазл
    play(choice(range(row*column)))

mainloop()                          # главный цикл программы

Лист. 10.

Рис. 2.