I'm having a little problem. The challenge is this: "Modify the program so that different shapes are drawn at each angle rather than a small filled circle".
So I'm trying to change the middle shape when the second hand hits 12, 3, 6, and 9. I've got some code, but it's not working. It's randomizing everything when it hits the 12, 3, 6, and 9 numbers. I know why this is, it's becasuse the loop is iterating much faster than the second hand is moving, so once it's on those numbers, it will change the shapes for 1 second.
I just don't know what to do, I'm sorry if that's a terrible explanation. Here's my code:
At the bottom, under '#randomize the middle object' is the part I'm stuck at. I'd be very greatful if someone could help!
import sys, random, math, pygame from pygame.locals import * from datetime import datetime, date, time def print_text(font, x, y, text, color=(255,255,255)): imgText = font.render(text, True, color) screen.blit(imgText, (x,y)) def wrap_angle(angle): return angle % 360 def draw_middle(shape): if shape == 'rect': pygame.draw.rect(screen, white, (pos_x, pos_y, 100, 100)) elif shape == 'circle': pygame.draw.circle(screen, white, (pos_x, pos_y), 20) elif shape == 'ellipse': pygame.draw.ellipse(screen, white, (pos_x, pos_y, 100, 100)) #main program begins pygame.init() screen = pygame.display.set_mode((600,500)) pygame.display.set_caption("Analog Clock Demo") font = pygame.font.Font(None, 36) orange = 220,180,0 white = 255,255,255 yellow = 255,255,0 pink = 255,100,100 pos_x = 300 pos_y = 250 radius = 250 angle = 360 #repeating loop while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() keys = pygame.key.get_pressed() if keys[K_ESCAPE]: sys.exit() screen.fill((0,0,100)) #draw one step around the circle pygame.draw.circle(screen, white, (pos_x, pos_y), radius, 6) #draw the clock numbers 1-12 for n in range(1, 13): angle = math.radians(n*(360/12) - 90) x = math.cos(angle) * (radius - 20) - 10 y = math.sin(angle) * (radius- 20) - 10 print_text(font, pos_x + x, pos_y + y, str(n)) #get the time of the day today = datetime.today() hours = today.hour % 12 minutes = today.minute seconds = today.second #draw the hours hand hour_angle = wrap_angle(hours * (360/12)-90) hour_angle = math.radians(hour_angle) hour_x = math.cos(hour_angle) * (radius-80) hour_y = math.sin(hour_angle) * (radius-80) target = (pos_x + hour_x, pos_y + hour_y) pygame.draw.line(screen, pink, (pos_x, pos_y), target, 25) #draw the minutes hand min_angle = wrap_angle(minutes * (360/60)-90) min_angle = math.radians(min_angle) min_x = math.cos(min_angle) * (radius-60) min_y = math.sin(min_angle) * (radius-60) target = (pos_x + min_x, pos_y + min_y) pygame.draw.line(screen, orange, (pos_x, pos_y), target, 12) #draw the seconds hand sec_angle = wrap_angle(seconds * (360/60) - 90) sec_angle_rad = math.radians(sec_angle) sec_x = math.cos(sec_angle_rad ) * (radius-40) sec_y = math.sin(sec_angle_rad ) * (radius-40) target = (pos_x + sec_x, pos_y + sec_y) pygame.draw.line(screen, yellow, (pos_x, pos_y), target, 6) #randomize the middle object numbers = [0, 90, 180, 270, 360] shapes = ['ellipse', 'circle', 'rect'] choice = random.choice(shapes) draw_middle(choice) print_text(font, 0, 0, str(hours) + ":" + str(minutes) + ":" + str(seconds)) pygame.display.update()