Python 球只在对角线上来回反弹? 从Tkinter导入* window=Tk() 画布=画布(窗口,宽度=500,高度=500,背景=“绿色”) canvas.pack() 速度x=5 速度y=5 ball=画布。创建椭圆(0,0,32,32,fill=“蓝色”) 尽管如此: 画布移动(球,速度x,速度y) 画布。之后(30) canvas.update() coords=canvas.coords(球) 如果坐标[2]>=500: 速度x=-5 如果坐标[0]=500: 速度y=-5 如果坐标[1]

Python 球只在对角线上来回反弹? 从Tkinter导入* window=Tk() 画布=画布(窗口,宽度=500,高度=500,背景=“绿色”) canvas.pack() 速度x=5 速度y=5 ball=画布。创建椭圆(0,0,32,32,fill=“蓝色”) 尽管如此: 画布移动(球,速度x,速度y) 画布。之后(30) canvas.update() coords=canvas.coords(球) 如果坐标[2]>=500: 速度x=-5 如果坐标[0]=500: 速度y=-5 如果坐标[1],python,tkinter,Python,Tkinter,它只是从(0,0)和(500500)来回反弹 这是正常的,当遇到墙的角度(如(0,0)和(500500))时,它会反弹两次,导致反向(180°)而不是90°反弹 将球置于另一初始位置: from Tkinter import * window = Tk() canvas = Canvas(window, width=500, height=500, background="green") canvas.pack() speed_x = 5 speed_y = 5 ball = canvas.

它只是从(0,0)和(500500)来回反弹

这是正常的,当遇到墙的角度(如(0,0)和(500500))时,它会反弹两次,导致反向(180°)而不是90°反弹

将球置于另一初始位置:

from Tkinter import *
window = Tk()
canvas = Canvas(window, width=500, height=500, background="green")
canvas.pack()

speed_x = 5
speed_y = 5

ball = canvas.create_oval(0,0,32,32,fill="blue")

while True:
    canvas.move(ball, speed_x, speed_y)
    canvas.after(30)
    canvas.update()

    coords = canvas.coords(ball)

    if coords[2] >= 500:
        speed_x = -5
    if coords[0] <= 0:
        speed_x = 5
    if coords[3] >= 500:
        speed_y = -5
    if coords[1] <= 0:
        speed_y = 5
从Tkinter导入*
window=Tk()
画布=画布(窗口,宽度=500,高度=500,背景=“绿色”)
canvas.pack()
速度x=5
速度y=5
ball=画布。创建椭圆(0,0,32,32,fill=“蓝色”)
画布。移动(球,100,0)#将球移离对角线。
尽管如此:
画布移动(球,速度x,速度y)
画布。之后(30)
canvas.update()
coords=canvas.coords(球)
如果坐标[2]>=500:
速度x=-5
如果坐标[0]=500:
速度y=-5
如果coords[1]从(0,0)开始,以恒定速度向上和向右移动,则将到达(500500),球将击中屏幕的右上角。此时,x速度和y速度都将变为负值,因为:

from Tkinter import *
window = Tk()
canvas = Canvas(window, width=500, height=500, background="green")
canvas.pack()

speed_x = 5
speed_y = 5

ball = canvas.create_oval(0,0,32,32,fill="blue")
canvas.move(ball, 100, 0) # move ball away from diagonal.

while True:
    canvas.move(ball, speed_x, speed_y)
    canvas.after(30)
    canvas.update()

    coords = canvas.coords(ball)

    if coords[2] >= 500:
        speed_x = -5
    if coords[0] <= 0:
        speed_x = 5
    if coords[3] >= 500:
        speed_y = -5
    if coords[1] <= 0:
        speed_y = 5
这意味着球会向左和向下移动。所以问题是你正好击中右上角,同时反转水平和垂直速度


如果你从一个不同的位置开始(比如说(0,50)),那么你将到达点(450500),在这个点上,x速度将反转,y速度将继续为正。希望能解决这个问题!或者,将画布的大小更改为非方形。

您的想法正确,代码也可以正常工作。试想一下球的方向,当它撞到一个角落时,你认为会发生什么?。现在尝试将面积从500x500的正方形更改为400x500的矩形,看看会发生什么。希望这能让你走上正确的方向。它确实有帮助,谢谢。将速度x和速度y改为随机值很有效,谢谢!
   if coords[2] >= 500:
        speed_x = -5
    if coords[3] >= 500:
        speed_y = -5