Представляем версию игры 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.