fgjgf
В этой программе игровое поле из Button объектов создадим по шаблону, разработанному в статье Игровое поле из Button. Только изменим количество кнопок (переменные column и row).
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
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):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 1.
Рис. 1.
В программе листинг 1, в функции play(), закомментируем строку
btn[n].config(text = n)
и объявим в функции play() глобальную переменную m.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
def play(n): # функция обработчик нажатия на кнопку
global m
# btn[n].config(text = n)
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 2.
Добавим в программу листинг 2 список letter и перемешаем его элементы.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
def play(n): # функция обработчик нажатия на кнопку
global m
# btn[n].config(text = n)
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 3.
В программе листинг 3, в функции play(), раскомментируем строку
btn[n].config(text = n)
и немного изменим её.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
def play(n): # функция обработчик нажатия на кнопку
global m
btn[n].config(text=letter[n])
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 4.
Рис. 2.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
m = 0
def play(n): # функция обработчик нажатия на кнопку
global m
btn[n].config(text=letter[n])
btn[m].config(text=" ")
m = n
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 5.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0
def play(n): # функция обработчик нажатия на кнопку
global m, fix
btn[n].config(text=letter[n])
if fix:
fix = False
else:
btn[m].config(text=" ")
m = n
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 6.
Изменения, внесённые в программу листинг 6 позволяют нам удалить строку
m = 0
Теперь добавим в функцию play() условный оператор elif и логическую операцию, которая будет сравнивать букву на нажатой кнопке с ранее открытой буквой.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0
def play(n): # функция обработчик нажатия на кнопку
global m, fix
btn[n].config(text=letter[n])
if fix:
fix = False
elif letter[n] == letter[m]:
fix = True
else:
btn[m].config(text=" ")
m = n
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 7.
Сделаем так, чтобы игрок, нажимая на уже открытую кнопку не мог изменить игровую ситуацию.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0
def play(n): # функция обработчик нажатия на кнопку
global m, fix
if btn[n].cget('text') != " " : return
btn[n].config(text=letter[n])
if fix:
fix = False
elif letter[n] == letter[m]:
fix = True
else:
btn[m].config(text=" ")
m = n
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 8.
#!/usr/bin/env python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*-
#
# Memory.py
# Copyright (C) 2022 Aleksandr Diorditsa, see <https://adior.ru>
# I want to thank all my students for the inspiration they give me.
#
# Memory.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.
#
# Memory.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 = 8 # столбцы
row = 6 # строки
btn = [] # список кнопок
letter = list("QWERTYUPASDFGHJKLZXCVBNM" * 2)
shuffle(letter)
fix = True
m = 0
def play(n): # функция обработчик нажатия на кнопку
global m, fix
if btn[n].cget('text') != " " : return
btn[n].config(text=letter[n])
if fix:
fix = False
elif letter[n] == letter[m]:
fix = True
else:
btn[m].config(text=" ")
m = n
for i in range(row):
f = Frame()
f.pack(expand=YES, fill=BOTH)
for j in range(column):
btn += [Button(f, font =("mono", 16, "bold"), width = 5, height=3)]
btn[-1].pack(expand=YES, fill=BOTH, side=LEFT)
btn[-1].config(text = " ", command=lambda n=i*column+j:play(n))
mainloop()
Лист. 9.
Рис. 2. Изображения шариков в png формате.
Рис. Прозрачное изображение размером 50х50 px.
from tkinter import * # графическая библиотека
from random import shuffle # перемешать список suffle(A)
column = 7 # столбцы
row = 4 # строки
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']*2
shuffle(files)
fix = True
m = 0
def play(n): # функция обработчик нажатия на кнопку
global m, fix
#print(btn[n].cget('image'))
if btn[n].cget('image') != 'pyimage1' : return
btn[n].config(image = img[n])
if fix:
fix = False
elif files[n] == files[m]:
fix = True
else:
btn[m].config(image = imgBL)
m = n
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()
Ррп