Найти - Пользователи
Полная версия: 11 класс, игра "Настольный теннис". Получился слишком громоздкий код
Начало » Центр помощи » 11 класс, игра "Настольный теннис". Получился слишком громоздкий код
1
LeraA
Доброго времени суток, программисты! Пожалуйста, помогите сократить и улучшить код. Заранее большое вам спасибо!
Задание: 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()
FishHook
НЕ СПАМЬ!!!
FishHook
Все возможные “детские” ошибки присутствуют
1. Магические числа
2. Несоответствие PEP8
3. Многократно повторяющиеся куски кода
4. Ничего не значащие имена переменных
5. Смешение стилей (если уж начал писать объектно-ориентированную программу, то делай это до конца)
6. “Плохой” импорт
4kpt_III
Ну и добавлю от себя. ООП в GUI используется не так.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB