Python 使球在屏幕上反弹

Python 使球在屏幕上反弹,python,tkinter,tkinter-canvas,Python,Tkinter,Tkinter Canvas,我正在尝试用Python制作一个非常简单的球拍游戏,用一个从左到右移动的球拍在屏幕上移动球。但是,球移动并撞击屏幕底部,并且不改变方向,它只是停止并靠墙滑动 如有任何帮助或建议,将不胜感激。代码如下: from tkinter import Canvas, Tk import random canvas_width = 800 canvas_height = 400 root = Tk() root.title("Ball and Paddle") c = Canvas(root,width

我正在尝试用Python制作一个非常简单的球拍游戏,用一个从左到右移动的球拍在屏幕上移动球。但是,球移动并撞击屏幕底部,并且不改变方向,它只是停止并靠墙滑动

如有任何帮助或建议,将不胜感激。代码如下:

from tkinter import Canvas, Tk
import random

canvas_width = 800
canvas_height = 400

root = Tk()
root.title("Ball and Paddle")
c = Canvas(root,width=canvas_width,height=canvas_height,background='orange')
c.pack()

paddle_color = 'blue'
paddle_width = 60
paddle_height = 10
paddle_start_x = canvas_width/2 - paddle_width/2
paddle_start_y = canvas_height - paddle_height - 20
paddle_start_x2 = canvas_width/2 + paddle_width/2
paddle_start_y2 = canvas_height - 20

paddle = c.create_rectangle(paddle_start_x,paddle_start_y,\
                        paddle_start_x2,paddle_start_y2,\
                        fill='blue', width=0)

ball_color = 'green'
ball_width = 20
ball_height = 20
ball_start_x1 = canvas_width/2 - ball_width/2
ball_start_y1 = canvas_height/2 - ball_height/2
ball_start_x2 = canvas_width/2 + ball_width/2
ball_start_y2 = canvas_height/2 + ball_height/2
ball_speed = 5

ball = c.create_oval(ball_start_x1, ball_start_y1, \
                 ball_start_x2, ball_start_y2, \
                 fill = ball_color, width = 0)
dx = 1
dy = 1

def ball_move():
    global dx, dy
    (bx1,by1,bx2,by2) = c.coords(ball)
    c.move(ball, dx, dy)
    if bx1 <= 0:
    dx = -dx
    if bx2 >= canvas_width:
        dx = -dx
    if by1 <= 0:
        dy = -dy
    if by2 >= canvas_height:
        dy = -dy
    root.after(ball_speed, ball_move)

def move_left(event):
    (x1,y1,x2,y2) = c.coords(paddle)
    if x1>0:
        c.move(paddle,-20,0)

def move_right(event):
    (x1,y1,x2,y2) = c.coords(paddle)
    if x2 < canvas_width:
        c.move(paddle, 20, 0)

c.bind('<Left>',move_left)
c.bind('<Right>',move_right)
c.focus_set()

root.after(ball_speed, ball_move)

root.mainloop()
从tkinter导入画布,Tk
随机输入
画布宽度=800
画布高度=400
root=Tk()
根标题(“球和桨”)
c=画布(根,宽度=画布宽度,高度=画布高度,背景为橙色)
c、 包()
桨颜色=‘蓝色’
桨叶宽度=60
桨叶高度=10
桨叶_开始_x=画布_宽度/2-桨叶_宽度/2
桨叶开始高度=画布高度-桨叶高度-20
桨叶开始=画布宽度/2+桨叶宽度/2
桨叶_开始_y2=画布_高度-20
划桨=c。创建矩形(划桨开始,划桨开始\
桨式起动,桨式起动\
填充(蓝色),宽度=0)
球的颜色=‘绿色’
球头宽度=20
球头高度=20
ball_start_x1=画布宽度/2-ball_宽度/2
ball_start_y1=画布高度/2-ball_高度/2
ball\u start\u x2=画布宽度/2+球宽度/2
ball\u start\u y2=画布高度/2+ball\u高度/2
球速=5
ball=c.创建椭圆(ball\u start\u x1,ball\u start\u y1\
起跑球x2,起跑球y2\
填充=球(颜色,宽度=0)
dx=1
dy=1
def ball_move():
全局dx,dy
(bx1,by1,bx2,by2)=c坐标(球)
c、 移动(球,dx,dy)
如果bx1=画布宽度:
dx=-dx
如果by1=画布高度:
dy=-dy
根。后(球\速度,球\移动)
def向左移动(事件):
(x1,y1,x2,y2)=c坐标(桨)
如果x1>0:
c、 移动(桨-20,0)
def向右移动(事件):
(x1,y1,x2,y2)=c坐标(桨)
如果x2<画布宽度:
c、 移动(划桨,20,0)
c、 绑定(“”,向左移动)
c、 绑定(“”,向右移动)
c、 焦点集()
根。后(球\速度,球\移动)
root.mainloop()
缩进问题:

def ball_move():
    global dx, dy
    (bx1,by1,bx2,by2) = c.coords(ball)
    c.move(ball, dx, dy)
    if bx1 <= 0:
    dx = -dx
    if bx2 >= canvas_width:
    ..snippet..
def ball_move():
全局dx,dy
(bx1,by1,bx2,by2)=c坐标(球)
c、 移动(球,dx,dy)
如果bx1=画布宽度:
一小条
应该是:

def ball_move():
    global dx, dy
    (bx1,by1,bx2,by2) = c.coords(ball)
    c.move(ball, dx, dy)
    if bx1 <= 0:
        dx = -dx              # indent corrected here!
    if bx2 >= canvas_width:
    ..snippet..
def ball_move():
全局dx,dy
(bx1,by1,bx2,by2)=c坐标(球)
c、 移动(球,dx,dy)
如果bx1=画布宽度:
一小条
缩进问题:

def ball_move():
    global dx, dy
    (bx1,by1,bx2,by2) = c.coords(ball)
    c.move(ball, dx, dy)
    if bx1 <= 0:
    dx = -dx
    if bx2 >= canvas_width:
    ..snippet..
def ball_move():
全局dx,dy
(bx1,by1,bx2,by2)=c坐标(球)
c、 移动(球,dx,dy)
如果bx1=画布宽度:
一小条
应该是:

def ball_move():
    global dx, dy
    (bx1,by1,bx2,by2) = c.coords(ball)
    c.move(ball, dx, dy)
    if bx1 <= 0:
        dx = -dx              # indent corrected here!
    if bx2 >= canvas_width:
    ..snippet..
def ball_move():
全局dx,dy
(bx1,by1,bx2,by2)=c坐标(球)
c、 移动(球,dx,dy)
如果bx1=画布宽度:
一小条

(我假设如果bx1(我假设如果bx1的
一定要仔细检查你的缩进,尤其是在
之后如果bx1的
一定要仔细检查你的缩进,特别是在
之后如果bx1我同意问题中的代码有缩进问题,但这不可能是OP描述的问题的原因。球不会卡在问题的底部屏幕因缩进错误而关闭;如果出现缩进错误,该窗口甚至不会出现。在我所做的计算机上,当前查看Tkinter未安装。因此,我无法检查脚本的功能。OP可以为调试目的实现阈值警告。类似于:打印值bx1、bx2,然后查看发生了什么。Somethin我同意问题中的代码有缩进问题,但这不是OP描述的问题的原因。球不会因为缩进而卡在屏幕底部缩进错误;如果出现缩进错误,该窗口甚至不会出现。在我所做的计算机上,当前正在查看的Tkinter未安装。因此,我无法检查脚本的功能。OP可以为调试目的实现阈值警告。类似于:打印值bx1、bx2,然后查看发生了什么。具有交换值的内容ba来来回回。啊哈。我看到凯文也明白了。但是球应该击中平台并反弹回来。除了平台之外,它应该消失。太棒了!非常感谢你的帮助!压痕不是问题,但移动命令是。再次感谢!@JasonPalmira如果这个答案对你有用,请向上投票和/或选择作为答案。太棒了一些!非常感谢您的帮助!缩进不是问题,但移动命令是。再次感谢!@JasonPalmira如果此答案对您有用,请向上投票和/或选择作为答案。