Форум сайта python.su
Kasta_neda
Общая критика игры:
1. Правило игры можно сделать кнопкой в главном окне. Если я знаю правила, то меня напрягает закрывать окно при каждом запуске, а если подзаюыл, то заставляетм меня перезапускать игру, чтобы подсмотреть правила.
2. Угадываемые слова не должны быть жёстко заданы в коде. Например сделать ввиде окна для ввода списка слов и сохранение их в шифрованном виде в файл. А программа при запуске проверяет наличие файла и при успешности загружает из него.
3. Кнопки-буквы друг на друге налеплены.
4. Цвета везде яркие, клетки не квадратные.
Офлайн
кнопки-буквы налеплены? в каком смысле? может координаты на разных мониторах смещаются?
Офлайн
4kpt_IIНу сама конструкция if, elif тоже должны быть правильные. Конечно можно всю программу переписать красивее и компактнее, но для текущих использованных конструкций они не совершенны.
AZJIO
Тут вообще ни if ни elif не нужен
Kasta_neda
кнопки-буквы налеплены? в каком смысле? может координаты на разных мониторах смещаются?
btn[u] = Button(root , text = u, width=3, height=1, command = lambda: a(u))
x = 265 y = 110 z = 0 for i in alfabet[0:33]: if z == 8 or z == 16 or z == 24: y += 27 x = 265 gen(i,x,y) z+=1 x+=33
Отредактировано AZJIO (Авг. 31, 2014 15:09:10)
Офлайн
за это спасибо, поначалу ломал голову, как сократить красиво
x = 265 y = 110 z = 0 for i in alfabet[0:33]: if ((z == 8) or (z == 16) or (z == 24)): y += 27 x = 265 gen(i,x,y) z+=1 x+=33
Офлайн
Сейчас две проблемы, счетчик и перерисовка всего в главном окне, но основное перерисовка при перезапуске игры, тогда думаю и счетчик можно прикрутить
#coding: utf-8 from Tkinter import * import random faq = ''' Принцип игры Андроид загадывает слово — пишет на бумаге первую и последнюю букву слова и отмечает места для остальных букв, например чертами . Также рисуется виселица. Игрок предлагает букву, которая может входить в это слово.Если такая буква есть в слове, то Андроид пишет её над соответствующими этой букве чертами — столько раз, сколько она встречается в слове.Если такой буквы нет, то к виселице добавляется круг в петле,изображающий голову.Игрок продолжает отгадывать буквы до тех пор,пока не отгадает всё слово.За каждый неправильный ответ Андроид добавляет одну часть туловища к виселице(их 6: голова, туловище, 2 руки и 2 ноги).Если туловище в виселице нарисовано полностью, то отгадывающий игрок проигрывает, считается повешенным. Если игроку удаётся угадать слово, он выигрывает. ''' slova = [u'виселица',u'смартфон',u'маргарин',u'мегагерц',u'страница',u'креветка',u'микрофон',u'квартира',u'скорость',u'художник',u'жидкость',u'карантин',u'интернет',u'документ',u'мембрана',u'радиация',u'мавзолей',u'терминал',u'водитель'] pobed = 0 poraj = 0 def mainWindow1(*w,**kw): 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 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 z = 0 for i in alfabet[0:33]: if ((z == 8) or (z == 16) or (z == 24)): y += 27 x = 265 gen(i,x,y) z+=1 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 def butCallback(): mainWindow2() but1 = Button(root, text = "-> Help", command = butCallback ) but1.pack() btn01 = Button(root , text = 'Start', width=3, height=1, command = arr) btn01.place(x=298,y=542) btn01["bg"] = "red" root.mainloop() def mainWindow2(*w,**kw): root = Tk() root.title('Help') canvas = Canvas(root, width=600, height=600) canvas.pack(fill=BOTH) canvas.create_text(310,240, text=faq, fill="purple", font=("Helvectica", "14")) def butCallback(): root.destroy() but1 = Button(root, text ="-> Game", command = butCallback ) but1.pack() root.mainloop() if __name__ == '__main__': mainWindow1()
Офлайн
Цвет клеток #B0D0FF (сетки)
Цвет кнопки
btn01 = Button(root , text = 'Играть сначала', width=11, height=1, command = arr, bg="#FFD0A0", fg="#000077")
Отредактировано AZJIO (Авг. 31, 2014 15:38:07)
Офлайн
#coding: utf-8 from Tkinter import * import random faq = ''' Принцип игры Андроид загадывает слово — пишет на бумаге первую и последнюю букву слова и отмечает места для остальных букв, например чертами . Также рисуется виселица. Игрок предлагает букву, которая может входить в это слово.Если такая буква есть в слове, то Андроид пишет её над соответствующими этой букве чертами — столько раз, сколько она встречается в слове.Если такой буквы нет, то к виселице добавляется круг в петле,изображающий голову.Игрок продолжает отгадывать буквы до тех пор,пока не отгадает всё слово.За каждый неправильный ответ Андроид добавляет одну часть туловища к виселице(их 6: голова, туловище, 2 руки и 2 ноги).Если туловище в виселице нарисовано полностью, то отгадывающий игрок проигрывает, считается повешенным. Если игроку удаётся угадать слово, он выигрывает. ''' slova = [u'виселица',u'смартфон',u'маргарин',u'мегагерц',u'страница',u'креветка',u'микрофон',u'квартира',u'скорость',u'художник',u'жидкость',u'карантин',u'интернет',u'документ',u'мембрана',u'радиация',u'мавзолей',u'терминал',u'водитель'] pobed = 0 poraj = 0 def mainWindow1(*w,**kw): 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="#B0D0FF", outline="blue") x=x+33 y = y + 27 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'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' er = [] # ошибки win = [] # угаданные слова 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) 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 z = 0 for i in alfabet[0:33]: if ((z == 8) or (z == 16) or (z == 24)): y += 27 x = 265 gen(i,x,y) z+=1 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 def butCallback(): mainWindow2() but1 = Button(root, text = "Правила игры", command = butCallback ) but1.pack() btn01 = Button(root , text = 'Играть', width=7, height=1, command = arr, bg="#FFD0A0", fg="#000077") btn01.place(x=298,y=542) btn01["bg"] = "red" x0 = 10 y0 = 50 x1 = 60 y1 = 100 i = 0 deltax = 2 deltay = 3 which = canvas.create_oval(x0,y0,x1,y1,fill="red", tag='redBall') while 1: canvas.move('redBall', deltax, deltay) canvas.after(20) canvas.update() if x1 >= 600: deltax = -2 if x0 < 0: deltax = 2 if y1 > 600: deltay = -3 if y0 < 0: deltay = 3 x0 += deltax x1 += deltax y0 += deltay y1 += deltay root.mainloop() def mainWindow2(*w,**kw): root = Tk() root.title('Help') canvas = Canvas(root, width=600, height=600) canvas.pack(fill=BOTH) canvas.create_text(310,240, text=faq, fill="purple", font=("Helvectica", "14")) def butCallback(): root.destroy() but1 = Button(root, text ="Закрыть", command = butCallback ) but1.pack() root.mainloop() if __name__ == '__main__': mainWindow1()
Офлайн
Не получается передать из одной функции в другую (arr >> a), переменные, побед-поражений, пришлось файл статистики по несколько раз считывать, подскажите варианты
файл foo.txt
0 0
#coding: utf-8 from Tkinter import * import random faq = ''' Принцип игры Андроид загадывает слово — пишет на бумаге первую и последнюю букву слова и отмечает места для остальных букв, например чертами . Также рисуется виселица. Игрок предлагает букву, которая может входить в это слово.Если такая буква есть в слове, то Андроид пишет её над соответствующими этой букве чертами — столько раз, сколько она встречается в слове.Если такой буквы нет, то к виселице добавляется круг в петле,изображающий голову.Игрок продолжает отгадывать буквы до тех пор,пока не отгадает всё слово.За каждый неправильный ответ Андроид добавляет одну часть туловища к виселице(их 6: голова, туловище, 2 руки и 2 ноги).Если туловище в виселице нарисовано полностью, то отгадывающий игрок проигрывает, считается повешенным. Если игроку удаётся угадать слово, он выигрывает. ''' slova = [u'виселица',u'смартфон',u'маргарин',u'мегагерц',u'страница',u'креветка',u'микрофон',u'квартира',u'скорость',u'художник',u'жидкость',u'карантин',u'интернет',u'документ',u'мембрана',u'радиация',u'мавзолей',u'терминал',u'водитель'] w = None p = None def mainWindow1(*w,**kw): 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="#B0D0FF", outline="blue") x=x+33 y = y + 27 def arr(): #основная функция f = open('foo.txt', 'r') data = f.readlines() f.close pobed = data[0] poraj = data[1] print pobed,poraj 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'абвгдеёжзийклмнопрстуфхцчшщъыьэюя' er = [] # ошибки win = [] # угаданные слова 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) 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 delete(): #canvas.delete(dl) #canvas.delete(dl2) dat = '%s\n' % '0' data = '%s\n' % '0' f = open('foo.txt', 'w') f.writelines(dat) f.writelines(data) f.close dl = canvas.create_text(120,500, text = '0', fill="purple", font=("Helvectica", "18")) dl2 = canvas.create_text(170,550, text = '0', fill="purple", font=("Helvectica", "18")) btn02 = Button(root , text = 'Очистить', width=7, height=1, command = delete, bg="#FFD0A0", fg="#000077") btn02.place(x=50,y=570) btn02["bg"] = "red" 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] btn[key]['state'] = 'disabled' 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")) f = open('foo.txt', 'r') data = f.readlines() f.close pobed = int(data[0]) + 1 f = open('foo.txt', 'r') data = f.readlines() data[0] = '%s\n' % str(pobed) f.close f = open('foo.txt', 'w') f.writelines(data) f.close 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") 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' f = open('foo.txt', 'r') data = f.readlines() f.close poraj = int(data[1]) + 1 f = open('foo.txt', 'r') data = f.readlines() data[1] = '%s\n' % str(poraj) f.close f = open('foo.txt', 'w') f.writelines(data) f.close 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 z = 0 for i in alfabet[0:33]: if ((z == 8) or (z == 16) or (z == 24)): y += 27 x = 265 gen(i,x,y) z+=1 x+=33 def butCallback(): mainWindow2() but1 = Button(root, text = "Правила игры", command = butCallback ) but1.pack() btn01 = Button(root , text = 'Играть', width=7, height=1, command = arr, bg="#FFD0A0", fg="#000077") btn01.place(x=275,y=542) btn01["bg"] = "red" x0 = 10 y0 = 50 x1 = 60 y1 = 100 i = 0 deltax = 2 deltay = 3 which = canvas.create_oval(x0,y0,x1,y1,fill="red", tag='redBall') while 1: canvas.move('redBall', deltax, deltay) canvas.after(20) canvas.update() if x1 >= 600: deltax = -2 if x0 < 0: deltax = 2 if y1 > 600: deltay = -3 if y0 < 0: deltay = 3 x0 += deltax x1 += deltax y0 += deltay y1 += deltay root.mainloop() def mainWindow2(*w,**kw): root = Tk() root.title('Help') canvas = Canvas(root, width=600, height=600) canvas.pack(fill=BOTH) canvas.create_text(310,240, text=faq, fill="purple", font=("Helvectica", "14")) def butCallback(): root.destroy() but1 = Button(root, text ="Закрыть", command = butCallback ) but1.pack() root.mainloop() if __name__ == '__main__': mainWindow1()
Отредактировано Kasta_neda (Сен. 6, 2014 09:14:37)
Офлайн
почему бы не написать примерно так:
def skeleton(): pass def secret_word(): pass def grid(): pass def gallows(): pass def alphabet(): pass def start_but(): pass #------------------------ # нарисовать главное окно # нарисовать сетку # нарисовать виселицу # нарисовать алфавит # итд. # #
def f(): var = a + 1 return var a = 0 print a a = f() print a
Офлайн
vrabeyда, счетчик вызовов функции, я думал применить, но скорее всего вы правы, надо полностью переделать программу
а по вопросу как то так можно:
Офлайн