Игра «Пинг-понг» на python

Самый простой вариант, без изысков, с использованием global

from tkinter import *
from random import randrange as rnd
import time
root = Tk()
root.geometry('600x800')
canv = Canvas(root, bg = '#0044aa')
canv.pack(fill=BOTH,expand = 1)

class ball():
    def __init__(self):
        self.x = 0
        self.y = 0
        self.r = 10
        self.vx = 0
        self.vy = 0
        self.goal = 0
        self.id= canv.create_oval(self.x-self.r,self.y-self.r,self.x+self.r,self.y+self.r, fill = 'white')
        
    def move(self):
        self.x += self.vx
        self.y += self.vy
        active_wall = list(set(canv.find_withtag('wall')) & set(canv.find_overlapping(self.x - self.r*0.7,self.y - self.r*0.7,self.x + self.r*0.7,self.y + self.r*0.7)))
        if active_wall:
            if 'x' in canv.gettags(active_wall[0]):
                self.vx = -self.vx
            if 'y' in canv.gettags(active_wall[0]):
                self.vy = -self.vy
                x1,y1,x2,y2 = canv.coords(active_wall[0])
                xc = (x1+x2)/2
                w = abs(x1-x2)
                self.vx += (self.x-xc)/w*10
        self.paint()
        lines = canv.find_overlapping(self.x - self.r*0.7,self.y - self.r*0.7,self.x + self.r*0.7,self.y + self.r*0.7)
        if len(lines) > 1:
            if "g1" in canv.gettags(lines[1]):
                self.goal = 1
                self.kill()
            if "g2" in canv.gettags(lines[1]):
                self.goal = 2
                self.kill()
    def kill(self):
        global game
        game = 0
        self.x = 300
        self.vx = 0
        if self.goal == 2:
            self.vy = -8
            self.y = 100
        if self.goal == 1:
            self.y = 700
            self.vy = 8
        self.paint()
    
    def paint(self):
        canv.coords(self.id, self.x-self.r,self.y-self.r,self.x+self.r,self.y+self.r)
        
class gamer():
    def __init__(self):
        self.x = 0
        self.y = 0
        self.w = 60
        self.v = 3
        self.d = 4
        self.mode = ''
        self.score = 0
        self.xy_score = (0,0)
        self.id= canv.create_rectangle(self.x-self.w,self.y-self.d,self.x+self.w,self.y+self.d, fill = 'white', tags = ('wall','y'))
        self.id_score = canv.create_text(0,0,text = '', font = 'Tahoma 24', fill = 'white')
        
    def paint(self):
        canv.coords(self.id, self.x-self.w,self.y-self.d,self.x+self.w,self.y+self.d)
        canv.coords(self.id_score, self.xy_score[0],self.xy_score[1])
        canv.itemconfig(self.id_score, text = self.score)

    def move(self):
        if self.mode == 'left' and self.x > self.w//2:
            self.x -= self.v
        elif self.mode == 'right' and self.x < (590-self.w//2):
            self.x += self.v
        self.paint()

b = ball()
b.x = 100
b.y = 100
b.vx = 4
b.vy = 4

        
canv.create_line(10,10,10,790,width = 10, fill = 'white', tags = ('wall','x'))
canv.create_line(590,10,590,790,width = 10, fill = 'white', tags = ('wall','x'))
canv.create_line(10,790/2,590,790/2,width = 2, fill = 'white')

canv.create_line(10,11,590,11,width = 2, fill = 'white', tag = 'g1')
canv.create_line(10,789,590,789,width = 2, fill = 'white', tag = 'g2')


g1 = gamer()
g1.x = 300
g1.y = 20
g1.paint()
g1.xy_score = (30,50)

g2 = gamer()
g2.x = 300
g2.y = 780
g2.paint()
g2.xy_score = (30,450)
game =  1
def key_press(event):
    global game
    if event.keycode == 37:
        g2.mode = 'left'
    elif event.keycode == 39:
        g2.mode = 'right'

    elif event.keycode == 65:
        g1.mode = 'left'
    elif event.keycode == 68:
        g1.mode = 'right'
        
    elif event.keycode == 32:
        game = 1

def key_release(event):
    if event.keycode == 37 or event.keycode == 39:
        g2.mode = ''

    elif event.keycode == 65 or event.keycode == 68:
        g1.mode = ''

root.bind('<Key>', key_press)
root.bind('<KeyRelease>', key_release)

while 1:
    if game:
        b.move()
    g2.move()
    g1.move()
    if b.goal == 1:
        g2.score += 1
        b.goal = 0
    elif b.goal == 2:
        g1.score += 1
        b.goal = 0
    time.sleep(0.02)
    canv.update()    
    

mainloop()

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *