0

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()
2
Contributors
1
Reply
2
Views
4 Years
Discussion Span
Last Post by Lardmeister
This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.