Question: from cs1graphics import * from time import sleep scene = Canvas() scene.setBackgroundColor('skyBlue') grass = Rectangle(200, 80, Point(100,160)) grass.setFillColor('green') grass.setBorderColor('green') grass.setDepth(100) scene.add(grass) sun = Circle(20, Point(50,30))

from cs1graphics import *

from time import sleep

scene = Canvas()

scene.setBackgroundColor('skyBlue')

grass = Rectangle(200, 80, Point(100,160))

grass.setFillColor('green')

grass.setBorderColor('green')

grass.setDepth(100)

scene.add(grass)

sun = Circle(20, Point(50,30))

sun.setFillColor('yellow')

scene.add(sun)

target = Layer()

outside = Circle(30)

outside.setFillColor('white')

outside.setDepth(49)

target.add(outside)

middle = Circle(20)

middle.setFillColor('blue')

middle.setDepth(48)

target.add(middle)

inside = Circle(10)

inside.setFillColor('red')

inside.setDepth(47)

target.add(inside)

legs = Path(Point(-25,45), Point(0,0), Point(25,45))

legs.setBorderWidth(2)

target.add(legs)

target.move(160,110)

target.setDepth(75) # in front of grass; behind arrows

scene.add(target)

# prepare three arrows, but do not yet add to scene

arrow1 = Layer()

tip = Polygon(Point(0,0), Point(-8,5), Point(-5,0), Point(-8,-5))

tip.setFillColor('white')

arrow1.add(tip)

shaft = Path(Point(-30,0), Point(-5,0))

shaft.setBorderWidth(2)

shaft.setDepth(51)

arrow1.add(shaft)

fletching = Polygon(Point(-30,0), Point(-33,-3), Point(-40,-3),

Point(-36,0), Point(-38,3), Point(-36,3))

fletching.setFillColor('white')

arrow1.add(fletching)

arrow1.move(15,120) # initial position

arrow2 = arrow1.clone()

arrow3 = arrow1.clone()

dialogue = Text('Click target to fire an arrow')

dialogue.move(100,170)

scene.add(dialogue)

target.wait() # wait indefinitely for user event on target

scene.add(arrow1)

arrow1.rotate(-20)

sleep(0.25)

arrow1.move(41,-15)

arrow1.rotate(7)

sleep(0.25)

arrow1.move(41,-5)

arrow1.rotate(7)

sleep(0.25)

arrow1.move(41,5)

arrow1.rotate(7)

sleep(0.25)

arrow1.move(41,17)

arrow1.rotate(7)

target.wait() # wait indefinitely for user event on target

scene.add(arrow2)

arrow2.rotate(-40)

sleep(0.25)

arrow2.move(39,-22)

arrow2.rotate(17)

sleep(0.25)

arrow2.move(39,-12)

arrow2.rotate(17)

sleep(0.25)

arrow2.move(39,3)

arrow2.rotate(17)

sleep(0.25)

arrow2.move(39,13)

arrow2.rotate(17)

target.wait() # wait indefinitely for user event on target

scene.add(arrow3)

arrow3.rotate(-30)

sleep(0.25)

arrow3.move(37,-26)

arrow3.rotate(10)

sleep(0.25)

arrow3.move(37,-11)

arrow3.rotate(10)

sleep(0.25)

arrow3.move(37,6)

arrow3.rotate(10)

sleep(0.25)

arrow3.move(37,21)

arrow3.rotate(10)

dialogue.setMessage('Good shooting!')

scene.wait() # wait for user event anywhere on canvas

scene.close()

^^^^^^^^^^My code^^^^^^^

write it in python

1) Allow for six arrows to be shot rather than three.

-- You need to use a list to hold six arrows so you are able to use a for loop to animate arrow shooting repeatedly, while removing arrow2 and arrow3.

# make 6 arrows

arrow = list()

for i in range(6):

arrow.append(arrow1.clone())

2) Produce a smoother animation of the arrow movement.

-- Define a variable to specify smooth degree, smoothDegree. In the original source code, an arrow moves 37-41 pixels horizontally as one step. It can be changed to a smaller number of pixels for one step of movements. The higher of the smooth degree (for example, 1-10) is, the smoother the animation will be. You then need to use a while loop to give the rest points for the trajectory of arrow movements.

3) All arrows start at the same location (e.g., (15, 120)), but the final location (or the end point) of each arrow is with its tip precisely at the point on which the user clicked inside the target. Youll need to use the code segment provided below to get the end point.

cue = target.wait()

targ = cue.getMouseLocation()

targetX = targ.getX()+160

targetY = targ.getY()+110

Notice that the location returned from cue.getMouseLocation()is relative to the center of target at (160, 110). So it needs to be adjusted to refer to the Canvas and keep consistent with the start point.

While you work on 2) smoothing, maintain the current position of the moving arrow, arrow[i], at (currentX, currentY). Use stepX and stepY for move increments toward (targetX, targetY). They can be calculated as follows:

stepX = (targetX - startX)/(2*smoothDegree)

stepY = (targetY startY)/(2*smoothDegree)

In case that stepX and stepY are not added up exactly to targetX and targetY, you may add last move as follows right after the while loop so that the arrow will stop precisely at (targetX, targetY).

arrow[i].moveTo(targetX, targetY)

Rotate an arrow properly so it looks better in moving.

Your program should include the following functions.

---- arrowMovement(arrow, startX, startY, endX, endY, smoothDegree) to allow an arrow to move from (startX, startY) to (endX, endY) in smoothDegree.

---- yesOrNo(prompt) to ask the user a question with the given prompt and demand a response of yes or no so the program may start over again (optional).

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!