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()
This article has been dead for over six months. Start a new discussion instead.