Теперь два «игрока», два попадания для уничтожения.
from random import randrange as rnd, choice
from tkinter import *
import time, math
from PIL import Image, ImageTk
root = Tk()
fr = Frame(root)
root.geometry('800x600')
bt = Button(root,width= 8, text = 'new')
bt.pack()
image = Image.open("3.jpg")
photo = ImageTk.PhotoImage(image)
canv = Canvas(root, bg = 'white')
canv.pack(fill=BOTH,expand=1)
class new_gamer():
def __init__(self,x = 400, y = 300):
self.x = x
self.y = y
r = self.r = 20
self.live = 100
self.id = canv.create_oval(x - r, y - r, x + r, y + r, fill = 'blue', width=5)
def shot(self,target):
tx = target.x
ty = target.y
s = canv.create_line(self.x,self.y,tx,ty,fill = 'orange', width = 4)
canv.update()
time.sleep(0.04)
target.hit()
canv.delete(s)
canv.update()
def hit(self):
global gamers
self.live -= 50
if self.live <= 0:
gamers.pop(gamers.index(self))
canv.itemconfig(self.id, fill = 'red')
def find_target(self,targets):
spiders = targets
if spiders:
target = spiders[0]
td = math.sqrt(((target.x-self.x)**2+(target.y-self.y)**2))
for spider in spiders:
d = math.sqrt((spider.x-self.x)**2+(spider.y-self.y)**2)
if d < (self.r + target.r):
self.hit()
if td > d:
target = spider
td = d
return target
class new_spider():
def __init__(self, x = 0, y = 0, r = 20, color = 'red'):
self.x = x
self.y = y
self.r = r
self.v = 8
self.angle = 0
self.color = color
self.id = canv.create_oval(self.x-self.r,self.y -self.r, self.x + self.r, self.y + self.r, fill = color)
self.mode = 'on'
def hit(self):
global spiders
if self.r > 10:
canv.delete(self.id)
spiders.pop(spiders.index(self))
x = int(self.x)
y = int(self.y)
r = 5
spiders += [new_spider(x-3*r,y-3*r,r, 'gray')]
spiders += [new_spider(x+3*r,y+3*r,r, 'gray')]
for sp in spiders[-4:]:
sp.v = 1
else:
canv.delete(self.id)
spiders.pop(spiders.index(self))
def find_target(self,targets):
spiders = targets
if spiders:
target = spiders[0]
td = math.sqrt(((target.x-self.x)**2+(target.y-self.y)**2))
for spider in spiders:
d = math.sqrt((spider.x-self.x)**2+(spider.y-self.y)**2)
if d < (self.r + target.r):
self.live = 0
if td > d:
target = spider
td = d
return target
def move(self,x=0,y=0):
if not x and not y:
target = self.find_target(gamers)
if target:
x,y = target.x,target.y
self.angle = math.atan2((self.y-y),(self.x-x))
self.x -= self.v*(math.cos(self.angle))
self.y -= self.v*(math.sin(self.angle))
canv.coords(self.id,self.x-self.r,self.y -self.r, self.x + self.r, self.y + self.r)
colors = ['red','blue','green']
def new(event=0):
global spiders, gamers
spiders = []
canv.delete(ALL)
for xx in range(0,800,144):
for yy in range(0,600,144):
canv.create_image(xx,yy, anchor=NW, image=photo)
class t():
pass
t.x = 100
t.y = 100
add_spiders(t)
t.x = 400
t.y = 100
add_spiders(t)
t.x = 700
t.y = 100
add_spiders(t)
t.x = 700
t.y = 500
add_spiders(t)
t.x = 100
t.y = 500
add_spiders(t)
gamers = [new_gamer(600,300),new_gamer(200,300)]
sleep = 0.04
def task(event):
global gamers
while gamers and spiders:
for spider in spiders:
spider.move()
for gamer in gamers:
target = gamer.find_target(spiders)
if target:
gamer.shot(target)
canv.update()
time.sleep(sleep)
def add_spiders(event):
global spiders
x = int(event.x)
y = int(event.y)
r = 100
for z in range(5):
spiders += [new_spider(rnd(x-r,x+r),rnd(y-r,y),15, choice(colors))]
bt.bind('<Button-1>',new)
canv.bind('<Button-3>',task)
canv.bind('<Button-1>',add_spiders)
new()
mainloop()
