Представляем версию игры Flip-Flop на поле 2x2, 4x4, 6x6, 8x8 написанную на Python с использованием библиотеки Tkinter. За Linux играет королевский пингвин, за FreeBSD - перец с трезубцем.

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

Рис. 1.

По правилам игры, игровое поле представляет собой квадрат разбитый на чётное количество клеток. Всё поле заполняется пингвинами и перцами в равных долях, но в случайном порядке. 

Цель игрока, нажимая на кнопки (клетки) на игровом поле, заполнить всё поле либо пингвинами, либо перцами. Когда игрок нажимает на клетку, картинка на ней инвертируется. Был перец — станет пингвин, был пингвин — станет перец.

Но не все так просто, игра усложняется тем, что одновременно с нажатой клеткой инвертируется весь ряд и вся колонка в которой находится эта клетка. Желаем удачи. 

from tkinter import *
from  random import *
SIZE = 4

class createBtn(Button):
    def __init__(self, conteiner, img):
        super().__init__(conteiner, image=choice(img))
        self.pack(side=LEFT, expand=YES, fill=BOTH)

class createGame():
    def __init__(self, size, img):
        frm = [Frame() for i in range(size)]
        for i in frm:
            i.pack(expand=YES, fill=BOTH)
            [createBtn(i, img) for j in range(size)]

tk = Tk()
fr = Frame()
fr.pack()
IMG = [PhotoImage(file='PenguinLinux.png'), PhotoImage(file='FreeBSD.png')]
createGame(SIZE, IMG)

mainloop()

Программа 1. Создание графического интерфейса.

В программе 1 создан графический интерфейс к игре Flip-Flop.

Рис. 1.

from tkinter import *
from  random import *
SIZE = 4

class createBtn(Button):
    playArea = []
    btnArea = []
    def __init__(self, conteiner, img):
        i = choice([0, 1])
        createBtn.playArea.append(i)
        super().__init__(conteiner, image=img[i])
        createBtn.btnArea.append(self)
        self.pack(side=LEFT, expand=YES, fill=BOTH)

class createGame():
    def __init__(self, size, img):
        frm = [Frame() for i in range(size)]
        for i in frm:
            i.pack(expand=YES, fill=BOTH)
            [createBtn(i, img) for j in range(size)]

tk = Tk()
fr = Frame()
fr.pack()
IMG = [PhotoImage(file='PenguinLinux.png'), PhotoImage(file='FreeBSD.png')]
createGame(SIZE, IMG)
print(createBtn.playArea)

mainloop()

Программа 2.

from tkinter import *
from  random import *
SIZE = 4

class createBtn(Button):
    playArea = []
    btnArea = []
    def __init__(self, conteiner, img):
        self.img = img
        i = choice([0, 1])
        createBtn.playArea.append(i)
        super().__init__(conteiner, image=img[i])
        createBtn.btnArea.append(self)
        self.pack(side=LEFT, expand=YES, fill=BOTH)
        self.N = len(createBtn.btnArea) - 1
        self.config(command=self.play)
    def play(self):
        createBtn.playArea[self.N] = int(not(createBtn.playArea[self.N]))
        self.config(image=self.img[createBtn.playArea[self.N]])

class createGame():
    def __init__(self, size, img):
        frm = [Frame() for i in range(size)]
        for i in frm:
            i.pack(expand=YES, fill=BOTH)
            [createBtn(i, img) for j in range(size)]

tk = Tk()
fr = Frame()
fr.pack()
IMG = [PhotoImage(file='PenguinLinux.png'), PhotoImage(file='FreeBSD.png')]
createGame(SIZE, IMG)

mainloop()

Программа 3.

from tkinter import *
from  random import *
SIZE = 4

class createBtn(Button):
    playArea = []
    btnArea = []
    def __init__(self, conteiner, img):
        self.img = img
        i = choice([0, 1])
        createBtn.playArea.append(i)
        super().__init__(conteiner, image=img[i])
        createBtn.btnArea.append(self)
        self.pack(side=LEFT, expand=YES, fill=BOTH)
        self.N = len(createBtn.btnArea) - 1
        self.config(command=self.play)
    def play(self):
        for i in range(len(createBtn.playArea)):
            if (i % len(createBtn.playArea)**0.5 == self.N % len(createBtn.playArea)**0.5
                or i // len(createBtn.playArea)**0.5 == self.N // len(createBtn.playArea)**0.5):
                createBtn.playArea[i] = int(not(createBtn.playArea[i]))
                createBtn.btnArea[i].config(image=self.img[createBtn.playArea[i]])

class createGame():
    def __init__(self, size, img):
        frm = [Frame() for i in range(size)]
        for i in frm:
            i.pack(expand=YES, fill=BOTH)
            [createBtn(i, img) for j in range(size)]

tk = Tk()
fr = Frame()
fr.pack()
IMG = [PhotoImage(file='PenguinLinux.png'), PhotoImage(file='FreeBSD.png')]
createGame(SIZE, IMG)

mainloop()

Программа 4.

#!/usr/bin/env python
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- 
#
# LinuxORfreeBSD.py
# Copyright (C) 2021 Aleksandr Diorditsa, see <https://adior.ru>
# I want to thank all my students for the inspiration they give me.
#
# LinuxORfreeBSD.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.
# 
# LinuxORfreeBSD.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 *
SIZE = 4

class createBtn(Button):
    strokeNum = 0
    playArea = []
    btnArea = []
    def __init__(self, conteiner, img):
        self.img = img
        i = choice([0, 1])
        createBtn.playArea.append(i)
        super().__init__(conteiner, image=img[i])
        createBtn.btnArea.append(self)
        self.pack(side=LEFT, expand=YES, fill=BOTH)
        self.N = len(createBtn.btnArea) - 1
        self.config(command=self.play)
    def play(self):
        createBtn.strokeNum += 1
        tk.title("Ход "+str(createBtn.strokeNum))
        for i in range(len(createBtn.playArea)):
            if (i % len(createBtn.playArea)**0.5 == self.N % len(createBtn.playArea)**0.5
                or i // len(createBtn.playArea)**0.5 == self.N // len(createBtn.playArea)**0.5):
                createBtn.playArea[i] = int(not(createBtn.playArea[i]))
                createBtn.btnArea[i].config(image=self.img[createBtn.playArea[i]])
        if not(0 in createBtn.playArea and 1 in createBtn.playArea):
            tk.title("Вы победили на "+str(createBtn.strokeNum)+" ходу")

class createGame():
    def __init__(self, size, img):
        frm = [Frame() for i in range(size)]
        for i in frm:
            i.pack(expand=YES, fill=BOTH)
            [createBtn(i, img) for j in range(size)]
        createBtn.playArea = [0]* int((size**2/2)) + [1]* int((size**2/2))
        shuffle(createBtn.playArea)
        for i in range(size**2):
            createBtn.btnArea[i].config(image=img[createBtn.playArea[i]])

tk = Tk()
tk.title('Linux or FreeBSD '+ str(SIZE)+'x'+str(SIZE))
fr = Frame()
fr.pack()
IMG = [PhotoImage(file='PenguinLinux.png'), PhotoImage(file='FreeBSD.png')]
createGame(SIZE, IMG)

mainloop()

Программа 5.

Рис. 2.