small-projects/face_maker/main.py

86 lines
3.2 KiB
Python
Raw Normal View History

2025-04-11 01:15:38 +00:00
import pygame
import random
import sys
# Initialize Pygame
pygame.init()
# Set up the display window
screen_width, screen_height = 600, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("Procedurally Generated Cartoon Faces")
def draw_face(surface):
"""Draws a cartoon face with random features on the given surface."""
# Fill background
surface.fill((255, 255, 255))
# --- Draw the Face ---
# Define face center and radius, then choose a random skin tone
face_center = (screen_width // 2, screen_height // 2)
face_radius = 200
skin_tones = [(255, 229, 204), (255, 204, 153), (204, 153, 102)]
face_color = random.choice(skin_tones)
pygame.draw.circle(surface, face_color, face_center, face_radius)
# --- Draw the Eyes ---
# Parameters for eyes
eye_radius = 20
pupil_radius = 10
# Random variations for eye positions
eye_offset_x = 60 + random.randint(-15, 15)
eye_y = face_center[1] - 40 + random.randint(-10, 10)
# Left eye position
left_eye_x = face_center[0] - eye_offset_x
left_eye_pos = (left_eye_x, eye_y)
# Right eye position
right_eye_x = face_center[0] + eye_offset_x
right_eye_pos = (right_eye_x, eye_y)
# Draw white part of eyes
pygame.draw.circle(surface, (255, 255, 255), left_eye_pos, eye_radius)
pygame.draw.circle(surface, (255, 255, 255), right_eye_pos, eye_radius)
# Draw pupils
pygame.draw.circle(surface, (0, 0, 0), left_eye_pos, pupil_radius)
pygame.draw.circle(surface, (0, 0, 0), right_eye_pos, pupil_radius)
# --- Draw the Nose ---
# Define nose points with some randomness
nose_top = (face_center[0], face_center[1] - 10 + random.randint(-5, 5))
nose_left = (face_center[0] - 20 + random.randint(-5, 5), face_center[1] + 30 + random.randint(-5, 5))
nose_right = (face_center[0] + 20 + random.randint(-5, 5), face_center[1] + 30 + random.randint(-5, 5))
pygame.draw.polygon(surface, (255, 153, 153), [nose_top, nose_left, nose_right])
# --- Draw the Mouth ---
# Define a rectangle where the mouth will be drawn and add some randomness
mouth_width, mouth_height = 80, 40
mouth_x = face_center[0] - mouth_width // 2 + random.randint(-10, 10)
mouth_y = face_center[1] + 40 + random.randint(-10, 10)
mouth_rect = pygame.Rect(mouth_x, mouth_y, mouth_width, mouth_height)
# Draw an arc to represent a smiling mouth; adjust angle for variation if desired
start_angle = 3.14 # π (start from the left side, roughly)
end_angle = 2 * 3.14 # 2π (end at the right side)
pygame.draw.arc(surface, (0, 0, 0), mouth_rect, start_angle, end_angle, 3)
# Update the display so the new face appears immediately
pygame.display.flip()
# Main loop
clock = pygame.time.Clock()
draw_face(screen) # Draw an initial face
while True:
for event in pygame.event.get():
# Allow the user to quit the window
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
# Press spacebar to generate a new face
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
draw_face(screen)
clock.tick(30) # Limit the frame rate to 30 FPS