[VISIBLE ONLY LOCALLY] Optionally view what the website will look like at another time (in PDT):
Credit: Chris Piech
Create a program that has a paddle that moves along the bottom of the screen, tracking the user's mouse horizontally. When the user clicks the mouse, fire a rocket from the paddle, and animate it flying up the screen! There is no limit to the number of rockets you can fire.
""" File: rocket_paddle.py ------------------- Creates a paddle that tracks the user's mouse, and that shoots rockets on click that travel up the screen. """ from graphics import Canvas import time ROCKET_DIAMETER = 10 # The amount a rocket moves each frame ROCKET_MOVE_AMOUNT = 5 # The paddle location and dimensions PADDLE_Y_OFFSET = 50 PADDLE_WIDTH = 100 PADDLE_HEIGHT = 20 ANIMATION_DELAY_SECONDS = 0.02 def main(): canvas = Canvas() canvas.set_canvas_title("Debris Sweeper") # The list of all rockets on the canvas rocket_list =  paddle = create_paddle(canvas) canvas.update() while True: update_paddle_location(canvas, paddle) check_for_new_rockets(canvas, rocket_list) animate_rockets(canvas, rocket_list) canvas.update() time.sleep(ANIMATION_DELAY_SECONDS) canvas.mainloop() def create_paddle(canvas): """ Creates and returns a paddle rectangle initialized at the bottom of the screen at the appropriate vertical offset, filled black. """ y = canvas.get_canvas_height() - PADDLE_Y_OFFSET paddle = canvas.create_rectangle(0, y, PADDLE_WIDTH, y + PADDLE_HEIGHT) canvas.set_color(paddle, 'black') return paddle def update_paddle_location(canvas, paddle): """ Updates the paddle location to track the mouse. The paddle y coordinate will not change, but the x coordinate will be centered at the mouse x. """ canvas.moveto(paddle, canvas.get_mouse_x() - canvas.get_width(paddle) / 2, canvas.get_top_y(paddle)) def check_for_new_rockets(canvas, rocket_list): """ Checks if there are any new mouse clicks, and if there were, adds a new rocket to the screen at the location of each mouse click, and also adds the rocket (circle) to the rocket list. """ clicks = canvas.get_new_mouse_clicks() for click in clicks: y = canvas.get_canvas_height() - PADDLE_Y_OFFSET rocket = canvas.create_oval(click.x, y, click.x + ROCKET_DIAMETER, y + ROCKET_DIAMETER) canvas.set_color(rocket, 'blue') rocket_list.append(rocket) def animate_rockets(canvas, rocket_list): """ Animates all rockets in the rocket list that are still visible on the canvas. """ for rocket in rocket_list: if canvas.get_top_y(rocket) + canvas.get_height(rocket) >= 0: canvas.move(rocket, 0, -ROCKET_MOVE_AMOUNT) if __name__ == "__main__": main()