"""Игра в пятнашки"""
from Tkinter import *
import random
class Fifteen(Frame):
"""Класс, реализующий игру в пятнашки.
Интерфейс:
game(master, [rows[, cols]]) - инициализация игры
game.Shuffle() - перемешивание
game.Order() - упорядочивание
"""
def __init__(self, master=None, rows=4, cols=4):
"""Инициализация игрового поля (по умолчанию - классика)"""
Frame.__init__(self, master)
self.grid()
self._rows, self._cols = rows, cols # размеры поля
self._cells = {} # словарь x, y -> клетка и клетка -> x, y, имя
for y in range(rows):
for x in range(cols):
cell = Button(width=2, height=2)
cell.grid(row=y, column=x)
cell.bind(??, self._move_to_empty)
self._cells[x, y] = cell
self.Order()
def Order(self):
"""Упорядочивание игрового поля (именование клеток)"""
for y in range(self._rows):
for x in range(self._cols):
self._set_name(x, y, str(y*self._cols+x+1))
self._set_name(self._cols-1, self._rows-1, «»)
def Shuffle(self):
"""Перемешивание фишек (случайным блужданием пустого места)"""
for i in range(300):
xe, ye = self._empty_place
x, y = random.choice([(xe+1, ye),(xe-1, ye),(xe, ye+1),(xe, ye-1)])
if 0 <= x < self._cols and 0 <= y < self._rows:
self._move(self._cells[x, y])
def _set_name(self, x, y, name):
"""пометить клетку x, y как фишку с именем name"""
cell = self._cells[x, y]
if name: # клетка-фишка
cell.configure(relief=RAISED, text=name, state=NORMAL)
else: # клетка без фишки
cell.configure(relief=FLAT, text="", state=DISABLED)
self._empty_place = x, y
self._cells[cell] = (x, y, name)
def _move(self, widget):
"""двинуть фишку w на пустое место (если возможно)"""
(x, y, nm), (xe, ye) = self._cells[widget], self._empty_place
if abs(x-xe) + abs(y-ye) == 1:
self._set_name(x, y, «»)
self._set_name(xe, ye, nm)
def _move_to_empty(self, event):
"""попробовать двинуть фишку на пустое место"""
self._move(event.widget)
root = Tk()
root.title("15")
game = Fifteen(root) # игровое поле
menu = Menu(root) # главное меню
root.config(menu=menu)
file_menu = Menu(menu)
menu.add_cascade(label="File", menu=file_menu)
file_menu.add_command(label="Shuffle", command=game.Shuffle)
file_menu.add_command(label="Order", command=game.Order)
file_menu.add_separator()
file_menu.add_command(label="Exit", command=root.destroy)
root.mainloop() # запускаем цикл обработки событий