Форум сайта python.su
Доброго времени суток, программисты! Пожалуйста, помогите сократить и улучшить код. Заранее большое вам спасибо!
Задание: http://f-picture.net/lfp/s005.radikal.ru/i209/1505/4c/89c1e82dad31.jpg/htm
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()
Офлайн
НЕ СПАМЬ!!!
Офлайн
Все возможные “детские” ошибки присутствуют
1. Магические числа
2. Несоответствие PEP8
3. Многократно повторяющиеся куски кода
4. Ничего не значащие имена переменных
5. Смешение стилей (если уж начал писать объектно-ориентированную программу, то делай это до конца)
6. “Плохой” импорт
Офлайн
Ну и добавлю от себя. ООП в GUI используется не так.
Офлайн