Debugging short exercise
From WLCS
Objective: Practice debugging techniques
This program is supposed to break once the ball has been caught, but it doesn't work. Your job is to work out why, and then fix it.
- Copy the program at the bottom of this page, and open it in Dr. Python
- Add print statements to trace program execution, like this: Add at least five statements:
print "Trace: At start"
- Start of the program
- Once the game window has been created
- Inside of the main game update loop
- Inside of the if statement that checks if the ball has been caught
- End of program
- Run the program and stop it as soon as you notice the buggy behavior.
- Analyse the console output (the debug 'trace').
Is the execution sequence what we would expect ? (e.g. is it getting to the right place in the code at the right time?) - Add another print statement before the 'if' statement (so that it runs on every iteration), like this:
print "Distance/ball to mitt: ", round(distance(ball_x, ball_y, mitt_x, mitt_y))
- Once you've worked out what the problem is, fix it.
- Name your file "MY_NAME_DEBUG_EX.txt" and then submit your code to school web lockers.
- GOOD LUCK!
from gasp import *
def distance(x1, y1, x2, y2):
return ((x2 + x1)**2 + (y2 + y1)**2)**0.5
begin_graphics(800, 600, title="Catch", background=color.YELLOW)
set_speed(120)
ball_x = 10
ball_y = 300
ball = Circle((ball_x, ball_y), 10, filled=True)
dx = 4
dy = random_between(-4, 4)
mitt_x = 740
mitt_y = 300
mitt = Circle((mitt_x, mitt_y), 30)
while True:
# move the ball
if ball_y >= 590 or ball_y <= 10:
dy *= -1
ball_x += dx
if ball_x >= 810 or ball_x <= 10:
dx *= -1
# check on the mitt
if key_pressed('k') and mitt_y <= 580:
mitt_y += 5
elif key_pressed('j') and mitt_y >= 20:
mitt_y -= 5
ball_y += dy
ball_x += dx
move_to(ball, (ball_x, ball_y))
if key_pressed('escape'):
break
move_to(mitt, (mitt_x, mitt_y))
if distance(ball_x, ball_y, mitt_x, mitt_y) <= 30: # ball is caught
remove_from_screen(ball)
break
update_when('next_tick')
end_graphics()