2016-11-16 22 views
0

我在Python中有一個程序,用於使一個球從窗口的所有4邊反彈,但現在我需要使用數組創建10個球。我對此仍然很陌生,並對如何實現這一點感到困惑。我會後我有這麼遠低於:使用Python Zelle Graphics在窗口中使圓圈(球)反彈

#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; 

回答

0

具體問題與您的代碼:makeBall()未能返回balls; makeBall()需要產生隨機起點,不是所有的起點都在同一個地方; bounceInWin()需要爲每個球有一個單獨的和分別更新的dx和dy,而不僅僅是一個;代碼創建主窗口兩次 - 只是一次就好;需要添加時間計算來關閉運動而不是固定的迭代次數; win.close()是一種方法,所以需要括號;避免使用分號「;」在Python代碼中。

下面是你的代碼的上述變化和一些風格調整返工:

# 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() 

enter image description here