ГЛАВНАЯ      ДОКУМЕНТАЦИЯ      СТАТЬИ      ПРОГРАММЫ      ССЫЛКИ      ФОРУМ      ДРУГОЕ   

Игра 15

        Игра "15" реализована в виде класса Fifteenth и главного модуля.
Класс Fifteenth включает:
-- Конструктор класса __init__ - создает массив плиток self.pieces (первое поле каждого описателя - ссылка на кнопку, второе - имя кнопки (0 - свободное место); self.field - описатель свободного поля. Цикл заполняет массив плиток и устанавливает для каждой плитки-кнопки собственные аргументы обработчика (используется один обработчик для всех кнопок).
-- Метод mix - смешивает плитки.
-- Метод run - обработчик нажатия на кнопку. Метод проверяет возможность перемещения плитки, выполняет перемещение и настраивает аргументы обработчика на новую позицию кнопки.
Главный модуль создает окно приложения, инициализирует безымянный объект класса Fifteenth и формирует цикл опроса событий.
#!/usr/bin/python

from Tkinter import *
import random

class Fifteenth:
    def __init__(self,root):
	self.pieces =	[[0,1],[0,2],[0,3],[0,4], \
			[0,5],[0,6],[0,7],[0,8], \
			[0,9],[0,10],[0,11],[0,12], \
			[0,13],[0,14],[0,15],[0,0]]
	self.field = []
	self.mix()
	for i in range(4):
	    for j in range(4):
		if self.pieces[4*i+j][1] != 0:
		    but = Button(root,text=self.pieces[4*i+j][1])
		    but.bind("",lambda event=0,x=j,y=i: self.run(event,x,y))
		    but.grid(row=i,column=j,sticky=E+W+N+S)
		    self.pieces[4*i+j][0] = but
		else:
		    self.field = (j,i)

    def mix(self):
	for i in range(16):
	    rand = random.randint(0,15)
	    (self.pieces[i],self.pieces[rand]) = (self.pieces[rand],self.pieces[i])

    def run(self,event,x,y):
	if abs(x-self.field[0])==1 and y-self.field[1]==0 or abs(y-self.field[1])==1 and x-self.field[0]==0:
	    newInd = 4*self.field[1]+self.field[0]
	    (self.pieces[4*y+x],self.pieces[newInd]) = (self.pieces[newInd],self.pieces[4*y+x])
	    self.pieces[newInd][0].grid(row=self.field[1],column=self.field[0],sticky=E+W+N+S)
	    self.pieces[newInd][0].config()
	    self.pieces[newInd][0].bind("",lambda event=0,x=self.field[0],y=self.field[1]: self.run(event,x,y))
	self.field = (x,y)

root = Tk()
Fifteenth(root)
root.mainloop()

Наличие нескольких кнопок и использование одной функции-обработчика приводит к необходимости передачи в обработчик инофрмации о координатах нажатой кнопки. Для этого в обработчик передаются дополнительные аргументы. Для перемещения кнопки используются методы 'grid' и 'config', смену аргументов для функции-обработчика выполняет вызов 'bind' в методе 'run'. В связи с тем, что в Tkinter отсутствует возможность указания аргументов обработчика в 'bind', используется 'lambda'-функция, устанавливающая значения аргументов по умолчанию.
Выполняем, проверяем результаты. На этом все.

Источники:
        cetus.com.ua

ПОМОЩЬ САЙТУ :
sms.Є®ЇЁ«Є  *PythonUA*
Для чего Вы используете Python?
Admin( 46 )
Web( 61 )
GUI( 37 )
Embedding ( 16 )
Другое( 34 )
Какими продуктами Вы пользовались?
Zope( 15 )
Plone( 1 )
TG( 7 )
Django( 15 )
Twisted( 5 )
Другими( 10 )
ДРУЗЬЯ:
LUG.DN.UA
D-FENS.ORG.UA
SLAV0NIC.XSS.RU
CETUS.COM.UA
ENTDEV.ORG
[Python Powered]
Rambler's Top100
Copyright © 2006 python.com.ua