Back to Blog
September 6, 202614 min read

15 Python Projects for Kids: Real Code Your Child Can Build This Month

PythonProjectsCoding for Kids

Most kids who quit Python quit for the same reason: they spent six weeks on syntax exercises and never built anything they wanted to show anyone. Projects fix that. Below are fifteen real Python projects, ordered from a child's very first line of code to something genuinely impressive, each with working code you can copy, what it actually teaches, and one way to make it harder when it gets too easy.

Every snippet here runs as-is in plain Python — no libraries to install, nothing to pay for. Sit next to your child for the first three and they will very likely take the rest from you.

Before You Start: The Five-Minute Setup

You need somewhere to type Python and press run. Three options, easiest first:

  • An online editor — nothing to install, works on a school laptop or a locked-down device. Fastest way to get the first program running today.
  • Thonny — a free desktop editor built for beginners. Big buttons, clear errors, and a step-through mode that shows the code running line by line. This is what we would pick for a child under 12.
  • Python + VS Code — the real professional setup. Worth doing once your child is past project 8 or so, because it is what they will use later anyway.

One rule before you begin: type the code, do not paste it. Typing it is how the fingers learn the shape of a loop, and how the typos that teach debugging actually happen. The code below is here so you can check against it, not so your child can skip past it.

How the levels work. Projects 1–5 need nothing but print, input and if. Projects 6–10 add loops, lists and functions. Projects 11–15 add files, dictionaries and the first taste of AI. Do them roughly in order — each one reuses something from the last.

Level 1 — The First Five (Ages 8+, No Experience Needed)

1. The Greeter

Teaches: printing, input, variables, f-strings

name = input("What's your name? ")
age = input("How old are you? ")

print(f"Hello {name}!")
print(f"Next year you will be {int(age) + 1}.")

Make it harder: ask for a favourite colour and food too, then print a silly sentence that uses all four answers.

2. Dog Years Calculator

Teaches: numbers vs text, maths, rounding

human_years = int(input("Your age in human years: "))
dog_years = human_years * 7

print(f"In dog years you are {dog_years} years old!")
print(f"A dog your age would be {round(dog_years / 7, 1)} in human years.")

Make it harder: add cat years (4x), and let the user choose which animal to convert to.

3. The Number Guessing Game

Teaches: random numbers, while loops, if / elif / else

This is the project. If a child only ever builds one thing, build this — it is the first program that feels like a real game, and almost every idea in Level 2 grows out of it.

import random

secret = random.randint(1, 100)
tries = 0

while True:
    guess = int(input("Guess a number between 1 and 100: "))
    tries = tries + 1

    if guess < secret:
        print("Too low!")
    elif guess > secret:
        print("Too high!")
    else:
        print(f"Correct! You got it in {tries} tries.")
        break

Make it harder: give the player only 7 guesses, then tell them the answer if they run out.

4. Rock, Paper, Scissors

Teaches: lists, random choice, comparing values

import random

options = ["rock", "paper", "scissors"]
you = input("rock, paper or scissors? ").lower()
computer = random.choice(options)

print(f"Computer chose {computer}")

if you == computer:
    print("It's a draw!")
elif (you == "rock" and computer == "scissors") \
     or (you == "paper" and computer == "rock") \
     or (you == "scissors" and computer == "paper"):
    print("You win!")
else:
    print("Computer wins!")

Make it harder: play best of five and keep score. That single change turns a script into a real game.

5. Turtle Art: The Colour Spiral

Teaches: loops, the turtle module, changing one number to change everything

Turtle draws on screen, so the reward is instant and visual. This is the one that hooks children who think code is "just text".

import turtle

pen = turtle.Turtle()
pen.speed(0)
colours = ["red", "orange", "yellow", "green", "blue", "purple"]

for i in range(150):
    pen.color(colours[i % 6])
    pen.forward(i * 2)
    pen.left(59)

turtle.done()

Make it harder: change 59 to 61, then 90, then 144. Ask your child to predict the shape before pressing run — that guess is where real understanding starts.

Level 2 — Real Programs (Ages 10+, After Level 1)

6. Password Generator

Teaches: strings as sequences, list building, join

import random

letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
digits = "0123456789"
symbols = "!@#$%&*"
pool = letters + digits + symbols

length = int(input("How many characters? "))
password = "".join(random.choice(pool) for _ in range(length))

print("Your password:", password)

Make it harder: guarantee at least one digit and one symbol in every password. Harder than it sounds, and a great first taste of real requirements.

7. Quiz Game With a Score

Teaches: lists of pairs, looping over data, keeping state

questions = [
    ("Capital of Japan?", "tokyo"),
    ("What planet is known as the Red Planet?", "mars"),
    ("How many continents are there?", "7"),
]

score = 0
for question, answer in questions:
    reply = input(question + " ").lower().strip()
    if reply == answer:
        print("Correct!")
        score = score + 1
    else:
        print(f"Nope - the answer was {answer}.")

print(f"You scored {score} out of {len(questions)}.")

Make it harder: shuffle the questions each time, and let your child write a quiz on a topic they actually love. Ownership doubles the effort they put in.

8. Hangman (Word Guess)

Teaches: sets, string building, game loops with a lose condition

import random

word = random.choice(["python", "galaxy", "pizza", "dragon"])
found = set()
lives = 6

while lives > 0:
    display = "".join(c if c in found else "_" for c in word)
    print(display, f"({lives} lives left)")

    if "_" not in display:
        print("You won!")
        break

    letter = input("Guess a letter: ").lower()
    if letter in word:
        found.add(letter)
    else:
        lives = lives - 1
        print("Wrong!")
else:
    print(f"Out of lives - the word was {word}.")

Make it harder: stop the player from losing a life for guessing the same wrong letter twice.

9. Dice Roller With Statistics

Teaches: dictionaries, counting, reading results like a scientist

import random

rolls = int(input("How many times should I roll? "))
counts = {1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0}

for _ in range(rolls):
    counts[random.randint(1, 6)] += 1

for face, count in counts.items():
    bar = "#" * (count * 40 // rolls)
    print(f"{face}: {bar} {count}")

Make it harder: roll two dice and chart the totals from 2 to 12. The bell curve that appears is a genuinely brilliant maths lesson that no worksheet delivers as well.

10. Your Own Functions: The Emoji Mood Log

Teaches: writing functions, returning values, organising a program

def mood_emoji(score):
    if score >= 8:
        return "great"
    elif score >= 5:
        return "okay"
    else:
        return "rough"

def log_day(day, score):
    print(f"{day}: {score}/10 - {mood_emoji(score)}")

log_day("Monday", 7)
log_day("Tuesday", 9)
log_day("Wednesday", 3)

Make it harder: ask for all seven days with input, then print the average and the best day of the week.

Level 3 — Bigger Builds (Ages 12+, or Any Child Who Finished Level 2)

These are the projects worth putting in a portfolio. They keep data after the program closes, which is the moment a child stops writing scripts and starts writing software.

11. A To-Do List That Remembers

Teaches: reading and writing files, menus, program structure

FILE = "todo.txt"

def load():
    try:
        with open(FILE) as f:
            return [line.strip() for line in f if line.strip()]
    except FileNotFoundError:
        return []

def save(tasks):
    with open(FILE, "w") as f:
        f.write("\n".join(tasks))

tasks = load()
while True:
    print("\nYour tasks:")
    for i, task in enumerate(tasks, start=1):
        print(f"  {i}. {task}")

    choice = input("[a]dd, [d]one, [q]uit? ").lower()
    if choice == "a":
        tasks.append(input("New task: "))
    elif choice == "d":
        tasks.pop(int(input("Which number? ")) - 1)
    elif choice == "q":
        save(tasks)
        break

Make it harder: add due dates, and make the list show overdue items first.

12. Study Timer (Pomodoro)

Teaches: the time module, formatting output, building a tool they will use

import time

def countdown(minutes, label):
    print(f"\n{label} for {minutes} minutes")
    for remaining in range(minutes * 60, 0, -1):
        mins, secs = divmod(remaining, 60)
        print(f"  {mins:02d}:{secs:02d}", end="\r")
        time.sleep(1)
    print(f"\n{label} finished!")

for round_number in range(1, 5):
    countdown(25, f"Round {round_number} - study")
    countdown(5, "Break")

Make it harder: log every completed round to a file, so at the end of the week your child can see how many hours they actually studied.

13. Rule-Based Chatbot

Teaches: dictionaries, keyword matching, what "rules" feel like before AI

replies = {
    "hello": "Hey there! What's up?",
    "name": "I'm PyBot, built in Python.",
    "joke": "Why do programmers hate nature? Too many bugs.",
    "bye": "See you later!",
}

while True:
    message = input("You: ").lower()
    answer = "I don't know that one yet - teach me!"

    for keyword, reply in replies.items():
        if keyword in message:
            answer = reply
            break

    print("PyBot:", answer)
    if "bye" in message:
        break

Make it harder: when the bot does not know an answer, ask the user what it should have said and add it to the dictionary. That is project 14.

14. The Chatbot That Learns

Teaches: saving state to JSON, the honest difference between memorising and learning

import json

try:
    with open("brain.json") as f:
        brain = json.load(f)
except FileNotFoundError:
    brain = {"hello": "Hi!"}

while True:
    message = input("You: ").lower().strip()
    if message == "bye":
        break

    if message in brain:
        print("PyBot:", brain[message])
    else:
        print("PyBot: I don't know that. What should I say?")
        brain[message] = input("You (teach me): ")

with open("brain.json", "w") as f:
    json.dump(brain, f)
print("Brain saved.")

Talk about this one. Ask your child: is the bot really learning, or just remembering exactly what it was told? That question is the doorway to machine learning — and it is the same conversation we open our AI course with.

15. Guess the Animal (A Decision Tree That Grows)

Teaches: nested data, recursion-style thinking, the shape of a real ML model

The computer asks yes/no questions to guess an animal. When it is wrong, it asks the player for a question that would have told the two animals apart — and gets permanently better. Children find this genuinely magical, and it is a real decision tree, the same family of model used in actual machine learning.

tree = {"question": "Does it have four legs?",
        "yes": "dog", "no": "bird"}

def ask(node):
    if isinstance(node, str):
        if input(f"Is it a {node}? (y/n) ") == "y":
            print("I guessed it!")
            return node
        animal = input("What was it? ")
        question = input(f"Question that is TRUE for {animal}: ")
        return {"question": question, "yes": animal, "no": node}

    branch = "yes" if input(node["question"] + " (y/n) ") == "y" else "no"
    node[branch] = ask(node[branch])
    return node

tree = ask(tree)

Make it harder: save the tree to JSON like project 14, so it keeps everything it learned between games. After twenty rounds it will genuinely surprise you.

What to Do When Your Child Gets Stuck (You Do Not Need to Know Python)

Stuck is not a problem to be removed — it is where the learning is. But there is a difference between productive stuck and quitting stuck. Four things that work, none of which require you to read the code:

  • Read the last line of the error out loud. Python errors are unusually honest. NameError: name 'guess' is not defined almost always means a typo or a missing line. The line number in the error is where to look first.
  • Ask "what did you expect it to do, and what did it do?" Making a child say the gap out loud solves the bug about a third of the time, without you contributing anything.
  • Add a print. Put print(something) in the middle of the program to see what a variable actually holds. This is not a beginner trick — professional engineers do it every day.
  • If they use AI, make it explain, not solve. "Fix my code" teaches nothing. "Here is my code and the error — ask me questions until I find the bug myself" teaches a great deal. We wrote more on this in should kids use ChatGPT for homework.

And a time limit helps: twenty minutes of genuine struggle, then a hint. Beyond that, frustration stops teaching anything.

Turning Fifteen Projects Into Something That Counts

Loose files in a downloads folder are worth very little. The same fifteen projects, organised, are worth a lot — for school applications, for scholarship forms, and mostly for a child's own sense that they are someone who builds things.

  • One folder per project, named clearly, with a short text file saying what it does and what was hard about it.
  • A two-minute screen recording of each finished project actually running. Far more persuasive than code on a page, and children love making them.
  • A GitHub account once they are around 13 (that is GitHub's minimum age). Watching the contribution squares fill in is quietly one of the strongest motivators there is.
  • An audience. Grandparents playing the quiz. A cousin trying to beat the guessing game. Code that someone else uses is the code a child remembers writing.

How Long Should All of This Take?

A realistic pace for a motivated 11-year-old doing two or three sessions a week: Level 1 in about two weeks, Level 2 in a month, Level 3 in six to eight weeks. Call it three to four months from the first print to a working chatbot that learns.

Faster is not better. The children who go furthest are the ones who kept extending each project after it worked — who added a scoreboard, changed the colours, made the bot ruder. If your child is doing that unprompted, they are doing it right, and you can stop worrying about pace entirely.

If your child is not there yet, that is normal too. Kids who find typed syntax hard usually are not struggling with Python — they are struggling with loops and conditions, which are much easier to meet in blocks first. Our post on Scratch vs Python covers how to tell the difference, and Python for Kids goes deeper on readiness signs.

Want Your Child Guided Through Projects Like These, Live?

Python for Young Developers is 16 live classes taught by real software engineers — from the first line of code to text games, turtle art, working with data and an AI chatbot project. Small batches, ages 6–16, certificate on completion. Weekday or weekend slots arranged around school, and new batches start regularly — book a free demo class this week.

The Bottom Line

Your child does not need a course to start project one tonight — everything above is free, and the greeter takes four minutes. What a course changes is the middle: the week where the hangman game will not work, the point where nobody at home can explain why the loop never ends, and the moment a child decides that maybe they are just not a coding person.

That decision is almost always wrong, and it is almost always made alone. So whether you do this at the kitchen table or with a teacher, do it with someone. Start with the guessing game, keep every file, and let your child show you what they built. Fifteen projects from now, they will not be a child who did a coding activity — they will be a child who writes software.

Written by the Junior Codes Team — we teach live AI & Coding classes to kids aged 6–16, led by real software engineers with personal mentorship.