0

ウィンドウの 4 つの側面すべてから 1 つのボールを跳ね返す Python のプログラムがありますが、配列を使用して 10 個のボールを作成する必要があります。私はまだこれに非常に慣れておらず、これを実装する方法について混乱しています。私がこれまでに持っているものを以下に投稿します。

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

1 に答える 1

0

コードの特定の問題:makeBall()を返すことができませんballsmakeBall()すべてが同じ場所から始まるわけではなく、ランダムな開始点を生成する必要があります。bounceInWin()1つだけでなく、ボールごとに個別の、個別に更新されたdxとdyが必要です。コードはメイン ウィンドウを 2 回作成します。1 回だけで十分です。固定回数の繰り返しではなく、モーションをシャットダウンするための時間計算を追加する必要があります。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()

ここに画像の説明を入力

于 2017-01-07T07:59:39.437 に答える