简体   繁体   中英

Make circles (balls) bounce in window using Python Zelle Graphics

I have a program in Python for making one ball bounce off of all 4 sides of a window, but now I need to make 10 balls using an array. I'm still very new to this and confused on how to implement this. I'll post what I have so far below:

#create 10 balls bouncing off all 4 sides of the window (400 x 500)
#The ball must start moving after a click, then stop after a given amount of time
#After a second click, the program ends

#----Algorithm----#

#create screen 400 x 500
#create array of 10 circles in different starting points

#wait for click anywhere on screen 
#click anywhere on screen
#all 10 balls move in different directions bouncing off all 4 walls
    #if ball hits left or right wall
            #dy=dy*-1
    #if ball hits top or bottom
            #dx=dx*-1 

#ball moves for no more than 30 seconds
#ball stops
#wait for next click
#program ends

#----ProgramStarts----#

    from graphics import *
    import time, random 

#create screen
winWidth = 400;
winHeight = 500;
win = GraphWin('Ball Bounce', winWidth, winHeight);
win.setBackground(color_rgb(255,255,255));
win.setCoords(0,0,winWidth, winHeight);
numBalls= 10;

#create 10 balls
def makeBall(center, radius, win):

    balls=[];
    radius=10;

    for i in range (0,numBalls):
        aBall=Circle(center, radius);
        aBall.setFill("red");
        aBall.draw(win);
        balls.append(aBall);


#animate 10 balls bouncing off edges of window
def bounceInWin(shape, dx, dy, xLow, xHigh, yLow, yHigh):
    clickPoint=win.getMouse();   
    delay = .005
    for x in range(900):
        shape.move(dx, dy)
        center = shape.getCenter()
        x = center.getX()
        y = center.getY()
        if x < xLow:
            dx = -dx
        if x > xHigh:
            dx = -dx
        if y < yLow:
            dy = -dy
        if y > yHigh:
            dy = -dy
        time.sleep(delay);


#get a random Point
def getRandomPoint(xLow, xHigh, yLow, yHigh):
    x = random.randrange(xLow, xHigh+1)
    y = random.randrange(yLow, yHigh+1)
    return Point(x, y)   

#make ball bounce
def bounceBall(dx, dy):    
    winWidth = 400
    winHeight = 500
    win = GraphWin('Ball Bounce', winWidth, winHeight);
    win.setCoords(0,0,winWidth, winHeight);

    radius = 10
    xLow = radius
    xHigh = winWidth - radius
    yLow = radius
    yHigh = winHeight - radius

    center = getRandomPoint(xLow, xHigh, yLow, yHigh)
    ball = makeBall(center, radius, win)

    bounceInWin(ball, dx, dy, xLow, xHigh, yLow, yHigh)

bounceBall(3, 5);

#wait for another click to end program
win.getMouse(); #close doesn't work, tried putting in loop 
win.close;

Specific problems with your code: makeBall() fails to return balls ; makeBall() needs to generate random starting points, not all starting at the same place; bounceInWin() needs to have a separate, and separately updated, dx and dy for every ball, not just the one; the code creates the main window twice -- just once is fine; need to add time calculation to shut down motion instead of fixed number of iterations; win.close() is a method so it needs parentheses; avoid using semi-colon ";" in Python code.

Below is a rework of your code with the above changes and some style tweaks:

# Create 10 balls bouncing off all 4 sides of a window (400 x 500)
# The ball must start moving after a click, then stop after a given
# amount of time.  After a second click, the program ends.

#----Algorithm----#

# create screen 400 x 500
# create array of 10 circles in different starting points

# wait for click anywhere on screen
# all 10 balls move in different directions bouncing off all 4 walls
    # if ball hits left or right wall
        # dx = -dx
    # if ball hits top or bottom
        # dy = -dy

# balls move for no more than 30 seconds
# balls stops
# wait for next click
# program ends

#----ProgramStarts----#

import time
import random
from graphics import *

winWidth, winHeight = 400, 500
ballRadius = 10
ballColor = 'red'
numBalls = 10
delay = .005
runFor = 30  # in seconds

# create 10 balls, randomly located
def makeBalls(xLow, xHigh, yLow, yHigh):

    balls = []

    for _ in range(numBalls):
        center = getRandomPoint(xLow, xHigh, yLow, yHigh)

        aBall = Circle(center, ballRadius)
        aBall.setFill(ballColor)
        aBall.draw(win)
        balls.append(aBall)

    return balls

# animate 10 balls bouncing off edges of window
def bounceInWin(shapes, dx, dy, xLow, xHigh, yLow, yHigh):
    movedShapes = [(getRandomDirection(dx, dy), shape) for shape in shapes]

    start_time = time.time()

    while time.time() < start_time + runFor:
        shapes = movedShapes
        movedShapes = []

        for (dx, dy), shape in shapes:
            shape.move(dx, dy)
            center = shape.getCenter()

            x = center.getX()
            if x < xLow or x > xHigh:
                dx = -dx

            y = center.getY()
            if y < yLow or y > yHigh:
                dy = -dy

            # Could be so much simpler if Point had setX() and setY() methods
            movedShapes.append(((dx, dy), shape))

        time.sleep(delay)

# get a random direction
def getRandomDirection(dx, dy):
    x = random.randrange(-dx, dx)
    y = random.randrange(-dy, dy)

    return x, y

# get a random Point
def getRandomPoint(xLow, xHigh, yLow, yHigh):
    x = random.randrange(xLow, xHigh + 1)
    y = random.randrange(yLow, yHigh + 1)

    return Point(x, y)

# make balls bounce
def bounceBalls(dx, dy):

    xLow = ballRadius * 2
    xHigh = winWidth - ballRadius * 2
    yLow = ballRadius * 2
    yHigh = winHeight - ballRadius * 2

    balls = makeBalls(xLow, xHigh, yLow, yHigh)

    win.getMouse()

    bounceInWin(balls, dx, dy, xLow, xHigh, yLow, yHigh)

# create screen
win = GraphWin('Ball Bounce', winWidth, winHeight)

bounceBalls(3, 5)

# wait for another click to end program
win.getMouse()
win.close()

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM