Python 试图使球对象从桨上反弹

Python 试图使球对象从桨上反弹,python,tkinter,Python,Tkinter,我是python新手,正在为我的python简介类做最后一个项目。我已经完成了大部分的桨式球类游戏,但不知道如何让球从我的桨式球类物体上弹起 我已经研究了Stackoverflow一段时间,花了几个小时试图自己解决它,但没有任何成功。如果有人有任何想法,我真的需要帮助 如果有什么我需要更好地解释,以便您更好地理解,请发表评论 GUI文件: 导入tkinter、random、particle和helpers 从tkinter进口* 从球进口* 从桨进口* 不定期进口* 划桨类: 定义初始化(自,窗

我是python新手,正在为我的python简介类做最后一个项目。我已经完成了大部分的桨式球类游戏,但不知道如何让球从我的桨式球类物体上弹起

我已经研究了Stackoverflow一段时间,花了几个小时试图自己解决它,但没有任何成功。如果有人有任何想法,我真的需要帮助

如果有什么我需要更好地解释,以便您更好地理解,请发表评论

GUI文件:
导入tkinter、random、particle和helpers
从tkinter进口*
从球进口*
从桨进口*
不定期进口*
划桨类:
定义初始化(自,窗口):
“构建桨球图形用户界面”
self.window=window
self.window.protocol('WM\u DELETE\u window',self.safe\u exit)
自宽=700
自身高度=900
self.canvas=canvas(self.window,bg='black',width=self.width,height=self.height,highlightthickness=0)
self.canvas.bind_all(“,self.move_left”)
self.canvas.bind_all(“,self.move_right”)
self.canvas.pack()
#创建指示说明的标签
说明=标签(窗口,text=“控件:左右箭头键”)
说明.包装(侧面=底部,展开=是)
#创建一个按钮以清除球
重新启动按钮=按钮(窗口,text=“Play”,command=self.reset)
重新启动按钮包(侧面=底部,展开=是)
self.ball=ball(350350)
self.paile=桨(300850400860,0,0)
self.terminated=False
self.render()
def ballobject(自):
self.ball=ball(350350)
self.paile=桨(300850400860,0,0)
self.render()
def重置(自):
self.terminated=True
def安全出口(自):
''关闭GUI之前关闭事件循环''
self.terminated=True
self.window.destroy()
#渲染一切
def渲染(自):
#当程序未终止时
如果不是自终止的:
#擦除画布
self.canvas.delete(全部)
#移动球
self.ball.move(self.canvas,self.pable)
#渲染球
self.ball.render(self.canvas)
#渲染桨
self.palle.render(self.canvas)
#使用distance()检测球和桨之间的碰撞。
''球反弹(自我)''
#设置粒子运动的动画
self.canvas.after(10,self.render)
其他:
#擦除画布
self.canvas.delete(全部)
self.terminated=False
self.canvas.after(50,self.ballobject)
def向左移动(自身,事件):
自我。划桨。向左移动(事件)
def向右移动(自身、事件):
自我。划桨。向右移动(事件)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
root.option_add('*font',('Verdana',12',粗体斜体')#位于http://effbot.org/tkinterbook/tkinter-widget-styling.htm
根目录。可调整大小(0,0)#位于https://mail.python.org/pipermail/tutor/2001-September/008504.html
root.title(‘桨球’)
root.wm_属性(“-topmest”,-1)
app=浆球(根)
root.mainloop()
球类文件:
班级舞会:
'''
Ball为可以渲染到画布的单个球建模
'''
定义初始(self,x,y,半径=15,):
'''
建造师
'''
自我。x=x
自我。_y=y
自身水平=randint(-10,10)
self.\u velY=randint(-10,-5)
自半径=半径
自身颜色=‘白色’
自我测试。_tx=350
自整度=400
self.\u t=“”
self.\u tfill=“红色”
self._t字体=(“Arial”,35,“粗体-斜体”)
#此方法渲染球
def渲染(自我,画布):
画布。创建椭圆(self.\ux-self.\u半径,self.\u y-self.\u半径,self.\ux+self.\u半径,self.\u y+self.\u半径,填充=self.\u颜色)
canvas.create_text(self.\u tx,self.\u ty,text=self.\u t,fill=self.\u tfill,font=self.\u tfont)
#这种方法可以移动球
def移动(自身、画布、桨):
#更新位置
self._x+=self._velX
自我。_y+=自我
#如果球击中任何一面墙,则速度为负
如果(self.\u x+self.\u radius>canvas.winfo_reqwidth()和self.\u velX>0)或(self.\u x-self.\u radius<0和self.\u velX<0):
self.\u velX=-self.\u velX
如果(自整角+自整角半径<0且自整角<0):
self.\u velY=-self.\u velY
如果(self.\u y+self.\u radius>canvas.winfo\u reqheight()和self.\u velY>0):
自我评价=0
自身水平=0
self.\u t=“游戏结束!\n单击播放按钮再次播放。”
#*****这就是我遇到的问题******
#确定球是否击中球拍
如果((自×自×自×自×自×半径>桨叶、自×自×和自×水平>0)或(自×自×自×自×半径<桨叶、自×自×半径<桨叶、自×半径<桨叶、自×半径<桨叶、自×水平>0)和(自×自):
self.\u velX=-self.\u velX
桨类文件:
#导入数学和帮助程序
从tkinter进口*
输入数学
从gui导入*
班级桨:
定义初始值(self,x,y,x2,y2,velX,velY):
'''
建造师
'''
自我。x=x
自我。_y=y
自身._x2=x2
自身._y2=y2
self._velX=velX
自已的
自身颜色=‘白色’
def getpadx(自身):
返回自我
def getpady(自我):
回归自我
def getpadx1(自身):
返回自我
def getpady2(自身):
返回自我
#此方法渲染桨
def渲染(自我,画布):
画布。创建矩形(self.\ux,self.\uy,self.\ux2,self.\uy2,fill=self.\ucolor)
#此方法移动桨
def移动(自我,画布):
#更新位置
Import tkinter, random, particle, and helpers
from tkinter import *
from ball import *
from paddle import *
from time import *

class PaddleBall:    
    def __init__(self, window):
        ''' Construct the paddle ball GUI '''
        self.window = window
        self.window.protocol('WM_DELETE_WINDOW', self.safe_exit)
        self.width = 700
        self.height = 900
        self.canvas = Canvas(self.window, bg='black', width=self.width, height=self.height, highlightthickness=0)
        self.canvas.bind_all("<KeyPress-Left>", self.move_left)
        self.canvas.bind_all("<KeyPress-Right>", self.move_right)

        self.canvas.pack()

        # Create a label to indicate instructions
        instructions = Label(window, text="Controls: Left & Right Arrow Keys")
        instructions.pack(side=BOTTOM, expand=YES) 

        # Create a button to clear Ball  
        restart_button = Button(window, text="Play", command=self.reset)
        restart_button.pack(side=BOTTOM, expand=YES)

        self.ball = Ball(350, 350)
        self.paddle = Paddle(300, 850, 400, 860, 0, 0)
        self.terminated = False
        self.render()

    def ballobject(self):
        self.ball = Ball(350, 350)
        self.paddle = Paddle(300, 850, 400, 860, 0, 0)
        self.render()

    def reset(self):
        self.terminated = True

    def safe_exit(self):
        ''' Turn off the event loop before closing the GUI '''
        self.terminated = True
        self.window.destroy()

    # Render everything    
    def render(self):
        # While program is not terminated
        if not self.terminated:
            # Erase Canvas
            self.canvas.delete(ALL)

            # Move ball
            self.ball.move(self.canvas, self.paddle)   

            # Render ball
            self.ball.render(self.canvas)    

            # Render paddle
            self.paddle.render(self.canvas)  

            # use distance() to detect collision between ball and paddle.
            '''Ball.bounce(self)'''

            # Animate the particles movement
            self.canvas.after(10, self.render)

        else: 
            # Erase Canvas
            self.canvas.delete(ALL)

            self.terminated = False

            self.canvas.after(50, self.ballobject)


    def move_left(self, event):
        self.paddle.move_left(event)

    def move_right(self, event):
        self.paddle.move_right(event)


if __name__ == '__main__':
root = Tk()
root.option_add('*font', ('Verdana', 12, 'bold italic')) # Found at http://effbot.org/tkinterbook/tkinter-widget-styling.htm
root.resizable(0,0) # Found at https://mail.python.org/pipermail/tutor/2001-September/008504.html
root.title('Paddle Ball')  
root.wm_attributes("-topmost", -1)
app = PaddleBall(root)
root.mainloop()
class Ball:
    '''
    Ball models a single ball that may be rendered to a canvas
    '''

    def __init__(self, x, y, radius = 15,):
        '''
        Constructor
        '''
        self._x = x
        self._y = y
        self._velX = randint(-10,10)
        self._velY = randint(-10,-5)
        self._radius = radius
        self._color = 'white'        
        self._tx = 350
        self._ty = 400
        self._t = ""
        self._tfill = "red"
        self._tfont = ("Arial", 35, "bold italic")

    # This method renders the ball    
    def render(self, canvas):
        canvas.create_oval(self._x - self._radius, self._y - self._radius, self._x + self._radius, self._y + self._radius, fill = self._color)
        canvas.create_text(self._tx, self._ty, text = self._t, fill = self._tfill, font = self._tfont)


    # This method moves the ball    
    def move(self, canvas, Paddle):
        # Update Position

        self._x += self._velX
        self._y += self._velY

        # If the ball hits any of the wall negate the velocity
        if (self._x + self._radius > canvas.winfo_reqwidth() and self._velX > 0) or (self._x - self._radius < 0 and self._velX < 0):
            self._velX = -self._velX
        if  (self._y + self._radius < 0 and self._velY < 0):
            self._velY = -self._velY
        if (self._y + self._radius > canvas.winfo_reqheight() and self._velY > 0):
            self._velY = 0
        self._velX = 0
            self._t = "                 GAME OVER! \n Click the play button to play again."


#*****THIS IS WHAT I'M HAVING TROUBLE WITH******
        # Determine if the ball hits the paddle
        if ((self._x + self._radius > Paddle._x(self) and self._velX > 0) or (self._x + self._radius < Paddle._x2(self))) and (self._y < Paddle._y(self)):
            self._velX = -self._velX
# Import math and helpers
from tkinter import *
import math
from gui import *


class Paddle:

    def __init__(self, x, y, x2, y2, velX, velY):
        '''
        Constructor
        '''
        self._x = x
        self._y = y
        self._x2 = x2
        self._y2 = y2
        self._velX = velX
        self._velY = velY
        self._color = 'white'

    def getpadx(self):
        return self._x

    def getpady(self):
        return self._y

    def getpadx1(self):
        return self._x2

    def getpady2(self):
        return self._y2

    # This method renders the paddle    
    def render(self, canvas):
        canvas.create_rectangle(self._x, self._y, self._x2, self._y2, fill = self._color)

    # This method moves the paddle    
    def move(self, canvas):
        # Update Position

        # If the paddle hits any of the wall negate the velocity
        if (self._x + self._radius > canvas.winfo_reqwidth() and self._velX > 0) or (self._x - self._radius < 0 and self._velX < 0):
            self._velX = -self._velX

    def move_left(self, event):
        self._x -= 35
        self._x2 -= 35

    def move_right(self, event):
        self._x += 35
        self._x2 += 35
`if (self._x > Paddle._x) and (self._x < Paddle._x2):
    if (self._y + self._radius > Paddle._y):
        self._velY = -self._velY
        self._velX = self._velX + randint(-2,2)`