Форум сайта python.su
0
В наличии замкнутая функция (появление шаров на игровом экране) она работает в паре с функцией щелчка мыши(идет подсчет попаданий, промахов, упущеных шаров) требуется добавить окончание игры по времени, по очкам или по количеству выстрелов. Не получается вставить цикл в функции, прога продолжает кидать шары (т.к. функция закольцована) Если разомкнуть функцию появления шара а в функцию клика добавить условия, то шар появляется только по клику. В общем Help me 3 дня не могу выход найти.
from tkinter import *
from random import randrange as rnd, choice
import time
root = Tk()
root.geometry('800x600')
root.title("Поймай шарик!")
canv = Canvas(root,width=800,height=550,bg='lightblue')
canv.pack()
colors = ['lightyellow','lightgray','gray','pink','violet','brown','red','orange','yellow','green','cyan','blue','magenta','black','gray','lightgreen']
x = 0
y = 0
r = 0
points =0
miss = 0
zero = 0
def new_ball():
global x, y, r, zero, res
canv.delete(ALL)
res = canv.create_text(300,20,text="заработал " + str(points)+ " очков"
+'/'+"промазал "+str(miss)+" раз"+'/'+
"проворонил "+str(zero)+" шаров", font = 'Arial 15')
x = rnd(100,700)
y = rnd(100,500)
r = rnd(20,50)
target = canv.create_oval(x-r,y-r,x+r,y+r,fill = choice(colors), width=0)
root.after(rnd(500, 3000),new_ball)
zero+=1
def click(event):
global points, miss, zero, res
if abs(x-event.x) < r/2 and abs(y-event.y)<r/2:
points += 2
zero-=1
elif abs(x-event.x) < r and abs(y-event.y)<r:
points += 1
zero-=1
else:
miss += 1
canv.delete(ALL)
res = canv.create_text(300,20,text="заработал " + str(points)+ " очков"
+'/'+"промазал "+str(miss)+"раз "+'/'+
"проворонил "+str(zero)+" шаров", font = 'Arial 15')
root.after(1000,new_ball)
canv.bind('<Button-1>',click)
mainloop()
Офлайн
568
А что такое есть “замкнутая функция”?
Офлайн
0
Да сам ее так обозвал, она сама себя запускает, получается бесконечное воспроизводство, но не цикл, смотри код. Все ребята разобрался. Игра закончится по набору 20 баллов.
from tkinter import *
from random import randrange as rnd, choice
import time
root = Tk()
root.geometry('800x600')
root.title("Поймай шарик!")
canv = Canvas(root,width=800,height=550,bg='lightblue')
canv.pack()
colors = ['lightyellow','lightgray','gray','pink','violet','brown','red','orange','yellow','green','cyan','blue','magenta','black','gray','lightgreen']
x = 0
y = 0
r = 0
points = 0
miss = 0
zero = 0
def new_ball():
global x, y, r, zero, res, points
canv.delete(ALL)
res = canv.create_text(300,20,text="заработал " + str(points)+ " очков"
+'/'+"промазал "+str(miss)+" раз"+'/'+
"проворонил "+str(zero)+" шаров", font = 'Arial 15')
x = rnd(100,700)
y = rnd(100,500)
r = rnd(20,50)
target = canv.create_oval(x-r,y-r,x+r,y+r,fill = choice(colors), width=2)
if points < 20:
root.after(rnd(500, 3000),new_ball)
else:
canv.delete(ALL)
res = canv.create_text(350,250,text="Вы выйграли! Вы наколотили: " +
str(points)+ " балла(ов)", font = 'Arial 25')
zero+=1
def click(event):
global points, miss, zero, res, xz
if abs(x-event.x) < r/2 and abs(y-event.y)<r/2:
points += 2
zero-=1
elif abs(x-event.x) < r and abs(y-event.y)<r:
points += 1
zero-=1
else:
miss += 1
canv.delete(ALL)
res = canv.create_text(300,20,text="заработал " + str(points)+ " очков"
+'/'+"промазал "+str(miss)+" раз"+'/'+
"проворонил "+str(zero)+" шаров", font = 'Arial 15')
root.after(1000,new_ball)
canv.bind('<Button-1>',click)
mainloop()
Офлайн
0
Просто надо было добавить условие разрыва функции и сделать доступ к этой глобальной переменной из функции
Офлайн
221
Poputchik77
уау, вы открыли для себя рекурсию. Сколько еще открытий чудных…
Успехов в обучении!
Офлайн
221
Poputchik77
ах да, что бы еще больше васс просвятить почитайте что такое замыкание
Офлайн
0
Спасиб
Офлайн
0
Poputchik77Если кликать по одному шарику незколько раз то колво-очков увеличивается
Да сам ее так обозвал, она сама себя запускает, получается бесконечное воспроизводство, но не цикл, смотри код. Все ребята разобрался. Игра закончится по набору 20 баллов.
Отредактировано Manu_Vilks.Py (Авг. 31, 2015 11:30:41)
Офлайн