Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 18, 2014 23:06:18

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Небольшая игра

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)

Офлайн

#2 Авг. 19, 2014 22:18:40

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Небольшая игра

Особо не тестировал, но есть моменты где код можно упростить и сократить

#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)

Прикреплённый файлы:
attachment Ersv6a4U5ZQ.jpg (100,2 KБ)

Офлайн

#3 Авг. 30, 2014 00:32:31

AZJIO
Зарегистрирован: 2014-08-27
Сообщения: 53
Репутация: +  -5  -
Профиль   Отправить e-mail  

Небольшая игра

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
К примеру b2 равно 2. Зачем тогда проверять остальные условия? Здесь надо использовать elif

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()
Фактически при каждой проверке вычисляется одно и тоже выражение len(er). Правильнее вычислять 1 раз в переменную и использовать еёв качестве сравниваемой величины.



_________________________________________
Python_Examples.7z

Офлайн

#4 Авг. 30, 2014 12:08:40

vrabey
От: Киев
Зарегистрирован: 2013-04-17
Сообщения: 209
Репутация: +  23  -
Профиль   Отправить e-mail  

Небольшая игра

Kasta_neda

в программе помоему есть неверное архитектурное решение -
при запуске хавает 8mb
но сыграй я например 100 раз будет уже 80mb
проверял
в наше времени памяти хоть отбавляй - но здесь явно не верный подход
новое окно создается а старое не уничтожается
нажимая на красную кнопку каждый раз создаётся новое окно.
зачем?
если надо нарисовать только слово и виселицу

Отредактировано vrabey (Авг. 30, 2014 12:13:42)

Офлайн

#5 Авг. 30, 2014 15:09:17

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Небольшая игра

AZJIO
Тут вообще ни if ни elif не нужен

Офлайн

#6 Авг. 30, 2014 16:24:20

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Небольшая игра

4kpt_II
Тут вообще ни if ни elif не нужен

Раскрою:

functions = [head, body,  left_hand,  right_hand, left_foot, right_foot]
functions[key-1]()

Отредактировано Alen (Авг. 30, 2014 16:34:59)

Офлайн

#7 Авг. 30, 2014 16:33:09

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Небольшая игра

Alen
Ага. Только одной строкой краше

functions = [head, body,  left_hand,  right_hand, left_foot, right_foot][key+1]()

P.S. Но мне больше нравится словарь. Так как 1, 2, 3 это крайняя редкость. Из евента беру имя виджета и уже связываю callback функцию.

Отредактировано 4kpt_II (Авг. 30, 2014 16:34:05)

Офлайн

#8 Авг. 30, 2014 16:38:20

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Небольшая игра

4kpt_II
P.S. Но мне больше нравится словарь. Так как 1, 2, 3 это крайняя редкость. Из евента беру имя виджета и уже связываю callback функцию.

Я уже начал написать словарь, но понял, что можно проще. Ну и функции все эти можно выкинуть оставить одну.

Офлайн

#9 Авг. 30, 2014 16:44:27

4kpt_II
От: Харьков
Зарегистрирован: 2013-10-24
Сообщения: 999
Репутация: +  58  -
Профиль   Отправить e-mail  

Небольшая игра

Alen
Ну и функции все эти можно выкинуть оставить одну.

Да. Или евент или лямбда.

Офлайн

#10 Авг. 30, 2014 18:37:52

Kasta_neda
Зарегистрирован: 2014-06-08
Сообщения: 210
Репутация: +  6  -
Профиль   Отправить e-mail  

Небольшая игра

Пока убрал 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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version