Форум сайта python.su
http://python.su/forum/topic/24839/
Немного переделал, осталось допилить, например в слове эффект, две “ф” программа не обрабатывает и если правильных четыре нажал, даже одну и ту же букву то выиграл
#coding: utf-8 from Tkinter import * root = Tk() canvas = Canvas(root, width=600, height=600) canvas.pack(fill=BOTH) word = u'абвгде' y = 0 while y < 600: x=0 while x < 600: canvas.create_rectangle(x,y,x+33,y+27, fill="white", outline="blue") x=x+33 y = y + 27 a1 = canvas.create_text(315,40, text=word[0], fill="purple", font=("Helvectica", "16")) a2 = canvas.create_text(347,40, text='_', fill="purple", font=("Helvectica", "18")) a3 = canvas.create_text(380,40, text='_', fill="purple", font=("Helvectica", "18")) a4 = canvas.create_text(412,40, text='_', fill="purple", font=("Helvectica", "18")) a5 = canvas.create_text(444,40, text='_', fill="purple", font=("Helvectica", "18")) a6 = canvas.create_text(477,40, text=word[-1], fill="purple", font=("Helvectica", "16")) list1 = [1,2,3,4,5,6] alfabet = u'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' canvas.create_line(10,10,200,10,width=4) canvas.create_line(10,10,10,400,width=4) canvas.create_line(50,10,10,100,width=4) er = [] win = [] def a(v): ind_alf = alfabet.index(v) key = alfabet[ind_alf] if v in word: ind = word.index(v) b2 = list1[ind] if b2 == 1: btn[key]["bg"] = "green" pass if b2 == 6: btn[key]["bg"] = "green" pass if b2 == 2: win.append(v) a2 = canvas.create_text(347,40, text=word[1], fill="purple", font=("Helvectica", "18")) btn[key]["bg"] = "green" elif b2 == 3: win.append(v) a3 = canvas.create_text(380,40, text=word[2], fill="purple", font=("Helvectica", "18")) btn[key]["bg"] = "green" elif b2 == 4: win.append(v) a3 = canvas.create_text(412,40, text=word[3], fill="purple", font=("Helvectica", "18")) btn[key]["bg"] = "green" elif b2 == 5: win.append(v) a3 = canvas.create_text(444,40, text=word[4], fill="purple", font=("Helvectica", "18")) btn[key]["bg"] = "green" if len (win) == 4: canvas.create_text(150,150, text="You win", fill="purple", font=("Helvectica", "16")) else: er.append(v) btn[key]["bg"] = "red" if len(er) == 1: golova() elif len(er) == 2: telo() elif len(er) == 3: rukaL() elif len(er) == 4: rukaP() elif len(er) == 5: nogaL() elif len(er) == 6: nogaP() end() root.update() btn = {} def gen(u,x,y): btn[u] = Button(root , text = u, width=3, height=1, command = lambda: a(u)) btn[u].place(x=str(x),y=str(y)) x = 265 y = 110 for i in alfabet[0:8]: gen(i,x,y) x=x+33 x = 265 y=137 for i in alfabet[8:16]: gen(i,x,y) x=x+33 x = 265 y=164 for i in alfabet[16:24]: gen(i,x,y) x=x+33 x = 265 y=191 for i in alfabet[24:33]: gen(i,x,y) x=x+33 def golova(): canvas.create_oval(79,59,120,80, width=4, fill="white") root.update() def telo(): canvas.create_line(100,80,100,200,width=4) root.update() def rukaP(): canvas.create_line(100,80,145,100,width=4) root.update() def rukaL(): canvas.create_line(100,80,45,100,width=4) root.update() def nogaL(): canvas.create_line(100,200,45,300,width=4) root.update() def nogaP(): canvas.create_line(100,200,145,300,width=4) root.update() def end(): canvas.create_text(150,150, text="The end", fill="purple", font=("Helvectica", "16")) canvas.create_line(100,10,100,60,width=4) root.mainloop()
Отредактировано Kasta_neda (Сен. 9, 2014 21:01:47)
Офлайн
Особо не тестировал, но есть моменты где код можно упростить и сократить
#coding: utf-8 from Tkinter import * import random root = Tk() root.title(u'Виселица') canvas = Canvas(root, width=600, height=600) canvas.pack(fill=BOTH) def but(): y = 0 while y < 600: x=0 while x < 600: canvas.create_rectangle(x,y,x+33,y+27, fill="white", outline="blue") x=x+33 y = y + 27 #but() faq = ''' Принцип игры Андроид загадывает слово — пишет на бумаге первую и последнюю букву слова и отмечает места для остальных букв, например чертами . Также рисуется виселица. Игрок предлагает букву, которая может входить в это слово.Если такая буква есть в слове, то Андроид пишет её над соответствующими этой букве чертами — столько раз, сколько она встречается в слове.Если такой буквы нет, то к виселице добавляется круг в петле,изображающий голову.Игрок продолжает отгадывать буквы до тех пор,пока не отгадает всё слово.За каждый неправильный ответ Андроид добавляет одну часть туловища к виселице(их 6: голова, туловище, 2 руки и 2 ноги).Если туловище в виселице нарисовано полностью, то отгадывающий игрок проигрывает, считается повешенным. Если игроку удаётся угадать слово, он выигрывает. ''' canvas.create_text(310,240, text=faq, fill="purple", font=("Helvectica", "14")) slova = [u'виселица',u'смартфон',u'маргарин',u'мегагерц',u'страница',u'креветка',u'микрофон'] def arr(): but() word = random.choice(slova) #word = u'микрофон' wo = word[1:-1] wor = [] for i in wo: wor.append(i) a0 = canvas.create_text(282,40, text=word[0], fill="purple", font=("Helvectica", "18")) a1 = canvas.create_text(315,40, text='_', fill="purple", font=("Helvectica", "18")) a2 = canvas.create_text(347,40, text='_', fill="purple", font=("Helvectica", "18")) a3 = canvas.create_text(380,40, text='_', fill="purple", font=("Helvectica", "18")) a4 = canvas.create_text(412,40, text='_', fill="purple", font=("Helvectica", "18")) a5 = canvas.create_text(444,40, text='_', fill="purple", font=("Helvectica", "18")) a6 = canvas.create_text(477,40, text='_', fill="purple", font=("Helvectica", "18")) a6 = canvas.create_text(510,40, text=word[-1], fill="purple", font=("Helvectica", "18")) list1 = [1,2,3,4,5,6] alfabet = u'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' canvas.create_line(10,10,200,10,width=4) canvas.create_line(10,10,10,400,width=4) canvas.create_line(50,10,10,100,width=4) er = [] win = [] def a(v): ind_alf = alfabet.index(v) key = alfabet[ind_alf] if v in wor: ind = wor.index(v) b2 = list1[ind] wor[ind]='1' def kord(): if b2 == 1: x1,y1 = 315,40 if b2 == 2: x1,y1 = 347,40 if b2 == 3: x1,y1 = 380,40 if b2 == 4: x1,y1 = 412,40 if b2 == 5: x1,y1 = 444,40 if b2 == 6: x1,y1 = 477,40 return x1,y1 x1,y1 = kord() win.append(v) a2 = canvas.create_text(x1,y1, text=wo[ind], fill="purple", font=("Helvectica", "18")) btn[key]["bg"] = "green" if not v in wor: btn[key]['state'] = 'disabled' if v in wor: win.append(v) ind2 = wor.index(v) b2 = list1[ind2] x1,y1 = kord() canvas.create_text(x1,y1, text=wo[ind2], fill="purple", font=("Helvectica", "18")) if len (win) == 6: canvas.create_text(150,150, text="You win", fill="purple", font=("Helvectica", "16")) for i in alfabet: btn[i]['state'] = 'disabled' else: er.append(v) btn[key]["bg"] = "red" btn[key]['state'] = 'disabled' if len(er) == 1: golova() elif len(er) == 2: telo() elif len(er) == 3: rukaL() elif len(er) == 4: rukaP() elif len(er) == 5: nogaL() elif len(er) == 6: nogaP() end() root.update() btn = {} def gen(u,x,y): btn[u] = Button(root , text = u, width=3, height=1, command = lambda: a(u)) btn[u].place(x=str(x),y=str(y)) x = 265 y = 110 for i in alfabet[0:8]: gen(i,x,y) x=x+33 x = 265 y=137 for i in alfabet[8:16]: gen(i,x,y) x=x+33 x = 265 y=164 for i in alfabet[16:24]: gen(i,x,y) x=x+33 x = 265 y=191 for i in alfabet[24:33]: gen(i,x,y) x=x+33 def golova(): canvas.create_oval(79,59,120,80, width=4, fill="white") root.update() def telo(): canvas.create_line(100,80,100,200,width=4) root.update() def rukaP(): canvas.create_line(100,80,145,100,width=4) root.update() def rukaL(): canvas.create_line(100,80,45,100,width=4) root.update() def nogaL(): canvas.create_line(100,200,45,300,width=4) root.update() def nogaP(): canvas.create_line(100,200,145,300,width=4) root.update() def end(): canvas.create_text(150,150, text="The end", fill="purple", font=("Helvectica", "16")) canvas.create_line(100,10,100,60,width=4) for i in alfabet: btn[i]['state'] = 'disabled' btn01 = Button(root , text = 'Start', width=3, height=1, command = lambda: arr()) btn01.place(x=298,y=542) btn01["bg"] = "red" root.mainloop()
Отредактировано Kasta_neda (Авг. 24, 2014 13:16:14)
Прикреплённый файлы:
Ersv6a4U5ZQ.jpg (100,2 KБ)
Офлайн
if b2 == 1: x1,y1 = 315,40 if b2 == 2: x1,y1 = 347,40 if b2 == 3: x1,y1 = 380,40 if b2 == 4: x1,y1 = 412,40 if b2 == 5: x1,y1 = 444,40 if b2 == 6: x1,y1 = 477,40
if len(er) == 1: golova() elif len(er) == 2: telo() elif len(er) == 3: rukaL() elif len(er) == 4: rukaP() elif len(er) == 5: nogaL() elif len(er) == 6: nogaP() end()
Офлайн
Kasta_neda
в программе помоему есть неверное архитектурное решение -
при запуске хавает 8mb
но сыграй я например 100 раз будет уже 80mb
проверял
в наше времени памяти хоть отбавляй - но здесь явно не верный подход
новое окно создается а старое не уничтожается
нажимая на красную кнопку каждый раз создаётся новое окно.
зачем?
если надо нарисовать только слово и виселицу
Отредактировано vrabey (Авг. 30, 2014 12:13:42)
Офлайн
AZJIO
Тут вообще ни if ни elif не нужен
Офлайн
4kpt_II
Тут вообще ни if ни elif не нужен
functions = [head, body, left_hand, right_hand, left_foot, right_foot] functions[key-1]()
Отредактировано Alen (Авг. 30, 2014 16:34:59)
Офлайн
Alen
Ага. Только одной строкой краше
functions = [head, body, left_hand, right_hand, left_foot, right_foot][key+1]()
Отредактировано 4kpt_II (Авг. 30, 2014 16:34:05)
Офлайн
4kpt_II
P.S. Но мне больше нравится словарь. Так как 1, 2, 3 это крайняя редкость. Из евента беру имя виджета и уже связываю callback функцию.
Офлайн
Alen
Ну и функции все эти можно выкинуть оставить одну.
Офлайн
Пока убрал if-else, и функции
не могу прикрутить счетчик побед-поражений, подскажите как
и пока не разобрался с перезапуском, vrabey
#coding: utf-8 from Tkinter import * import random root = Tk() root.title(u'Виселица') canvas = Canvas(root, width=600, height=600) canvas.pack(fill=BOTH) global pobed global poraj pobed = 0 poraj = 0 def but(): #рисуем сетку y = 0 while y < 600: x=0 while x < 600: canvas.create_rectangle(x,y,x+33,y+27, fill="white", outline="blue") x=x+33 y = y + 27 #but() faq = ''' Принцип игры Андроид загадывает слово — пишет на бумаге первую и последнюю букву слова и отмечает места для остальных букв, например чертами . Также рисуется виселица. Игрок предлагает букву, которая может входить в это слово.Если такая буква есть в слове, то Андроид пишет её над соответствующими этой букве чертами — столько раз, сколько она встречается в слове.Если такой буквы нет, то к виселице добавляется круг в петле,изображающий голову.Игрок продолжает отгадывать буквы до тех пор,пока не отгадает всё слово.За каждый неправильный ответ Андроид добавляет одну часть туловища к виселице(их 6: голова, туловище, 2 руки и 2 ноги).Если туловище в виселице нарисовано полностью, то отгадывающий игрок проигрывает, считается повешенным. Если игроку удаётся угадать слово, он выигрывает. ''' canvas.create_text(310,240, text=faq, fill="purple", font=("Helvectica", "14")) slova = [u'виселица',u'смартфон',u'маргарин',u'мегагерц',u'страница',u'креветка',u'микрофон',u'квартира',u'скорость',u'художник',u'жидкость',u'карантин',u'интернет',u'документ',u'мембрана',u'радиация',u'мавзолей',u'терминал',u'водитель'] def arr(): #основная функция but() word = random.choice(slova) # выбираем рандомно слово #word = u'микрофон' wo = word[1:-1] # отрезаем от слова первую и последнюю букву wor = [] for i in wo: wor.append(i) a0 = canvas.create_text(282,40, text=word[0], fill="purple", font=("Helvectica", "18")) # распологаем буквы на поле a1 = canvas.create_text(315,40, text='_', fill="purple", font=("Helvectica", "18")) a2 = canvas.create_text(347,40, text='_', fill="purple", font=("Helvectica", "18")) a3 = canvas.create_text(380,40, text='_', fill="purple", font=("Helvectica", "18")) a4 = canvas.create_text(412,40, text='_', fill="purple", font=("Helvectica", "18")) a5 = canvas.create_text(444,40, text='_', fill="purple", font=("Helvectica", "18")) a6 = canvas.create_text(477,40, text='_', fill="purple", font=("Helvectica", "18")) a6 = canvas.create_text(510,40, text=word[-1], fill="purple", font=("Helvectica", "18")) list1 = [1,2,3,4,5,6] alfabet = u'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' canvas.create_line(10,10,200,10,width=4) # рисуем виселицу canvas.create_line(10,10,10,400,width=4) canvas.create_line(50,10,10,100,width=4) er = [] # ошибки win = [] # угаданные слова canvas.create_text(75,500, text = u'Побед ', fill="purple", font=("Helvectica", "18")) dl = canvas.create_text(120,500, text = pobed, fill="purple", font=("Helvectica", "18")) canvas.create_text(100,550, text = u'Поражений ', fill="purple", font=("Helvectica", "18")) dl2 = canvas.create_text(170,550, text = poraj, fill="purple", font=("Helvectica", "18")) def a(v): ind_alf = alfabet.index(v) key = alfabet[ind_alf] if v in wor: ind = wor.index(v) b2 = list1[ind] wor[ind]='1' def kord(): # функция координат букв flst = (315,347,380,412,444,477) y1 = 40 x1 = flst[b2 -1] return x1,y1 x1,y1 = kord() win.append(v) a2 = canvas.create_text(x1,y1, text=wo[ind], fill="purple", font=("Helvectica", "18")) # располагаем угаданную букву на поле btn[key]["bg"] = "green" if not v in wor: # если нет нажатой буквы в слове, кнопку делаем неактивной btn[key]['state'] = 'disabled' if v in wor: win.append(v) ind2 = wor.index(v) b2 = list1[ind2] x1,y1 = kord() canvas.create_text(x1,y1, text=wo[ind2], fill="purple", font=("Helvectica", "18"))# если две одинаковые буквы, то добавляем if len (win) == 6: # если угадали правильно 6 букв canvas.create_text(150,150, text="You win", fill="purple", font=("Helvectica", "16")) pobed =+1 canvas.delete(dl) canvas.create_text(120,500, text=pobed, fill="purple", font=("Helvectica", "18")) for i in alfabet: btn[i]['state'] = 'disabled' else: # иначе рисуем человечка er.append(v) btn[key]["bg"] = "red" btn[key]['state'] = 'disabled' err = len(er) men = ('100,80,100,200','100,80,145,100','100,80,45,100','100,200,45,300','100,200,145,300') try: sj = men[int(err)-1] sj = sj.split(',') canvas.create_line(sj,width=4) except: pass if err == 6: # если ошибок 6 canvas.create_oval(79,59,120,80, width=4, fill="white") end() poraj =+1 canvas.delete(dl2) canvas.create_text(170,550, text=poraj, fill="purple", font=("Helvectica", "18")) root.update() btn = {} def gen(u,x,y): # генерация букв-алфавита btn[u] = Button(root , text = u, width=3, height=1, command = lambda: a(u)) btn[u].place(x=str(x),y=str(y)) x = 265 y = 110 for i in alfabet[0:8]: gen(i,x,y) x=x+33 x = 265 y=137 for i in alfabet[8:16]: gen(i,x,y) x=x+33 x = 265 y=164 for i in alfabet[16:24]: gen(i,x,y) x=x+33 x = 265 y=191 for i in alfabet[24:33]: gen(i,x,y) x=x+33 def end(): canvas.create_text(150,150, text="The end", fill="purple", font=("Helvectica", "16")) canvas.create_line(100,10,100,60,width=4) for i in alfabet: btn[i]['state'] = 'disabled' return pobed, poraj btn01 = Button(root , text = 'Start', width=3, height=1, command = arr) btn01.place(x=298,y=542) btn01["bg"] = "red" root.mainloop()
Отредактировано Kasta_neda (Авг. 30, 2014 20:10:23)
Офлайн