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()