LEVEL UP YOUR PYTHON
& BUILD THE GAME
Push your Python further, build a real arcade game with controller support, create a live web app, and cap the year with your own capstone project. Four modules, a full year - this is where your DigiTech skills become things people can actually use.
Functions with return values, file handling, lists and dictionaries, and an introduction to object-oriented programming with classes.
Game design fundamentals, building a complete arcade game in GDevelop, and adding Logitech controller support for true arcade-style play.
Planning and wireframing a web app, building interactive front-end functionality, and deploying a live, working web app online.
Propose, design, build, and present a self-directed digital project that draws on everything from Years 9 and 10 - your DigiTech journey, your way.
| Grade | Mark Range | Standard |
|---|---|---|
| A | 85% + | Exceeds standard - detailed, precise, creative. Work demonstrates deep understanding and polished execution. |
| B | 70-84.9% | Above standard - thorough and mostly correct. Some areas for improvement but strong overall. |
| C | 50-69.9% | At standard - meets the basic requirements. Some errors or missing elements. |
| D | 40-49.9% | Below standard - incomplete or significant errors. Core requirements only partially met. |
| E | Sub 40% | Well below standard - missing most requirements. Student support recommended. |
Write a series of Python programs that use functions with return values and read from / write to text files. Culminates in a high-score tracker program that saves player names and scores to a file and loads them back when the program restarts.
task1_practice1.py- functions with parameters that return a valuetask1_practice2.py- writing text to a file and reading it backtask1_practice3.py- combining functions and file handlinghighscores.py- high-score tracker that saves and loads from a file- Short written reflection (5-8 sentences): challenges and solutions
- All programs must run without errors in Thonny
- At least two functions must take parameters and return a value
- High-score tracker must read from and write to a .txt file
- Program must handle the case where the file does not yet exist
- All files submitted as .py files (and any data files) via Connect
- Reflection written in full sentences - not dot points
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Functions & Parameters /5 marks | Multiple functions defined with meaningful names and parameters; at least two return a value that is used elsewhere in the program; programs run without errors. | Functions defined and called correctly; at least two return values; minor issues with naming or structure. | Functions used but return values not always used correctly; some naming issues. | Functions attempted but mostly do not return useful values or contain errors. | No functions defined or programs do not run. |
| File Writing /5 marks | Program correctly opens, writes to, and closes a file using a context manager (with open...); data is written in a clear, readable format. | File writing works correctly with only minor formatting issues. | File writing works but format is inconsistent or file handling is not closed properly. | File writing attempted but contains significant errors. | No file writing implemented. |
| File Reading & Error Handling /5 marks | Program correctly reads data back from the file; handles the case where the file does not exist (e.g. using try/except or checking with os.path); high scores update correctly across runs. | File reading works correctly; some handling of missing file case. | File reading works in most cases but missing-file case is not handled. | File reading attempted but contains significant errors. | No file reading implemented. |
| Reflection /5 marks | Reflection is specific and honest; identifies at least two genuine challenges with clear explanation of how each was resolved; uses correct terminology (function, parameter, return value, file handling, etc.). | Reflection identifies challenges and solutions; mostly specific; mostly correct terminology. | Reflection is present but surface-level; challenges mentioned but not explained. | Very brief reflection; generic statements; no specific coding challenges discussed. | No reflection submitted. |
Open code.org and try one Hour of Code activity on functions - student-led, just click and play.
By the end of this lesson you will be able to define a function with one or more parameters, call it with different arguments, and explain the difference between a parameter and an argument.
- Open Thonny and create a new file. Functions are reusable blocks of code defined with
def:def greet(name):
print("Hello,", name, "!")
greet("Alex")
greet("Priya") - Run it. Notice
nameis a parameter - a placeholder."Alex"and"Priya"are arguments - the actual values passed in. - Functions can take more than one parameter. Try:
def add_numbers(a, b):
result = a + b
print("The total is", result)
add_numbers(4, 7)
add_numbers(100, 250) - Save this file as
task1_practice1.py. Add two more functions of your own with at least one parameter each. - Challenge: write a function called
describe_pet(name, animal)that prints a sentence describing a pet using both parameters.
Save task1_practice1.py to your Documents. You'll submit all practice files together at the end of Week 3.
Open checkio.org and read through one beginner Python puzzle - think about the logic before coding. Student-led.
By the end of this lesson you will be able to write functions that use return to send a value back to the caller, and use that returned value in further calculations.
- So far your functions have used
print()inside them. Now tryreturninstead:def add_numbers(a, b):
return a + b
total = add_numbers(4, 7)
print("The total is", total) - Notice the difference:
returnsends the value back so it can be stored in a variable (total) and reused -print()just displays it and the value is gone. - Write a function
calculate_average(a, b, c)that returns the average of three numbers. Call it with three different sets of numbers and print each result. - Now combine two functions - use the return value of one function as the input to another:
def square(n):
return n * n
def double(n):
return n * 2
result = double(square(5))
print(result) # square(5) -> 25, then double(25) -> 50 - Save your work as
task1_practice1.py(continuing from Lesson 1) - add your new functions below the existing ones.
return does not automatically print anything. If you call add_numbers(4, 7) on its own with nothing to catch the result, the value disappears. You must store it in a variable or wrap it in print().
Scratch: explore how Scratch saves and loads project files - student-led discussion of "what does saving actually mean?"
By the end of this lesson you will be able to open a file in write mode, write text to it using with open(), and explain why this is needed for data to survive after a program ends.
- Every variable in Python disappears when the program ends - unless you save it to a file. Try this:
with open("notes.txt", "w") as f:
f.write("Hello from Python!\n")
f.write("This line was written by my program.\n") - Run it, then look in your file browser for
notes.txt- open it to see what was written. Notice\ncreates a new line. - The
withstatement automatically closes the file when you're done - this is the safe, modern way to handle files in Python. - Write a program that asks the user for three favourite movies (using
input()) and writes each one to a file calledmovies.txton its own line. - Save this as
task1_practice2.py. Run it twice with different answers - notice"w"mode overwrites the file each time.
"w" (write) creates a new file or completely overwrites an existing one. "a" (append) adds new content to the end of a file without deleting what's already there. Choosing the wrong mode is a very common bug - always think about whether you want to start fresh or add on.
Kahoot teacher-run quiz on functions and file writing from Weeks 1-2. Student-led from there - just join and play!
By the end of this lesson you will be able to open a file in read mode, loop through its contents line by line, and use the data inside your program.
- Using the
movies.txtfile from last lesson, read it back:with open("movies.txt", "r") as f:
for line in f:
print(line.strip()) - Notice
.strip()removes the trailing newline character - without it you'd see extra blank lines. - Write a function
load_movies(filename)that opens the given file, reads every line into a list, andreturns the list. - Call your function and print the returned list, then loop through it to print each movie on its own line with a number (e.g. "1. Movie Name").
- Save this as
task1_practice3.py- it should combine a function, a return value, and file reading all in one program.
Open codingame.com and browse a beginner Python challenge - read the problem and plan your approach. Student-led.
By the end of this lesson you will be able to handle the case where a file doesn't exist yet using try/except, and begin building your high-score tracker.
- Start a new file:
highscores.py. The problem: ifhighscores.txtdoesn't exist yet, opening it in"r"mode will crash your program. - Use
try/exceptto handle this gracefully:def load_scores(filename):
try:
with open(filename, "r") as f:
return [line.strip() for line in f]
except FileNotFoundError:
return [] - This function returns an empty list the first time the program runs (no file yet), and the saved scores every time after that.
- Write a function
save_score(filename, name, score)that appends a new line in the formatname,scoreto the file (use"a"mode). - Write the main program: ask the player for their name and a score (e.g. for a number-guessing game from earlier this year), call
save_score(), then callload_scores()and print everything saved so far.
except: catches every error, including ones you didn't expect - which can hide real bugs. Always name the specific error you expect, like except FileNotFoundError:, so other mistakes still show up.
By the end of this lesson you will be able to sort a list of scores, display a leaderboard, finish your high-score tracker program, and submit all Task 1 files with a written reflection.
- Your saved scores are strings like
"Alex,120". To sort by score, split each line and convert the score to an integer:scores = load_scores("highscores.txt")
parsed = []
for line in scores:
name, score = line.split(",")
parsed.append((name, int(score))) - Sort the list of tuples by score, highest first, using
sorted()with akey:leaderboard = sorted(parsed, key=lambda x: x[1], reverse=True)
print("=== LEADERBOARD ===")
for i, (name, score) in enumerate(leaderboard, start=1):
print(str(i) + ". " + name + " - " + str(score)) - Run your program multiple times with different names and scores. Confirm the leaderboard updates and stays sorted correctly each time.
- Write your reflection (5-8 sentences): what was the hardest part of this task - functions, return values, or file handling? How did you work through it? Use correct terminology.
Upload to connect.det.wa.edu.au: all four .py files, any data files (e.g. highscores.txt), and your written reflection. Verify your upload was successful before leaving class.
Master lists and dictionaries to store and organise collections of data. Build a student management program that stores names, scores, and grades using dictionaries inside a list, then search, sort, and update that data.
task2_lists.py- list creation, indexing, and looping practicetask2_dictionaries.py- dictionary creation, keys/values, and updating practicestudents.py- student management program using a list of dictionaries- Short written reflection (5-8 sentences)
- Student data stored as a list of dictionaries (each dict = one student)
- Program must let the user add a new student record
- Program must let the user search for a student by name
- Program must calculate and display the class average score
- At least one function that takes the list as a parameter
- All programs run without errors; meaningful variable/function names
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Lists /5 marks | Lists used correctly throughout; correct indexing and slicing; loops used to process list items; demonstrates clear understanding of list operations (append, sort, etc.). | Lists used correctly with mostly correct indexing; loops process items; minor errors. | Lists used but indexing or loop logic has some errors. | Lists attempted but significant errors in creation or access. | No evidence of lists used correctly. |
| Dictionaries /5 marks | Dictionaries used correctly with appropriate keys; values accessed and updated correctly; demonstrates clear understanding of key-value pairs. | Dictionaries created and accessed correctly; minor issues updating values. | Dictionaries used but key access or updates contain errors. | Dictionaries attempted but significant structural errors. | No evidence of dictionaries used correctly. |
| Student Management Program /5 marks | Program correctly stores students as a list of dictionaries; add, search, and average functions all work correctly; at least one function takes the list as a parameter. | Program works correctly for most features; minor issues with one function. | Program partially works; one major feature (add/search/average) missing or broken. | Program attempts the structure but most features do not work. | No working student management program submitted. |
| Reflection /5 marks | Reflection clearly explains the difference between a list and a dictionary, with a specific example of when each is useful, drawn from their own program; uses correct terminology (key, value, index, element). | Reflection explains lists and dictionaries with mostly specific examples; mostly correct terminology. | Reflection present but explanation is vague or examples are generic. | Very brief reflection; minimal explanation. | No reflection submitted. |
Open tynker.com and try one Hour of Code level involving collections or arrays - student-led, just click and play.
By the end of this lesson you will be able to create a list, access items by index, loop through a list with for, and add new items with append().
- A list stores multiple values in one variable, in order. Try:
fruits = ["apple", "banana", "cherry"]
print(fruits)
print(fruits[0]) # first item - lists start at index 0
print(fruits[2]) # third item - Loop through every item in a list:
for fruit in fruits:
print("I like", fruit) - Add new items with
.append():fruits.append("mango")
print(fruits)
print("There are", len(fruits), "fruits") - Save this as
task2_lists.py. Create a list of at least 5 of your favourite songs, artists, or games. Loop through it and print each one numbered (e.g. "1. Item"). - Challenge: write a program that asks the user for 5 numbers (using
input()andappend()), then prints the total and average usingsum()andlen().
[0], not [1]. A list with 5 items has valid indexes 0 to 4. Trying to access [5] on a 5-item list causes an IndexError.
Save task2_lists.py to your Documents. You'll submit all practice files together at the end of Week 6.
Open checkio.org and read through a beginner puzzle involving lists or sorting - think about the logic before coding. Student-led.
By the end of this lesson you will be able to sort a list, check whether an item exists using in, remove items, and use slicing to access parts of a list.
- Continue in
task2_lists.py. Try sorting:scores = [85, 42, 90, 67, 73]
scores.sort()
print(scores) # lowest to highest
scores.sort(reverse=True)
print(scores) # highest to lowest - Check if an item exists using
in:names = ["Alex", "Priya", "Sam"]
if "Priya" in names:
print("Found her!")
else:
print("Not in the list.") - Remove items with
.remove(), and access a range with slicing[start:end]:names.remove("Sam")
print(names)
numbers = [10, 20, 30, 40, 50]
print(numbers[1:4]) # items at index 1, 2, 3 - Write a program: create a list of 6 test scores. Sort it, print the highest and lowest (first and last after sorting), and print the top 3 using slicing.
- Add to your song/artist list from Lesson 1: write code that checks if a specific title is in your list, and removes one item.
my_list.sort() sorts the list in place - it does NOT return a new list. Writing my_list = my_list.sort() will set my_list to None! Just call my_list.sort() on its own line.
Kahoot teacher-run quiz on lists from Week 4. Student-led from there - just join and play!
By the end of this lesson you will be able to create a dictionary, access values by key, add new key-value pairs, and update existing values.
- A dictionary stores data as key-value pairs - instead of a numbered index, you look things up by name:
student = {
"name": "Alex",
"score": 85,
"grade": "B"
}
print(student["name"])
print(student["score"]) - Update or add values using the key:
student["score"] = 92 # update existing key
student["year"] = 10 # add a new key
print(student) - Loop through all keys and values:
for key, value in student.items():
print(key, "->", value) - Save this as
task2_dictionaries.py. Create a dictionary representing yourself (name, age, favourite game, etc.) with at least 4 keys. Print each key and value using.items(). - Challenge: write a function
describe(person)that takes a dictionary as a parameter andreturns a sentence describing them using the dictionary's values.
Open codingame.com and browse a beginner challenge involving data records - read the problem and plan your approach. Student-led.
By the end of this lesson you will be able to combine lists and dictionaries to represent multiple records, and loop through them to find or filter specific entries.
- This is the structure your
students.pyprogram will use - a list of dictionaries, where each dictionary is one record:students = [
{"name": "Alex", "score": 85},
{"name": "Priya", "score": 92},
{"name": "Sam", "score": 67}
] - Loop through the list - each
studentis one dictionary:for student in students:
print(student["name"], "scored", student["score"]) - Search for a specific record:
search_name = input("Enter a name to search: ")
for student in students:
if student["name"] == search_name:
print("Found:", student) - Calculate the class average:
total = 0
for student in students:
total += student["score"]
average = total / len(students)
print("Class average:", average) - Start
students.py: build the list of dictionaries above with at least 5 students, then implement the search and average code from steps 3-4.
students.py program needs to do: store students, add a new student, search by name, calculate the average, and assign a grade based on score. Build and test each piece one at a time.
By the end of this lesson you will be able to write a function that takes a list as a parameter and modifies it, and use conditionals to assign a grade based on a score.
- Write a function
add_student(students)that asks the user for a name and score, then appends a new dictionary to thestudentslist:def add_student(students):
name = input("Enter student name: ")
score = int(input("Enter their score: "))
students.append({"name": name, "score": score}) - Notice this function doesn't need to
returnanything - because lists are mutable, changes made inside the function affect the original list directly. - Write a function
get_grade(score)that returns a letter grade based on the score (A: 85+, B: 70+, C: 50+, D: 40+, E: below 40). - Update your average calculation to also print each student's name with their grade, using your
get_grade()function:for student in students:
grade = get_grade(student["score"])
print(student["name"], "-", student["score"], "- Grade", grade) - Put it all together: your program should add students, search by name, calculate the average, and display each student's grade.
return. But numbers and strings are immutable - a function like def add_one(n): n += 1 does NOT change the original variable outside the function. This trips up a lot of students!
By the end of this lesson you will be able to build a simple menu-driven program using a while loop, test your program thoroughly, and submit Task 2 with a written reflection.
- Tie your program together with a menu loop so the user can choose what to do:
while True:
print("\n1. Add student")
print("2. Search for a student")
print("3. Show class average")
print("4. Quit")
choice = input("Choose an option: ")
if choice == "1":
add_student(students)
elif choice == "4":
break - Fill in the remaining menu options (2 and 3) by calling the functions you've already written.
- Test your program thoroughly: add at least 2 new students, search for one that exists and one that doesn't, and confirm the average updates correctly.
- Write your reflection (5-8 sentences): explain the difference between a list and a dictionary using a specific example from your own program, and describe one bug you fixed and how.
Upload to connect.det.wa.edu.au: all three .py files and your written reflection. Verify your upload was successful before leaving class.
Design and code a simple object-oriented Python program using classes, attributes, and methods. Build a small simulation - such as a pet, character, or vehicle system - with at least two classes that work together, bringing in functions, file handling, lists, and dictionaries from Module 1.
task3_classes.py- practice file defining your first class with attributes and methodssimulation.py- your final OOP simulation with at least 2 classes- Planning document - class diagram or notes describing your classes, attributes, and methods
- Short written reflection (5-8 sentences)
- At least 2 classes, each with their own attributes (using
__init__) - Each class has at least 2 methods that do something useful
- At least one class creates or uses objects of the other class
- Program creates multiple objects (instances) and shows them behaving differently
- Uses a list to store multiple objects of the same class
- All programs run without errors; meaningful class/method names
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Class Design /5 marks | At least 2 well-designed classes with meaningful attributes set via __init__; clear separation of responsibilities between classes. | 2 classes with attributes correctly set via __init__; minor design issues. | 2 classes present but attributes or __init__ contain errors. | Only 1 class with a working __init__, or significant structural errors. | No classes defined or program does not run. |
| Methods & Behaviour /5 marks | Each class has 2+ methods that work correctly and do something meaningful; methods use self correctly throughout. | Methods present and mostly correct; minor errors with self or logic. | Methods present but some do not work as intended. | Methods attempted but mostly incorrect or missing self. | No working methods. |
| Objects & Interaction /5 marks | Multiple objects created and behave independently; objects of one class correctly interact with or contain objects of another; a list stores multiple objects correctly. | Multiple objects created and mostly independent; some interaction between classes; list used. | Objects created but interaction between classes is limited or list usage has errors. | Only one object created or objects do not behave independently. | No objects created or program does not demonstrate OOP. |
| Planning & Reflection /5 marks | Planning document clearly describes classes, attributes, and methods before coding began; reflection explains what a class and an object are with specific examples from their own program, using correct terminology. | Planning document present and mostly matches final program; reflection explains class/object with mostly correct terminology. | Planning document present but basic; reflection is vague about class/object distinction. | Minimal planning; reflection very brief or generic. | No planning document or reflection submitted. |
Open code.org and try one Hour of Code activity - student-led, just click and play, while thinking about how "things" in the game have properties (health, position, etc.).
By the end of this lesson you will be able to define a class with __init__, give it attributes, and create multiple objects (instances) from it.
- A class is a blueprint for creating objects. Try this:
class Pet:
def __init__(self, name, animal_type):
self.name = name
self.animal_type = animal_type
self.hunger = 5
my_pet = Pet("Rex", "Dog")
print(my_pet.name)
print(my_pet.animal_type)
print(my_pet.hunger) __init__runs automatically when you create a new object.selfrefers to "this specific object" - every attribute you set withself.belongs to that object.- Create a second object from the same class:
second_pet = Pet("Whiskers", "Cat")
print(second_pet.name)
print(my_pet.name) # still "Rex" - separate objects! - Save this as
task3_classes.py. Create your own class with at least 3 attributes (e.g. a Character, Vehicle, or Player class - your choice for your final simulation). Create 2 different objects from it and print their attributes. - Challenge: create a list containing both of your objects, then loop through the list and print each object's name attribute.
Save task3_classes.py to your Documents - this is your starting point for the final simulation.
Open checkio.org and read through a beginner puzzle involving objects or classes - think about the logic before coding. Student-led.
By the end of this lesson you will be able to add methods to a class that change an object's attributes and return information about its state.
- A method is a function that belongs to a class. Add one to your Pet class:
class Pet:
def __init__(self, name, animal_type):
self.name = name
self.animal_type = animal_type
self.hunger = 5
def feed(self):
self.hunger -= 1
print(self.name, "has been fed. Hunger is now", self.hunger) - Call the method on your object:
my_pet = Pet("Rex", "Dog")
my_pet.feed()
my_pet.feed()
print(my_pet.hunger) - Add a second method that
returns something instead of just printing - e.g. a methodis_hungry(self)that returnsTrueifhunger > 7, otherwiseFalse. - In
task3_classes.py, add at least 2 methods to the class you created in Lesson 1 - one that changes an attribute, and one that returns information based on the current attribute values. - Test your methods by creating 2 objects, calling the methods on each, and confirming each object's state changes independently.
self as its first parameter - even if you don't use it directly. Forgetting it, or forgetting to write self. before an attribute name, is one of the most common OOP errors.
Kahoot teacher-run quiz on classes, objects, and methods from Week 7. Student-led from there - just join and play!
By the end of this lesson you will be able to plan a simulation involving two classes that work together, and begin building it in simulation.py.
- Choose your simulation idea. Some examples: a Zoo (Zookeeper class manages a list of Animal objects), a Garage (Mechanic class repairs Car objects), a Classroom (Teacher class manages a list of Student objects), or a Game (Player class fights Monster objects).
- On paper or in a comment block, plan: What are your two classes called? What attributes does each have (from
__init__)? What methods does each have? How do they interact - does one class create or use objects of the other? - Example structure for a Zoo simulation:
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
self.fed = False
def feed(self):
self.fed = True
print(self.name, "has been fed.")
class Zoo:
def __init__(self, zoo_name):
self.zoo_name = zoo_name
self.animals = []
def add_animal(self, animal):
self.animals.append(animal) - Start
simulation.py. Define your two classes with__init__and at least their first attributes. Don't worry about methods yet - get the structure right first. - Submit your planning notes/diagram alongside your final files in Week 9.
By the end of this lesson you will be able to create objects that store and manage other objects, and write methods that make your two classes interact.
- Continue building
simulation.py. Add the methods you planned last lesson to both classes. - Create the "container" object first, then add other objects to it:
my_zoo = Zoo("DigiTech Zoo")
lion = Animal("Leo", "Lion")
giraffe = Animal("Spots", "Giraffe")
my_zoo.add_animal(lion)
my_zoo.add_animal(giraffe) - Write a method on your container class that loops through its list of objects and calls a method on each - e.g. a
feed_all(self)method on Zoo:def feed_all(self):
for animal in self.animals:
animal.feed() - Test: create at least 3 objects of your "item" class, add them all to your "container" class, and call a method that processes all of them.
- If you have time, add one more method to each class - aim for at least 2 working methods per class by the end of this lesson.
Open projecteuler.net and read Problem 1 - think about how you'd structure a solution. Student-led.
By the end of this lesson you will be able to thoroughly test your simulation with multiple objects, identify and fix bugs, and add final touches like a simple menu or summary output.
- Test your simulation by creating at least 3-4 objects of your "item" class and confirming each one behaves independently - changing one object's attributes should NOT affect the others.
- Run through every method at least once. For each one, ask: does it do what I expect? Does it use
selfcorrectly? - Add a simple "summary" method or loop that prints the current state of all your objects - e.g. every animal's name and whether they've been fed.
- If you have time, add a small menu loop (like Task 2) so a user can interact with your simulation - e.g. choose to feed a specific animal by name.
- Fix any remaining errors. Make sure your final program runs from start to finish without crashing.
print() statements inside your methods to show the value of self.attribute at each step. This helps you see exactly when and where something goes wrong - remove these prints once fixed.
By the end of this lesson you will be able to write a reflection that explains classes and objects using your own program, and submit all Task 3 materials.
- Do a final test run of
simulation.pyfrom start to finish - make sure there are no leftover debugging print statements you didn't mean to keep (unless they're part of your output). - Write your reflection (5-8 sentences). Include: what your two classes represent and why you chose them; one specific example of an attribute and a method from your own code, explained in your own words; and one challenge you faced with OOP and how you solved it.
- Look back over Module 1 (Tasks 1-3): in 2-3 sentences, describe how functions, file handling, lists, dictionaries, and classes connect - how did each task build on the last?
- Gather your final files:
task3_classes.py,simulation.py, your planning notes/diagram, and your reflection.
Upload to connect.det.wa.edu.au: both .py files, your planning document, and your written reflection. Verify your upload was successful before leaving class.
You've completed three Python tasks covering functions, return values, file handling, data structures, and OOP. Week 10 is yours - no marks, no submission. Explore what else Python can do.
Choose your own adventure for Week 10:
- Build a simple text-based diary program using file handling - write a new entry to a file every time you run it (append mode), and read back all past entries
- Codingame puzzle race - challenge a classmate to solve beginner Python puzzles faster at codingame.com
- Project Euler - attempt Problem 1 or 2 at projecteuler.net - pure mathematical programming using functions
- Extend your Task 3 simulation with a brand new class of your own design - what else could your Zoo, Garage, or Classroom contain?
End of lesson: your teacher will do a quick showcase - show one thing you built or discovered. No marks, just sharing.
Learn the fundamentals of game design - mechanics, rules, feedback, and win/lose conditions - then build your first playable game in GDevelop: a single-screen arcade game with player movement, an enemy or obstacle, a scoring system, and a clear win or lose condition.
- Game design notes - your game's core mechanic, win/lose condition, and target player feeling
- GDevelop project file - a working single-screen arcade game
- At least one playable character with movement controls
- A scoring system that updates and displays on screen
- Short written reflection (5-8 sentences)
- Player character moves using keyboard input (arrow keys or WASD)
- At least one other object (enemy, obstacle, or collectible) with its own behaviour
- A score variable that changes based on player actions and displays on screen
- A clear win condition AND a clear lose condition
- Game is playable from start to finish without crashing
- Game design notes completed before significant building began
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Game Design Notes /5 marks | Notes clearly describe the core mechanic, win/lose conditions, and intended player feeling before building began; notes match the final game closely. | Notes describe mechanic and conditions; mostly match final game. | Notes present but basic; some elements of final game not planned. | Minimal notes; little connection to final game. | No design notes submitted. |
| Player Movement /5 marks | Player character moves smoothly and responsively using keyboard input; movement feels intentional and fits the game's design. | Player character moves correctly with keyboard input; minor responsiveness issues. | Movement works but is clunky or only partially responsive. | Movement attempted but significantly broken. | No player movement implemented. |
| Scoring & Objects /5 marks | Score variable updates correctly based on player actions and displays clearly on screen; at least one other object has working behaviour that connects to scoring or game state. | Score updates and displays; one other object has working behaviour. | Score present but updates inconsistently; other object behaviour limited. | Score attempted but largely non-functional. | No scoring system implemented. |
| Win/Lose & Reflection /5 marks | Game has a clear, working win condition AND lose condition; game is playable start to finish without crashing; reflection explains design choices using game design vocabulary. | Win and lose conditions both work; game playable; reflection mostly specific. | One of win/lose conditions works; game mostly playable; reflection present but vague. | Win/lose conditions attempted but broken; reflection very brief. | No win/lose conditions; reflection not submitted. |
Play a short round of any classic arcade game you have access to (browser-based or classroom). As you play, notice: what are the rules? What happens when you win or lose? Student-led.
By the end of this lesson you will be able to describe a game's core mechanic, rules, feedback, and win/lose conditions, and begin planning your own arcade game.
- As a class, discuss: what is a mechanic (the core action the player repeats - jumping, shooting, dodging, collecting)? What are rules (what's allowed, what isn't)? What is feedback (sounds, animations, score changes that tell the player what just happened)?
- Pick 2 games you know well (arcade, mobile, or console). For each, write down: the core mechanic, one rule, one piece of feedback, and the win/lose condition.
- Brainstorm 3 ideas for your own simple arcade game. For each idea, write one sentence describing the core mechanic (e.g. "dodge falling obstacles", "collect coins before time runs out", "shoot approaching enemies").
- Choose your favourite idea. Write your game design notes: core mechanic (1 sentence), win condition (1 sentence), lose condition (1 sentence), and the feeling you want the player to have (e.g. tense, fast-paced, satisfying).
- Sketch (on paper or digitally) what your game's single screen will look like - where is the player, where do enemies/obstacles appear, where is the score shown?
Keep your game design notes and sketch - you'll need them for Lesson 2 and your final submission.
By the end of this lesson you will be able to navigate the GDevelop interface, create a new project, add a scene, and place sprite objects on screen.
- Open GDevelop (browser-based - no install needed, no consent required). Create a new empty project.
- A GDevelop project is made of scenes (like levels or screens) and objects (sprites, characters, text, etc.) placed on those scenes. Explore the main editor: the scene view, the objects panel, and the events sheet.
- Add a new Sprite object - this will become your player character. Choose or import an image, and place it on the scene.
- Add 1-2 more objects based on your game design notes: an enemy/obstacle sprite, and a text object for displaying the score.
- Save your project with a clear name (e.g.
my_arcade_game). Get into the habit of saving regularly throughout this module.
Kahoot teacher-run quiz on game design vocabulary from Week 1. Student-led from there - just join and play!
By the end of this lesson you will be able to use GDevelop's events sheet to make your player object move in response to keyboard input.
- Open your project's events sheet (usually below the scene editor). Events follow a pattern: Condition (something that must be true) → Action (something that happens).
- Add a new event. For the condition, choose "Key pressed" and select an arrow key (e.g. Right arrow). For the action, choose your player object and "Move object" or "Change position" - set it to move right by a small amount each frame.
- Repeat for Left, Up, and Down arrows (or WASD), each moving the player in the corresponding direction.
- Preview your game (the "play" button). Test that your player moves smoothly in all 4 directions. If movement feels too slow or too fast, adjust the movement amount and test again.
- Decide: should your player be able to move off the edges of the screen? If not, add a condition that keeps the player's position within the scene boundaries.
By the end of this lesson you will be able to detect collisions between objects, create a score variable, and update a text object to display the score.
- Create a new scene variable called
Scoreand set its starting value to 0 (usually done in "At the beginning of the scene" event). - Add a collision event: Condition = "Player is in collision with [other object]". For the action, choose what should happen - increase the Score variable by an amount (e.g. +10), and/or delete or hide the collided object (so it can't be collected twice).
- Update your score display: add an event with no condition (always true), and an action that changes the text of your score text object to show the current value of the
Scorevariable, e.g."Score: " + Score. - Preview your game. Move your player into the other object and confirm the score updates and displays correctly.
- If your design includes an enemy that should cause the player to lose (rather than score), set up a separate collision event for that - but leave full win/lose logic for Lesson 5.
Open gdevelop.io/games and play one or two example games made by other creators - notice how each one shows you've won or lost. Student-led.
By the end of this lesson you will be able to implement a win condition and a lose condition that clearly end the game and give the player feedback.
- Refer back to your game design notes from Lesson 1 - what is your win condition? What is your lose condition? (e.g. "Score reaches 100" / "Player collides with enemy 3 times").
- For your lose condition: add an event with the condition (e.g. collision with enemy, or a "lives" variable reaching 0), and an action that changes the scene to a "Game Over" scene, or displays a "Game Over" text object and pauses the game.
- For your win condition: add an event with the condition (e.g. Score variable ≥ a target value), and an action that displays a "You Win!" message or changes to a "Victory" scene.
- If you're using separate scenes for game over / victory, create them now with simple text and a way to restart (e.g. a button that returns to the main scene).
- Preview and test BOTH conditions - deliberately try to lose, then deliberately try to win (you can temporarily lower the win target to test faster, then change it back).
By the end of this lesson you will be able to playtest your game with a classmate, make improvements based on feedback, and submit Task 4 with a written reflection.
- Swap computers with a classmate (or have them play on your screen). Watch them play your game without giving instructions - can they figure out the controls and goal on their own?
- Ask your playtester: was anything confusing? Did movement feel responsive? Was it clear when they won or lost?
- Make at least 2 improvements based on the feedback - this might be adjusting movement speed, adding a simple instruction text, or fixing a bug they found.
- Final check: play your game from start to finish at least twice - once trying to win, once trying to lose - confirming both conditions work correctly.
- Write your reflection (5-8 sentences): describe your game's core mechanic and win/lose conditions, one piece of feedback you received and how you responded to it, and one challenge you faced building in GDevelop.
Export or save your GDevelop project file, and upload it along with your game design notes and reflection to connect.det.wa.edu.au. Verify your upload was successful before leaving class.
Expand your Task 4 game into a complete arcade experience. Add multiple levels or increasing difficulty over time, sound effects, and visual polish. Apply an iterative design process - build, playtest with classmates, gather feedback, and improve.
- Updated GDevelop project - expanded version of your Task 4 game
- At least 2 distinct levels OR one level with clearly increasing difficulty over time
- Sound effects for at least 2 different game events
- Playtesting log - notes from at least 2 playtesters and changes you made
- Short written reflection (5-8 sentences)
- Game has more content or challenge than the Task 4 version
- At least 2 sound effects trigger correctly during gameplay
- Visual polish: backgrounds, animations, or UI improvements beyond Task 4
- Playtesting conducted with at least 2 different classmates
- At least 2 specific changes made as a direct result of playtester feedback
- Game remains playable start to finish without crashing
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Levels & Difficulty /5 marks | Game has 2+ clearly distinct levels OR difficulty that increases noticeably and appropriately over time; progression feels intentional and well-paced. | 2 levels present or difficulty increases; progression mostly clear. | Some change in levels/difficulty but limited or inconsistent. | Minimal attempt at levels or difficulty change. | No levels or difficulty progression - identical to Task 4. |
| Sound & Visual Polish /5 marks | 2+ sound effects trigger correctly and appropriately; visual polish (backgrounds, animations, UI) significantly improves on Task 4 and supports the game's feel. | 2 sound effects work; some visual polish added. | 1 sound effect works; minor visual changes. | Sound or visual changes attempted but mostly non-functional. | No sound effects or visual polish added. |
| Playtesting Process /5 marks | Playtesting log shows genuine feedback from 2+ testers with specific, useful comments; clear connection between feedback and changes made. | Playtesting log present with feedback from 2 testers; mostly connected to changes. | Playtesting log present but feedback vague or connection to changes unclear. | Minimal playtesting log; feedback generic. | No playtesting log submitted. |
| Iteration & Reflection /5 marks | At least 2 specific, meaningful changes made as a direct result of feedback; reflection clearly explains the iterative design process using correct vocabulary (iteration, playtesting, feedback). | 2 changes made from feedback; reflection mostly clear. | 1 change made from feedback; reflection present but basic. | Changes made but not clearly linked to feedback; reflection very brief. | No changes made from feedback; no reflection. |
Think of a game you've played that gets harder over time. How does it get harder - faster enemies, more enemies, less time, smaller spaces? Discuss with a classmate. Student-led.
By the end of this lesson you will be able to plan how your game will become more challenging, either through distinct levels or a difficulty curve within one level.
- Open your Task 4 project. Decide: will you build a second scene as Level 2 (copy your scene and make it harder), or make your single level get harder over time (more enemies spawn, speed increases, time limit decreases)?
- Either approach is valid - choose based on what fits your game and what you can realistically build in 3 weeks.
- Write a short plan: if levels, what's different about Level 2 (more enemies? faster? new obstacle)? If a difficulty curve, what variable will you use to track progress (a timer? the score?) and how will difficulty respond to it?
- If building a second scene: duplicate your Task 4 scene, rename it (e.g. "Level2"), and add a transition event from Level 1 to Level 2 (e.g. when score reaches a target, change scene).
- If building a difficulty curve: identify ONE value you'll change over time (e.g. enemy speed, spawn rate) and plan how it will increase - gradually, or in steps every X seconds.
By the end of this lesson you will be able to implement your planned levels or difficulty curve in GDevelop and test that it works as intended.
- If building Level 2: finish duplicating and modifying your second scene now - add more/faster enemies, a new obstacle type, or a different layout. Add the scene-change event so Level 1 leads to Level 2.
- If building a difficulty curve: GDevelop has a built-in
TimeDeltaand timers. Create a timer, and add an event: "If timer > X seconds, increase [enemy speed / spawn rate variable] by a small amount." - Preview your game and play through to where the change should occur. Does it feel right? If the difficulty jumps too suddenly or too slowly, adjust your numbers.
- Add a second stage of difficulty increase (either a Level 3, or a further timer-based increase) so the progression has at least 2 distinct steps.
- Save your project. You now have an expanded game ready for sound and visual polish next lesson.
Kahoot teacher-run quiz on Weeks 1-4 game design and GDevelop concepts. Student-led from there - just join and play!
By the end of this lesson you will be able to add sound effects to your game that play in response to specific events.
- GDevelop includes a library of free sound effects, or you can use sounds your teacher provides. Browse the audio resources in your project's resource manager.
- Choose a sound effect for your scoring event (collecting an item, hitting a target). Add a "Play a sound" action to your collision/scoring event from Task 4.
- Choose a different sound effect for your lose condition (game over, hitting an enemy). Add a "Play a sound" action to that event.
- Preview your game. Confirm both sounds play at the correct moments and aren't too loud or jarring.
- If you have time, add a third sound - for example, a "level up" sound when difficulty increases, or background music that plays continuously.
By the end of this lesson you will be able to improve your game's visual presentation through backgrounds, simple animations, and clearer on-screen information.
- Add a background image or coloured background to your scene(s) - this immediately makes a game feel more finished. Use GDevelop's built-in resources or images approved by your teacher.
- If your player or enemy sprites have multiple images, set up a simple animation (e.g. a walking or rotating animation) using the Sprite object's animation editor.
- Improve your UI: make sure your score text is clearly visible (good contrast against the background), and consider adding instructions text (e.g. "Use arrow keys to move") visible at the start of the game.
- Tidy up any remaining visual issues - objects overlapping awkwardly, text running off screen, or inconsistent sizing.
- Preview your game with fresh eyes - does it look more "finished" than your Task 4 version? Note 2-3 specific improvements you made for your playtesting log.
Think about the last time you gave feedback on something (a piece of work, a game, a video). What made your feedback useful - or not useful? Discuss with a classmate. Student-led.
By the end of this lesson you will be able to conduct structured playtesting with classmates and record specific, useful feedback.
- Start your playtesting log - a simple table or list with columns: Tester Name, What They Said, What I'll Change.
- Find a playtester (a classmate). Before they play, ask them NOT to ask you questions - just play and react naturally. Watch quietly and take notes on where they get stuck, confused, or frustrated.
- After they play, ask 3 specific questions: "What was the goal of the game?" "Was anything confusing?" "What's one thing you'd change?"
- Record their answers in your playtesting log. Repeat with a second playtester (this can happen across this lesson and the start of Lesson 6 if needed).
- Look at both sets of feedback - are there common themes? Prioritise 2 changes you'll make based on what you heard.
By the end of this lesson you will be able to make targeted changes based on playtester feedback, and submit Task 5 with a completed playtesting log and reflection.
- Implement the 2 priority changes you identified at the end of Lesson 5. For each, write a brief note in your playtesting log: what feedback prompted this, and what you changed.
- If time allows, do a quick second playtest with the same or a different classmate - does the change improve things?
- Do a final full playthrough yourself: confirm levels/difficulty progression works, sounds play correctly, and visuals look polished.
- Finish your playtesting log - make sure it includes feedback from at least 2 testers and at least 2 documented changes.
- Write your reflection (5-8 sentences): describe the iterative process - what feedback you received, what you changed, and whether the changes improved the game. Use the words "iteration," "playtesting," and "feedback" correctly.
Export or save your updated GDevelop project file, and upload it along with your playtesting log and reflection to connect.det.wa.edu.au. Verify your upload was successful before leaving class.
Add Logitech controller support to your arcade game so it can be played with a gamepad instead of a keyboard. Map controller inputs to your existing game actions, test thoroughly, apply final polish, and present your finished game at a classroom arcade showcase.
- Final GDevelop project - controller-enabled version of your game
- Controller mapping notes - which buttons/sticks do what
- Showcase presentation - a short demo of your game to the class
- Short written reflection (5-8 sentences)
- Player movement responds correctly to a Logitech controller
- At least one other action (e.g. jump, shoot) mapped to a controller button
- Game still works correctly with keyboard as a fallback
- Controller mapping notes clearly document button assignments
- Game presented live to the class during the showcase
- Final build is stable and free of major bugs
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Controller Movement /5 marks | Player movement responds smoothly and correctly to the controller's analog stick or D-pad; feels as responsive as keyboard controls. | Movement responds correctly to controller; minor responsiveness issues. | Movement responds to controller but with noticeable lag or inconsistency. | Controller movement attempted but largely non-functional. | No controller movement implemented. |
| Controller Actions /5 marks | At least one additional action correctly mapped to a controller button; keyboard fallback still works correctly. | One action mapped to controller; keyboard mostly still works. | Action mapping attempted but unreliable; keyboard fallback partially broken. | Action mapping attempted but non-functional. | No additional controller actions implemented. |
| Mapping Notes & Stability /5 marks | Mapping notes clearly and accurately document every button assignment; final build runs without crashes across multiple playthroughs. | Mapping notes mostly complete; build is stable with only minor issues. | Mapping notes present but incomplete; occasional stability issues. | Minimal mapping notes; build has noticeable stability issues. | No mapping notes; build is unstable or unplayable. |
| Showcase & Reflection /5 marks | Confident, clear presentation of the game to the class, including controls and design choices; reflection thoughtfully connects controller implementation to the overall design and development process across Module 2. | Clear presentation; reflection connects controller work to the module. | Presentation given but brief; reflection present but limited connection to the module. | Minimal presentation; reflection very brief. | No presentation given; no reflection submitted. |
Plug in a classroom Logitech controller and try it with any browser-based game that supports gamepads - notice how it's recognised. Student-led.
By the end of this lesson you will be able to connect a Logitech controller to your computer and research how GDevelop detects and uses gamepad input.
- Connect your classroom Logitech controller via USB. Most modern browsers and GDevelop's preview will detect it automatically - no extra software needed.
- In GDevelop, look in the events sheet for conditions related to "Gamepad" or "Joystick" - explore what's available (button presses, analog stick positions, triggers).
- Research: search for "GDevelop gamepad controller tutorial" and read through how others have set up controller support. Note down the general approach.
- Plan your mapping: start a controller mapping document. List your game's current actions (move up/down/left/right, score action, etc.) and which controller input you'll map each to (e.g. left analog stick = movement, A button = action).
- Test that your controller is detected in a GDevelop preview - even before adding any events, check the "gamepad connected" condition shows true when you press a button.
Keep your controller mapping document - you'll build on it throughout this task.
By the end of this lesson you will be able to add events that move your player character in response to controller stick or D-pad input, alongside your existing keyboard events.
- Open your existing movement events from Task 4 (Lesson 3). For each direction, you'll add an additional condition for controller input.
- Add a new event: Condition = "Gamepad: left analog stick moved right" (or equivalent D-pad button), Action = same movement action as your keyboard "right" event.
- Repeat for left, up, and down - either as separate events alongside your keyboard ones, or by adding the controller condition as an "OR" to your existing events if GDevelop's interface supports it cleanly.
- Preview your game with the controller connected. Test movement in all 4 directions using the controller, then test again with the keyboard - both should work.
- Update your controller mapping document: confirm which stick/D-pad inputs are now mapped to movement.
Kahoot teacher-run quiz on Module 2 concepts so far. Student-led from there - just join and play!
By the end of this lesson you will be able to map a non-movement action (e.g. jump, shoot, interact) to a controller button, and thoroughly test both keyboard and controller play.
- Identify one non-movement action in your game - this might be jumping, shooting, an interaction, or pausing. Find the existing keyboard event for this action.
- Add a controller condition for a face button (e.g. "Gamepad button 0 pressed" - often the A/X button depending on controller layout) that triggers the same action.
- Preview and test: with the controller connected, confirm the button press triggers the action correctly. Then disconnect (or ignore) the controller and confirm the keyboard still triggers it too.
- Update your controller mapping document with this new button assignment - be specific (e.g. "Button 0 (bottom-right face button) = Jump").
- Do a full test playthrough using ONLY the controller, start to finish. Note any moments where something doesn't respond as expected.
By the end of this lesson you will be able to identify and fix remaining bugs, and ensure your game runs stably for a live showcase.
- Do at least 3 full playthroughs of your game - once with keyboard only, once with controller only, and once switching between both mid-game. Note any bugs or unexpected behaviour.
- Fix any bugs found. Common issues at this stage: controller and keyboard inputs conflicting (e.g. character moving twice as fast when both are used), or controller inputs not being recognised after a scene change.
- Review your whole game one more time against your original Task 4 design notes and Task 5 additions - does everything still work together (levels/difficulty, sounds, visuals, controller)?
- Prepare for the showcase: think about how you'll demonstrate your game in 1-2 minutes. What will you show first? What's the "highlight" moment you want classmates to see?
- Finalise your controller mapping document - it should be clear enough that someone else could pick up the controller and know what each button does.
Think about a presentation or demo you've seen that was engaging. What made it work? Discuss with a classmate. Student-led.
By the end of this lesson you will be able to plan and rehearse a short, clear presentation of your finished arcade game.
- Plan your showcase presentation (aim for 1-2 minutes): introduce your game's core mechanic and theme, demonstrate gameplay with the controller, point out one feature you're proud of (e.g. the difficulty progression, a sound effect, the controller mapping).
- Practice your demo at least twice with a classmate. Time yourself - is it too long, too short, too rushed?
- Get feedback from your practice run: was your explanation clear? Did the controller demo work smoothly?
- Make any final small adjustments based on this feedback - to either your game or your presentation plan.
- Write a brief outline (3-5 bullet points or sentences) of what you'll say and show during the showcase - this can be informal notes for yourself.
By the end of this lesson you will have presented your finished arcade game to the class, and submitted all Task 6 materials with a final reflection.
- Showcase time! Present your game to the class (or in small groups, depending on class size) following your plan from Lesson 5 - introduce, demo with the controller, highlight one feature.
- While watching classmates' showcases, note one thing you found interesting or impressive about a different game - you might use this as inspiration for your Module 4 capstone later in the year.
- After the showcase, write your reflection (5-8 sentences): describe your controller mapping approach, one challenge in getting controller input to work correctly, and how your game changed across Tasks 4, 5, and 6.
- Do a final check of your project file - make sure it's the most up-to-date version with controller support included.
- Gather your final files: your GDevelop project, controller mapping document, and reflection.
Export or save your final GDevelop project file, and upload it along with your controller mapping document and reflection to connect.det.wa.edu.au. Verify your upload was successful before leaving class.
Module 2 is complete - your arcade games are built and controller-enabled! Week 10 is a celebration: play each other's games, try new mechanics in GDevelop, or remix a classmate's game with their permission.
Choose your own adventure for Week 10:
- Arcade Cabinet rotation - set up your laptop with your game and controller, and rotate around the room playing classmates' games
- Remix Lab - with a classmate's permission, open their GDevelop project and try adding ONE new feature (a new enemy type, a power-up, a new sound) - then change it back if they prefer
- GDevelop Examples - explore the official example games at gdevelop.io/games and try to identify one mechanic you could add to your own game in the future
- Mini Tournament - if your game has a score, run a class leaderboard for the highest score achieved during the session
End of lesson: vote for your favourite game played today (not your own!) - just for fun, no marks involved.
Identify a real problem that a web app could help solve - for yourself, your school, or your community. Plan the app's features and user flow, create wireframes for every screen, and build the static HTML/CSS structure for your app's main pages, ready for JavaScript in Task 8.
- Problem statement - what your app does and who it's for (2-3 sentences)
- Wireframes - at least 2 screens, sketched or digital
- User flow diagram - how a user moves between screens
index.html+style.css- static structure for your main page, matching your wireframes- Short written reflection (5-8 sentences)
- Problem statement describes a real, specific problem (not too broad)
- Wireframes show layout for at least 2 distinct screens/views
- HTML uses semantic elements (header, nav, main, section, footer)
- CSS uses flexbox or grid for layout - not just inline styles
- Page structure matches the wireframes reasonably closely
- Files open correctly in a browser with no broken structure
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Problem & Planning /5 marks | Problem statement is specific, realistic, and clearly identifies who the app helps and how; planning shows genuine thought about features and scope. | Problem statement is clear and realistic; planning is mostly thorough. | Problem statement present but vague or overly broad; planning is basic. | Problem statement minimal or unclear; little planning evident. | No problem statement or planning submitted. |
| Wireframes & User Flow /5 marks | Wireframes clearly show layout for 2+ screens with key elements labelled; user flow diagram clearly shows how screens connect. | Wireframes show 2 screens with most elements; user flow mostly clear. | Wireframes present but basic or missing labels; user flow unclear. | Only 1 wireframe or user flow missing. | No wireframes or user flow submitted. |
| HTML Structure /5 marks | HTML uses semantic elements correctly throughout (header, nav, main, section, footer); structure closely matches wireframes; valid and well-organised. | Semantic elements mostly used correctly; structure mostly matches wireframes. | Some semantic elements used; structure loosely matches wireframes. | Minimal semantic structure; mostly generic divs. | No meaningful HTML structure submitted. |
| CSS Layout & Reflection /5 marks | CSS uses flexbox or grid effectively for layout; page is visually organised and matches wireframe intent; reflection clearly explains planning decisions using correct terminology (wireframe, user flow, semantic). | CSS uses flexbox/grid with mostly correct layout; reflection mostly clear. | CSS layout attempted but inconsistent; reflection present but vague. | CSS mostly inline or unstructured; reflection very brief. | No CSS layout; no reflection submitted. |
Think of 3 web apps or websites you use regularly (school portal, a tracker, a game site). For each, what's the ONE main problem it solves for you? Discuss with a classmate. Student-led.
By the end of this lesson you will be able to identify a specific, realistic problem that a web app could help solve, and write a clear problem statement.
- Brainstorm 5 problems you, your classmates, or your school face that involve organising information, tracking something, or making a decision. Examples: tracking homework across subjects, a roster for shared equipment, a habit tracker, a study timer, a simple quiz/flashcard tool.
- For each idea, ask: who has this problem? How do they currently deal with it (or not)? Could a simple web app genuinely help?
- Narrow to your top 2 ideas. For each, write 1-2 sentences describing the problem and who it's for.
- Choose your final idea. Write your problem statement: "This app helps [who] to [do what], because currently [what's the problem]."
- List 3-5 core features your app needs to solve this problem - keep it realistic for 3 weeks of planning + building static structure (you'll add interactivity in Task 8).
Keep your problem statement and feature list - you'll build on these in Lesson 2.
By the end of this lesson you will be able to create wireframes - simple layout sketches - for at least 2 screens of your web app.
- A wireframe is a simple sketch showing where things go on a screen - boxes for content, lines for text, simple shapes for buttons. No colours or fonts needed yet - just layout.
- List the screens your app needs (e.g. "Home / main view", "Add new item", "History / list view"). Most simple apps need 2-3 screens.
- For your main screen, sketch: where is the title/heading? Where is the main content or input area? Where are any buttons or navigation?
- Repeat for at least one more screen - what's different about it? How would a user get from this screen to the other one?
- You can sketch on paper (photograph it) or use a simple digital tool (e.g. drawing in Google Slides/Docs, or a free wireframing tool your teacher suggests). Label each element clearly.
Kahoot teacher-run quiz on HTML/CSS basics from Year 9. Student-led from there - just join and play!
By the end of this lesson you will be able to create a user flow diagram showing how a user moves between your app's screens.
- A user flow is a diagram showing the path a user takes through your app - boxes for screens, arrows for actions that move between them (e.g. "click 'Add' button" → goes to "Add Item screen").
- Draw a box for each screen from your wireframes. Add arrows between boxes, labelling each arrow with the action that causes that transition (e.g. "Save button clicked").
- Walk through your user flow as if you were a first-time user: starting from the home screen, can you reach every feature? Is there a way back to the home screen from every other screen?
- If you find a "dead end" (a screen with no way back, or a feature with no path to reach it), update your wireframes or flow to fix it.
- Finalise your wireframes and user flow - these are part of your Task 7 submission.
By the end of this lesson you will be able to build the HTML structure for your main screen using semantic elements that match your wireframe.
- Create a new folder for your project, with
index.htmlandstyle.cssinside it. - Set up the basic HTML skeleton with semantic elements matching your wireframe:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>My App</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header><h1>My App Name</h1></header>
<nav><!-- navigation links --></nav>
<main><!-- main content goes here --></main>
<footer><p>© 2026</p></footer>
</body>
</html> - Inside
<main>, add the content elements your wireframe shows - headings, paragraphs, lists, input areas (even if not yet functional), buttons. Use<section>to group related content. - Open
index.htmlin a browser. Does the order of content roughly match your wireframe, even unstyled? - Add placeholder text/content for anything not yet finalised - you can refine wording later. The goal today is structure.
<header>, <nav>, <main>, <section>, and <footer> describe what content means, not just how it looks. This helps screen readers, search engines, and other developers (including future-you!) understand your page's structure at a glance.
Open Flexbox Froggy and complete a few levels - a fun way to practice flexbox properties. Student-led.
By the end of this lesson you will be able to use flexbox or grid in CSS to lay out your page's sections according to your wireframe.
- In
style.css, link your stylesheet (already done in Lesson 4) and start with basic resets:* {
box-sizing: border-box;
}
body {
font-family: Arial, sans-serif;
margin: 0;
} - Use flexbox for one-directional layouts (e.g. a row of navigation links, or items side-by-side):
nav {
display: flex;
gap: 16px;
padding: 12px;
} - Use grid for two-dimensional layouts (e.g. a card grid):
.card-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
} - Apply flexbox or grid to at least 2 sections of your page to match your wireframe's layout - e.g. navigation as a flex row, and any list/grid of items using CSS grid.
- Check your page in the browser, resizing the window - does the layout hold together reasonably well at different widths?
By the end of this lesson you will be able to finalise your static HTML/CSS structure, check it against your planning documents, and submit Task 7 with a reflection.
- Compare your
index.html+style.cssagainst your wireframes from Lesson 2 - does the layout match reasonably closely? Note any differences. - Add basic styling polish: consistent spacing (margin/padding), a simple colour scheme (2-3 colours), and readable font sizes. Keep it simple - you'll add more in Task 9.
- If your app needs a second screen (from your user flow), you can create a second HTML file now (e.g.
add.html) sharing the same stylesheet - or note this as next steps for Task 8. - Test your page in the browser one more time - check for broken layout, unclosed tags (use your code editor's error highlighting), and that navigation links (even if not yet functional) are visible.
- Write your reflection (5-8 sentences): describe your app's purpose, how your wireframes and user flow shaped your HTML structure, and one decision you changed between planning and building.
Upload to connect.det.wa.edu.au: your problem statement, wireframes, user flow diagram, HTML/CSS files, and reflection. Verify your upload was successful before leaving class.
Bring your web app to life with JavaScript. Add interactive forms, dynamic content that updates without reloading the page, and data that's saved in the browser using localStorage - so your app remembers information between visits.
script.js- JavaScript file linked to your Task 7 HTML- A working form that takes user input and adds it to the page
- Data saved to and loaded from localStorage
- At least one dynamic update - content that changes without a page reload
- Short written reflection (5-8 sentences)
- JavaScript responds to at least one form submission or button click
- New content is added to the page using JavaScript (not page reload)
- Data persists using localStorage - refreshing the page doesn't lose it
- At least one function takes a parameter and/or returns a value
- No console errors when using the app normally
- App remains usable from Task 7's HTML/CSS structure
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Form & Event Handling /5 marks | Form correctly captures user input; JavaScript responds to submission/click events reliably; input validation prevents obviously broken submissions (e.g. empty fields). | Form works correctly; events handled; minor validation gaps. | Form works in most cases; some event handling issues. | Form attempted but events don't reliably trigger JavaScript. | No working form/event handling. |
| Dynamic Content /5 marks | New content is added/updated on the page using JavaScript (e.g. creating elements, updating text) without a page reload; updates are clear and correct. | Dynamic content updates work correctly with minor issues. | Dynamic content updates partially work or are inconsistent. | Dynamic content attempted but mostly broken. | No dynamic content updates - page is static. |
| localStorage /5 marks | Data correctly saved to localStorage and loaded back on page refresh; data structure (e.g. JSON) is sensible and used correctly throughout. | localStorage works correctly with minor issues on reload. | localStorage used but data is lost or corrupted in some cases. | localStorage attempted but largely non-functional. | No use of localStorage - data lost on refresh. |
| Functions & Reflection /5 marks | JavaScript is organised into functions with parameters/return values used appropriately; no console errors; reflection clearly explains how JS, HTML, and localStorage work together using correct terminology. | Functions used appropriately; minor console warnings; reflection mostly clear. | Some functions used; occasional console errors; reflection present but vague. | Minimal use of functions; frequent console errors; reflection very brief. | No functions used appropriately; no reflection submitted. |
Open any website, right-click, and choose "Inspect" - explore the Elements panel and find the HTML behind something on the page. Student-led.
By the end of this lesson you will be able to link a JavaScript file to your HTML, select page elements using querySelector, and change their content.
- Create
script.jsin your project folder. Link it at the bottom of your HTML's<body>:<script src="script.js"></script>
</body> - Test it's connected - add this to
script.jsand check your browser's console (F12 / Inspect → Console):console.log("script.js is connected!"); - Use
querySelectorto select an element from your HTML (e.g. your main heading):const heading = document.querySelector("h1");
console.log(heading); - Change the selected element's content:
heading.textContent = "Welcome - JavaScript is working!";
- Try selecting a different element by its
idor class (you may need to add anidto it in your HTML first), and change its text or style.
querySelector finds an element in this tree using CSS-style selectors ("h1", "#myId", ".myClass").
Keep script.js linked and working - you'll build on it throughout this task.
By the end of this lesson you will be able to make a button or form respond to user interaction using addEventListener.
- If you don't have a button or form in your HTML yet, add a simple one based on your wireframe - e.g. an input field and a button:
<input type="text" id="taskInput" placeholder="Enter a task">
<button id="addBtn">Add</button>
<ul id="taskList"></ul> - In
script.js, select the button and add a click listener:const addBtn = document.querySelector("#addBtn");
addBtn.addEventListener("click", function() {
console.log("Button clicked!");
}); - Get the input's value when clicked:
const input = document.querySelector("#taskInput");
addBtn.addEventListener("click", function() {
console.log(input.value);
}); - If you're using a
<form>element instead of a standalone button, listen for the"submit"event and callevent.preventDefault()to stop the page from reloading. - Test: type something in the input, click the button (or submit the form), and confirm the console shows the value you typed.
querySelector returns null, your script may be running before the element exists. Placing your <script> tag at the END of <body> (as in Lesson 1) usually fixes this.
Kahoot teacher-run quiz on JavaScript basics from Week 4. Student-led from there - just join and play!
By the end of this lesson you will be able to create new HTML elements with JavaScript and add them to the page dynamically.
- Building on Lesson 2's button and input, create a new list item element when the button is clicked:
const taskList = document.querySelector("#taskList");
addBtn.addEventListener("click", function() {
const li = document.createElement("li");
li.textContent = input.value;
taskList.appendChild(li);
input.value = ""; // clear the input
}); - Test: type something and click "Add" - a new list item should appear, and the input should clear, ready for the next entry.
- Add input validation: don't add empty items. Check
input.value.trim() !== ""before creating the new element. - Write a function
addItem(text)that takes the text as a parameter and does the create/append logic - then call it from your event listener withaddItem(input.value). - Bonus: add a small "✕" button inside each new list item that, when clicked, removes that item from the list (using
.remove()).
By the end of this lesson you will be able to save data to the browser's localStorage so it isn't lost when the page is refreshed.
- So far, refreshing the page loses your list - localStorage fixes this. It stores data as strings, so we use
JSON.stringify()to convert other data types:let tasks = []; // array to hold our task data
function saveTasks() {
localStorage.setItem("myTasks", JSON.stringify(tasks));
} - Update your
addItem(text)function from Lesson 3 to also add to thetasksarray and callsaveTasks():function addItem(text) {
tasks.push(text);
// ...existing code to create and append the li...
saveTasks();
} - Open your browser's DevTools → Application/Storage tab → Local Storage. After adding an item, confirm you can see
"myTasks"with your data stored as a JSON string. - Refresh the page - notice the visible list disappears (we haven't loaded it back yet - that's next lesson), but the data in localStorage remains.
JSON.stringify() when saving, and convert it back with JSON.parse() when loading (next lesson).
Open Kahoot teacher-run quiz on Weeks 4-5 JavaScript concepts. Student-led from there - just join and play!
By the end of this lesson you will be able to load previously saved data from localStorage when the page loads, and display it on the page.
- Write a function
loadTasks()that reads from localStorage, and handles the case where there's nothing saved yet:function loadTasks() {
const saved = localStorage.getItem("myTasks");
if (saved) {
tasks = JSON.parse(saved);
} else {
tasks = [];
}
} - After loading, display each saved task on the page by looping through
tasksand calling the same "create element and append" logic from Lesson 3 (consider refactoring this into its own function, e.g.renderTask(text), used by bothaddItemandloadTasks). - Call
loadTasks()when the script first runs (e.g. at the bottom ofscript.js). - Test: add a few items, refresh the page - your items should still be there! Try closing and reopening the browser tab too.
- If you added a "remove" button in Lesson 3, update it to also remove the item from the
tasksarray and callsaveTasks()again, so removals persist too.
By the end of this lesson you will be able to thoroughly test your app's interactivity, fix console errors, and submit Task 8 with a reflection.
- Open the browser console (F12) and use your app normally - adding items, removing items (if implemented), refreshing. Are there any red error messages? Fix them one at a time.
- Test edge cases: what happens if you submit an empty input? What if you add many items - does the layout still look okay (check your CSS from Task 7 still works with dynamically added elements)?
- Clear your localStorage (DevTools → Application → Local Storage → right-click → Clear) and reload - does your app handle "no saved data" gracefully (no errors, sensible empty state)?
- If you have time, add one small improvement - e.g. a "Clear all" button, a counter showing how many items are saved, or basic styling for the dynamically added items.
- Write your reflection (5-8 sentences): explain how your HTML, CSS, and JavaScript work together, describe how localStorage makes your app "remember" data, and describe one bug you fixed and how.
Upload to connect.det.wa.edu.au: your updated HTML, CSS, and script.js files, and your reflection. Verify your upload was successful before leaving class.
Polish your web app, test it across different screen sizes, and deploy it to a live web address using a free hosting platform (e.g. GitHub Pages). Conduct user testing with classmates using your real, live URL, and document the changes you made based on their feedback.
- Polished, responsive version of your web app (HTML/CSS/JS)
- A live URL where your app can be accessed by anyone
- User testing log - feedback from at least 2 testers using the live URL
- Changelog - list of changes made based on feedback
- Short written reflection (5-8 sentences)
- App is deployed to a working live URL (e.g. GitHub Pages)
- App is usable on both a laptop-sized screen and a phone-sized screen
- All Task 7/8 functionality (forms, dynamic content, localStorage) works on the live version
- User testing conducted with at least 2 classmates via the live URL
- At least 2 changes made and documented based on feedback
- Reflection connects the full journey: planning → building → deploying
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Responsive Design /5 marks | App is fully usable and looks well-organised on both laptop and phone-sized screens; layout adapts sensibly (e.g. using flexbox/grid and media queries where needed). | App is usable on both screen sizes with minor layout issues. | App is usable on one screen size; the other has noticeable issues. | App has significant layout problems on smaller/larger screens. | App is unusable on one or both screen sizes. |
| Deployment /5 marks | App is successfully deployed to a working live URL; all functionality from Task 8 (forms, dynamic content, localStorage) works correctly on the live version. | App deployed and live; minor functionality issues on the live version. | App deployed but some functionality doesn't work live (e.g. paths broken). | Deployment attempted but live URL doesn't work correctly. | App not deployed / no live URL. |
| User Testing /5 marks | User testing log shows genuine feedback from 2+ testers using the live URL; feedback is specific and useful. | User testing log present with feedback from 2 testers; mostly specific. | User testing log present but feedback vague or from fewer than 2 testers. | Minimal user testing log. | No user testing log submitted. |
| Changelog & Reflection /5 marks | Changelog clearly documents 2+ specific changes made from feedback; reflection thoughtfully connects the full process from planning (Task 7) through building (Task 8) to deployment and testing (Task 9). | Changelog documents 2 changes; reflection connects most of the process. | Changelog documents 1 change; reflection present but limited. | Changelog minimal; reflection very brief. | No changelog or reflection submitted. |
Open your app in the browser, then open DevTools (F12) and toggle "Device Toolbar" / responsive mode - see how it looks on a phone-sized screen. Student-led.
By the end of this lesson you will be able to identify layout issues on smaller screens and use media queries to fix them.
- Using DevTools' responsive/device mode, view your app at a phone width (e.g. 375px). Note any issues: text too small, elements overflowing, navigation taking up too much space.
- Add the viewport meta tag if you don't already have it - this tells mobile browsers to use the actual device width:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
- Use a media query to adjust styles for narrow screens:
@media (max-width: 600px) {
nav {
flex-direction: column;
}
h1 {
font-size: 1.5rem;
}
} - Test your media query by resizing the browser window or using device mode - confirm the layout adapts at the breakpoint.
- Fix at least 2 specific issues you noticed in step 1 using media queries or flexible units (e.g. switching a flex-direction from row to column on small screens).
flex-direction from row to column.
Keep testing and refining - responsive fixes will be part of your final submission.
By the end of this lesson you will be able to prepare your project files for deployment, ensuring everything is organised and working correctly.
- Check your file structure: your main page should be named
index.html(GitHub Pages looks for this by default). CSS and JS files should be correctly linked with relative paths (not full file paths from your computer). - Test your app one more time from a completely fresh state - clear localStorage, reload, and use the app as if for the first time.
- Remove any leftover
console.log()statements you used for debugging (unless intentional), and tidy up your code formatting. - Double-check all links (navigation, images, stylesheets, scripts) use relative paths like
"style.css"or"script.js"rather than absolute paths like"C:/Users/..."- absolute paths will break when deployed. - Make a checklist for yourself: app works fully offline (locally), file structure is clean, all paths are relative, viewport meta tag present, no console errors. Tick each off before Lesson 3.
href="C:/Users/yourname/Desktop/style.css" works on YOUR computer but breaks completely once deployed online. Always use relative paths - just the filename, or a path relative to your project folder.
Kahoot teacher-run quiz on Weeks 1-7 web app concepts. Student-led from there - just join and play!
By the end of this lesson you will be able to deploy your web app to a live URL using GitHub Pages.
- Netlify Drop - drag your project folder onto netlify.com/drop, get a live URL instantly. No account required.
- Tiiny.host - upload a ZIP of your files, get a live URL in seconds. No account required. Simple and fast.
- CodePen - paste your HTML, CSS, and JS into the three panels and share the public Pen URL. Good if your project is a single-page app.
- If you don't already have one, create a free GitHub account (check with your teacher about school account policies first).
- Create a new repository (e.g. named after your app). Upload your project files -
index.html,style.css,script.js- via GitHub's web interface (drag and drop files works fine for this). - In your repository's Settings, find the "Pages" section. Set the source to your main branch and root folder. Save.
- GitHub will provide a URL (usually
https://yourusername.github.io/repository-name/) - it may take a minute or two to become live. - Visit your live URL. Test everything: does the page load? Does the styling apply? Does your JavaScript and localStorage work the same as it did locally?
- Go to app.netlify.com/drop.
- Select your entire project folder and drag it onto the page (or click to browse). Netlify will deploy it automatically.
- You'll get a randomly-named live URL (e.g.
random-name.netlify.app) within seconds. Copy it and test it in your browser. - Note: the free drop URL expires after 24 hours unless you create a free Netlify account to claim it. Ask your teacher whether you need to do this for submission.
- ZIP your project folder (right-click → Compress/Send to Zip).
- Go to tiiny.host, upload your ZIP file, and enter a subdomain name for your site.
- Click "Upload" - you'll get a live URL at
yourname.tiiny.sitewithin seconds. Test it.
"Style.css" vs "style.css") exactly match the actual uploaded filenames. This applies to GitHub Pages, Netlify, and Tiiny equally.
By the end of this lesson you will be able to conduct user testing on your live, deployed web app and record useful feedback.
- Start your user testing log - columns: Tester Name, Device/Browser Used, Feedback, Planned Change.
- Share your live URL with a classmate (via the classroom chat, written down, or however your teacher suggests). Ask them to open it on their own device/browser.
- Without giving instructions, ask them to try using your app for its intended purpose. Watch (or ask them to describe) what they do.
- Ask 3 questions: "What did you understand the app was for?" "Did everything work as expected on your device?" "What's one thing you'd improve?"
- Record their responses. Repeat with a second classmate - ideally on a different device/browser if possible (e.g. one on a laptop, one on a phone).
Kahoot teacher-run quiz reviewing the full deployment process. Student-led from there - just join and play!
By the end of this lesson you will be able to make changes based on user feedback, update your live deployment, and document the changes in a changelog.
- Review your user testing feedback from Lesson 4. Choose at least 2 specific, achievable changes to make - prioritise things that affect usability the most.
- Make the changes to your local files first. Test locally to confirm they work as expected.
- Redeploy using whichever platform you used in Lesson 3:
- GitHub Pages: upload the updated files to your repository (replacing old versions). Wait 1-2 minutes, then check your live URL.
- Netlify Drop: drag your updated project folder onto app.netlify.com/drop again. You'll get a new URL - update your submission notes.
- Tiiny.host: re-upload your updated ZIP with the same subdomain name to overwrite the previous version.
- Start your changelog - a simple list: "Change 1: [what changed] - based on feedback from [tester] who said [brief summary]." Repeat for each change.
- If time allows, do a final quick re-test with one of your original testers - does the change address their feedback?
By the end of this lesson you will be able to finalise your live web app, complete your changelog, and submit Task 9 with a reflection on the full Module 3 journey.
- Do a final check of your live URL - open it fresh (e.g. in a private/incognito window) and confirm everything works as expected from a "new visitor's" perspective.
- Finalise your changelog - make sure it includes at least 2 documented changes with the feedback that prompted them.
- Write your Module 3 reflection (5-8 sentences). Include: a brief summary of your app's journey from problem statement (Task 7) to live deployment (Task 9); one specific piece of user feedback and how you responded; and one thing you'd do differently if you started again.
- Gather your final materials: your live URL, updated HTML/CSS/JS files, user testing log, changelog, and reflection.
Upload to connect.det.wa.edu.au: your live URL, final project files, user testing log, changelog, and reflection. Verify your upload was successful before leaving class.
Your web app is live! Week 10 is for experimenting - try a new CSS framework, add an animation library, or build a tiny unrelated web page just to learn something new.
Choose your own adventure for Week 10:
- Add a CSS animation or transition to your deployed app - e.g. a button that smoothly changes colour on hover, or a list item that fades in when added
- Try a simple CSS framework - explore how a framework like a CSS grid system changes how quickly you can build layouts
- Build a tiny unrelated page - a fun "about me" page, a joke generator, or a simple game using what you've learned
- Accessibility audit - use a browser tool to check your deployed app's colour contrast and keyboard navigation, and fix any issues you find
End of lesson: your teacher will do a quick showcase - show one thing you built or discovered. No marks, just sharing.
Choose and propose your own capstone project, drawing on Python, game development, or web apps from Years 9 and 10 (or a combination). Write a project proposal that clearly states your goals, planned features, a realistic timeline across Weeks 4-9, and success criteria you'll use to judge whether it worked.
- Capstone proposal document - problem/goal, planned features, technology choice
- Timeline - a week-by-week plan for Weeks 4-9 (Task 11-12)
- Success criteria - how you'll know if your project achieved its goal
- A small proof-of-concept - a tiny working piece of your project
- Short written reflection (5-8 sentences)
- Proposal clearly identifies what the project does and why it's worth building
- At least 3 planned features, ranked by priority (must-have vs nice-to-have)
- Timeline is realistic for 6 weeks of build time (Weeks 4-9)
- Success criteria are specific and checkable (not just "it works")
- Technology choice builds on skills from Year 9 and/or Year 10
- Proof-of-concept runs without errors, however small
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Project Idea & Scope /5 marks | Idea is specific, achievable, and clearly builds on skills from Year 9/10; scope is realistic for 6 weeks - neither trivial nor overly ambitious. | Idea is clear and mostly achievable; scope is mostly realistic. | Idea present but scope is too broad or too narrow; some realism concerns. | Idea vague or significant scope concerns not addressed. | No clear project idea proposed. |
| Features & Timeline /5 marks | At least 3 features clearly prioritised (must-have vs nice-to-have); timeline breaks Weeks 4-9 into specific, achievable milestones. | 3 features listed with some prioritisation; timeline mostly realistic. | Features listed but prioritisation unclear; timeline present but vague. | Fewer than 3 features or no real prioritisation; timeline minimal. | No features list or timeline submitted. |
| Success Criteria /5 marks | Success criteria are specific, checkable, and directly tied to the project's goal. | Success criteria are mostly specific and checkable. | Success criteria present but vague (e.g. "it works well"). | Minimal success criteria. | No success criteria submitted. |
| Proof-of-Concept & Reflection /5 marks | Proof-of-concept runs correctly and demonstrates the chosen technology is set up and ready; reflection clearly explains why this project was chosen and how it connects to prior learning. | Proof-of-concept runs with minor issues; reflection mostly clear. | Proof-of-concept attempted but has errors; reflection present but basic. | Proof-of-concept minimal or non-functional; reflection very brief. | No proof-of-concept or reflection submitted. |
Think back over Year 10: Python (functions, files, OOP), GDevelop arcade games, and web apps. Which of these did you enjoy most? Discuss with a classmate. Student-led.
By the end of this lesson you will be able to review your skills from Years 9 and 10, and choose a capstone direction that builds on what you've learned.
- Make a quick skills inventory: list the tools and skills you've used this year - Python (functions, files, lists, dictionaries, classes), GDevelop (game design, events, controllers), and web development (HTML, CSS, JavaScript, localStorage, deployment).
- For each area, rate your confidence (1-5) and interest (1-5). Where are your highest combined scores?
- Brainstorm 3 capstone ideas, each building primarily on one area: a Python idea (e.g. an expanded simulation, a data tool, a text-based game with save files), a game idea (e.g. a new GDevelop game with a different genre or mechanic), and a web app idea (e.g. a new app solving a different problem, or a significant expansion of your Task 9 app).
- You can also combine areas - e.g. a web app with a Python backend script, or a game with a companion web page. Note any combination ideas too.
- Discuss your 3 ideas with a classmate or your teacher - which feels most achievable AND most interesting to you?
Keep your skills inventory and 3 ideas - you'll narrow down in Lesson 2.
By the end of this lesson you will be able to define your capstone project's goal and create a prioritised feature list.
- Choose your final capstone idea from Lesson 1. Write a single clear goal statement: "My capstone project is a [type of project] that [does what], built using [technology]."
- Brainstorm every feature you can think of for this project - don't filter yet, just list everything.
- Sort your features into 3 categories: Must-have (the project doesn't work without these), Should-have (important but the project could function without them), and Nice-to-have (bonus, if time allows).
- Check: do you have at least 3 must-have features? Is your must-have list realistic for 6 weeks? If it looks too big, move some features to "should-have" or "nice-to-have."
- Write 1-2 sentences for each must-have feature describing what it does - this becomes the core of your proposal.
Kahoot teacher-run quiz reviewing project planning vocabulary. Student-led from there - just join and play!
By the end of this lesson you will be able to create a realistic week-by-week timeline for building your capstone project across Task 11 (Weeks 4-6) and Task 12 (Weeks 7-9).
- You have 6 weeks of build time (Weeks 4-9), split across Task 11 (core development) and Task 12 (showcase and reflection - but Weeks 7-8 are still build time before the showcase in Week 9).
- List your must-have features in the order you'll build them - usually, start with the foundational piece everything else depends on (e.g. the basic data structure or main screen) before adding features on top.
- Assign each must-have feature to roughly 1-2 weeks. Be realistic - building AND testing a feature usually takes longer than just writing the code.
- Add buffer: leave Week 8 or 9 lighter than the others, in case earlier features take longer than expected (they usually do!).
- Write your timeline as a simple table: Week | Planned Work. This becomes part of your proposal.
By the end of this lesson you will be able to write specific, checkable success criteria for your capstone project.
- For each must-have feature, write a success criterion that's specific and checkable - something you (or someone else) could verify by using the project. A vague example would be "The game should be fun." A specific example would be "A player can complete a full game (win or lose) without crashes, and the score updates correctly when collecting items."
- Write at least 3 success criteria covering different aspects of your project: functionality (does it work?), usability (can someone else use it without help?), and completeness (does it do what your proposal says?).
- Re-read your success criteria: could you check each one in under a minute by using your finished project? If not, make it more specific.
- Combine your goal statement (Lesson 2), feature list, timeline (Lesson 3), and success criteria into a single draft proposal document.
- Share your draft proposal with a classmate or the teacher for feedback before finalising.
Kahoot teacher-run quiz reviewing Module 1-3 vocabulary across the year. Student-led from there - just join and play!
By the end of this lesson you will be able to set up your chosen tool/environment and build a small proof-of-concept demonstrating it's ready for your capstone build.
- Set up the tool/environment for your chosen technology: open Thonny for Python, GDevelop for a game, or create a new project folder with index.html/style.css/script.js for a web app.
- Build a tiny "proof-of-concept" - the smallest possible working piece that proves your chosen approach will work. Examples: a Python program that creates and saves one object using the class structure you're planning; a GDevelop scene with one object that responds to one input; a webpage with one element that JavaScript can select and change.
- Run/preview your proof-of-concept. Does it work without errors? This confirms your tool is set up correctly and your basic approach is viable.
- Note down anything you learned from building this small piece - did anything take longer than expected? Does it change your timeline at all?
- Save your proof-of-concept - you'll likely build directly on top of it in Task 11.
By the end of this lesson you will be able to finalise your capstone proposal document and submit it with your proof-of-concept and a reflection.
- Compile your final proposal document with these sections: Goal statement, Feature list (prioritised), Timeline (Weeks 4-9), Success criteria.
- Re-read your whole proposal as if you were someone else reading it for the first time - is it clear what you're building, why, and how you'll know it's done?
- Address any feedback you received in Lesson 4 - make final adjustments to scope, timeline, or success criteria if needed.
- Make sure your proof-of-concept from Lesson 5 is saved and ready to share.
- Write your reflection (5-8 sentences): explain why you chose this project, how it connects to what you've learned in Year 9/10, and one thing you're looking forward to (or worried about) building.
Upload to connect.det.wa.edu.au: your proposal document, proof-of-concept files, and reflection. Verify your upload was successful before leaving class.
Build the core functionality of your capstone project according to your Task 10 proposal. Work through your must-have features in priority order, track your progress against your timeline, troubleshoot problems as they arise, and adapt your plan where needed.
- Working build of your capstone project with most must-have features implemented
- Progress log - weekly notes on what you built, what worked, what didn't
- Updated timeline - showing what's changed from your original plan, if anything
- Short written reflection (5-8 sentences)
- At least 2 must-have features from your proposal are working by the end of Task 11
- Progress log has an entry for each week (Weeks 4-6)
- At least one entry documents a problem encountered and how it was addressed
- Updated timeline reflects reality - adjustments are noted, not hidden
- Code/project file is saved and organised, ready to continue in Task 12
- Reflection connects progress to your original success criteria
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Core Functionality /5 marks | 2+ must-have features are fully working and match the proposal closely; build quality is high (organised, follows good practice from earlier tasks). | 2+ must-have features working with minor issues; build quality is reasonable. | 1-2 must-have features partially working; some build quality concerns. | Limited functional progress; significant issues with core features. | No working core functionality. |
| Progress Log /5 marks | Progress log has detailed, specific entries for every week; clearly shows the development process and decisions made. | Progress log has entries for every week; mostly specific. | Progress log present but some weeks missing or entries are vague. | Minimal progress log. | No progress log submitted. |
| Problem-Solving /5 marks | At least one genuine problem is documented with a clear explanation of how it was diagnosed and resolved (or how the plan was adapted if unresolved). | A problem is documented with a mostly clear resolution. | A problem is mentioned but resolution is vague. | Problems mentioned only in passing, no real detail. | No problems documented - unlikely for a genuine build process. |
| Timeline & Reflection /5 marks | Updated timeline honestly reflects progress, with clear reasoning for any changes; reflection connects current progress to original success criteria from Task 10. | Updated timeline reflects progress; reflection mostly connects to success criteria. | Timeline present but minimal updates; reflection present but limited connection. | Timeline not meaningfully updated; reflection very brief. | No updated timeline or reflection submitted. |
By the end of this lesson you will be able to break your first must-have feature into small steps and begin building it from your Task 10 proof-of-concept.
- Open your proof-of-concept from Task 10. Re-read your timeline - what's the first must-have feature you planned to build?
- Break this feature into 3-5 small steps. For example, "add/save data" might break into: create the data structure, write a function to add an item, write a function to save it, test saving works, then connect it to the user interface.
- Start your progress log now - create a simple document or text file with a heading for "Week 4" and note today's date and what you're starting.
- Work through your first 1-2 small steps. Test as you go - don't write everything then test at the end.
- At the end of the lesson, add to your progress log: what you completed, what's next, and anything that surprised you (took longer/shorter than expected, or worked differently than planned).
Keep your progress log updated each lesson - it's part of your Task 11 submission.
By the end of this lesson you will be able to complete your first must-have feature and test it against the success criteria from your proposal.
- Continue building your first feature from Lesson 1's remaining steps.
- Once complete, test it against the relevant success criterion from your Task 10 proposal - does it actually meet what you wrote down? Be honest.
- If it doesn't fully meet the criterion yet, note in your progress log what's missing and whether you'll fix it now or come back to it.
- If your first feature is working well, start breaking down your second must-have feature into small steps, the same way as Lesson 1.
- Update your progress log: Feature 1 status (complete/partial), and what you're starting for Feature 2.
Kahoot teacher-run quiz reviewing debugging strategies from across the year. Student-led from there - just join and play!
By the end of this lesson you will be able to use systematic debugging strategies to fix problems in your capstone build, and document at least one in your progress log.
- Continue building Feature 2 (or Feature 3 if Feature 2 is done). When something doesn't work as expected, don't panic - this is normal and expected.
- Use a systematic approach: read any error message carefully (what line? what type of error?). Isolate the problem - comment out or temporarily simplify code until you find exactly what's causing the issue.
- Add temporary print/console statements (Python) or console.log (JavaScript), or use GDevelop's debugger, to see what values your variables actually hold at each step.
- Once you find and fix a genuine problem, write it up in your progress log: what was the symptom (what went wrong)? What was the actual cause? How did you fix it?
- If you're stuck after trying these strategies for 10-15 minutes, that's the point to ask a classmate or the teacher - document that you asked for help too.
By the end of this lesson you will be able to honestly review your progress against your Task 10 timeline, and adjust your plan if needed.
- You're now halfway through Task 11 (Week 5 of 6). Open your Task 10 timeline and your progress log side by side.
- For each must-have feature, mark its status: done, in progress, or not started.
- Be honest: are you on track, ahead, or behind your original timeline? This is completely normal either way - the important thing is recognising it now.
- If you're behind: which remaining must-have features are most critical? Could any "should-have" or "nice-to-have" features be dropped to focus on must-haves? Update your timeline to reflect a realistic plan for Week 6 and Task 12.
- If you're ahead: could you start on a "should-have" feature, or use the extra time to improve testing/polish on what's already built?
- Write an updated timeline section in your progress log reflecting this check-in - this is exactly what the "Updated Timeline" part of your Task 11 submission should show.
Kahoot teacher-run quiz reviewing the full year's DigiTech vocabulary. Student-led from there - just join and play!
By the end of this lesson you will be able to continue building your remaining must-have features, integrating them with what's already working.
- Following your updated timeline from Lesson 4, continue building your remaining must-have feature(s).
- As you add each new feature, test that it works WITH your existing features, not just on its own - e.g. if Feature 1 saves data and Feature 2 displays it, confirm displaying actually shows what was saved.
- Keep your progress log updated as you go - what you built, any issues, any further timeline adjustments.
- If you finish all must-have features with time remaining, test everything together as a "mini end-to-end test" - use your project the way a real user would, start to finish.
- Note in your progress log how many must-have features are now complete, and what's planned for Task 12 (Weeks 7-9).
By the end of this lesson you will be able to finalise your progress log and updated timeline, and submit Task 11 with a reflection connecting your progress to your success criteria.
- Do a final check of your build - save your project file, and make sure it's the most recent working version.
- Finalise your progress log - check it has an entry for every week (Weeks 4-6), including the problem you documented in Lesson 3.
- Finalise your updated timeline from Lesson 4 - this should clearly show any changes from your original Task 10 plan, with brief reasons.
- Write your reflection (5-8 sentences): which must-have features are complete? How do they measure up against your Task 10 success criteria? What's your plan for Task 12 (Weeks 7-9)?
- Gather your final files: your project build, progress log, updated timeline, and reflection.
Upload to connect.det.wa.edu.au: your current project build/files, progress log, updated timeline, and reflection. Verify your upload was successful before leaving class.
Finish, polish, and present your capstone project to the class. Write a reflection on your design process, the challenges you faced, and how your project demonstrates your growth across Year 10 - and across your whole DigiTech journey from Year 7.
- Finished capstone project - polished version of your build
- Showcase presentation - a short demo of your project to the class
- Final success criteria check - results against your Task 10 criteria
- Final written reflection (8-12 sentences) - your project and your Year 10 journey
- Project meets at least 2 of your original must-have success criteria
- Project is presented live to the class (1-2 minutes)
- Each success criterion is honestly checked - including any not fully met
- Reflection discusses both successes and challenges, not just successes
- Reflection connects this project to skills developed across Year 10
- Final project file/build is submitted and organised
| Criterion | A - 5 | B - 4 | C - 3 | D - 2 | E - 1 |
|---|---|---|---|---|---|
| Project Completion /5 marks | Project is finished and polished; meets all or nearly all must-have success criteria from the proposal; runs reliably. | Project meets most must-have criteria; runs reliably with minor issues. | Project meets some must-have criteria; functional but with noticeable gaps. | Project is incomplete; meets few criteria. | Project is non-functional or not submitted. |
| Showcase Presentation /5 marks | Confident, clear presentation that demonstrates the project's key features and explains design choices; engages the audience. | Clear presentation demonstrating key features. | Presentation given but brief or unclear in places. | Minimal presentation; key features not demonstrated. | No presentation given. |
| Success Criteria Check /5 marks | Each success criterion from Task 10 is honestly evaluated against the final project, including criteria not fully met, with clear reasoning. | Most criteria evaluated honestly with reasoning. | Criteria evaluated but reasoning is limited or overly positive. | Minimal evaluation against criteria. | No success criteria check submitted. |
| Reflection on Growth /5 marks | Reflection thoughtfully discusses both successes and challenges; clearly connects this project to specific skills developed across Year 10 (and ideally Year 9); demonstrates genuine growth in understanding. | Reflection discusses successes and challenges; connects to Year 10 skills. | Reflection present but focuses mainly on successes; limited connection to broader learning. | Reflection very brief or generic. | No reflection submitted. |
Think back to Week 1, Term 1 of Year 10. What did you know how to do then, compared to now? Discuss with a classmate. Student-led.
By the end of this lesson you will be able to complete any remaining must-have features, prioritising based on your Task 11 updated timeline.
- Review your Task 11 updated timeline and progress log - what's left to do for your must-have features?
- If all must-haves are done, this is a great position - consider whether a "should-have" feature would meaningfully improve your showcase, or whether your time is better spent on polish (Lesson 2) and presentation prep (Lesson 4).
- If must-haves remain, prioritise based on which most directly affects your success criteria. Work through them using the same small-steps, test-as-you-go approach from Task 11.
- Update your progress log with today's work.
- By the end of this lesson, aim to have a version of your project that meets at least 2 of your must-have success criteria, even if not perfectly polished yet.
Keep building toward a complete, working version for polish and showcase prep.
By the end of this lesson you will be able to polish your capstone project and conduct thorough final testing.
- Do at least 2 full run-throughs of your project as if you were a first-time user. Note anything confusing, broken, or unfinished-looking.
- Fix any bugs found. Prioritise bugs that affect your must-have success criteria over small cosmetic issues.
- Add polish where time allows: clearer labels/instructions, consistent visual style, removing any leftover debug code or placeholder text.
- If your project has any "rough edges" you won't have time to fix, that's okay - note them honestly for your reflection rather than hiding them.
- Save a clearly labelled "final" version of your project.
Kahoot teacher-run quiz reviewing Module 4 concepts so far. Student-led from there - just join and play!
By the end of this lesson you will be able to honestly evaluate your finished project against every success criterion from your Task 10 proposal.
- Open your Task 10 proposal and list every success criterion you wrote.
- For each one, test your finished project and record: Met / Partially Met / Not Met, with a brief explanation (1-2 sentences) of what you found.
- For anything "Partially Met" or "Not Met," briefly explain why - was it a time issue, a technical difficulty, or did your understanding of the problem change as you built it?
- This becomes your "Final Success Criteria Check" document - a simple table: Criterion | Status | Explanation.
- Look at the overall picture: how many criteria were fully met? Does this feel like a successful project to you - and why or why not?
By the end of this lesson you will be able to plan and rehearse a short presentation of your finished capstone project.
- Plan your showcase presentation (aim for 1-2 minutes): briefly introduce your project's goal (what problem does it solve, or what does it do?), demonstrate it live, highlight one feature you're proud of, and mention one challenge you overcame.
- Practice your presentation at least twice with a classmate. Time yourself.
- Get feedback: was your explanation clear? Did the live demo go smoothly? Is there anything you should show differently?
- Make any final small adjustments based on feedback - to your presentation plan, or to your project if a quick fix would improve the demo.
- Write a brief outline (3-5 points) of what you'll say and show - informal notes for yourself are fine.
Kahoot teacher-run quiz reviewing the full Year 10 course. Student-led from there - just join and play!
By the end of this lesson you will have presented your finished capstone project to the class and reflected on what you saw from classmates.
- Showcase time! Present your project to the class (or in small groups, depending on class size) following your plan from Lesson 4.
- While watching classmates' showcases, take brief notes on at least 2 projects: what did they build? What's one thing you found interesting or impressive?
- If there's time, give brief positive feedback to at least one classmate about their project - be specific (e.g. "I liked how your save system worked" rather than just "good job").
- After all showcases, reflect briefly: how did your presentation go? Did the live demo work as expected?
- Keep your presentation notes and any feedback received - you'll use this in your final reflection.
Keep your presentation notes - you'll write your final reflection in Lesson 6.
By the end of this lesson you will be able to write a final reflection connecting your capstone project to your growth across Year 10, and submit Task 12.
- Finalise your Success Criteria Check document from Lesson 3 if you haven't already.
- Write your final reflection (8-12 sentences). Include: a summary of your capstone project and what it does; how it went against your success criteria - including anything not fully met, and why; one challenge you faced and how you handled it; and how this project connects to specific skills from earlier in Year 10 (Python, GDevelop, web development) - or even back to Year 9.
- Think back to Week 1, Term 1 of Year 10. What did you know how to do then, compared to now? Add a sentence or two about this growth to your reflection.
- Do a final save of your project, making sure it's the version you presented (or your most polished version if changes were made after the showcase).
- Gather your final materials: your finished project, Success Criteria Check, and final reflection.
Upload to connect.det.wa.edu.au: your final project/build, Success Criteria Check, and final reflection. Verify your upload was successful before leaving class.
You've finished Year 10 DigiTech! Week 10 is a celebration - browse a gallery of capstone projects from across the class, vote for your favourites, and reflect on how far you've come since Year 7.
Choose your own adventure for Week 10:
- Capstone Gallery Walk - set up your finished capstone project for others to try, and walk around trying classmates' projects. Vote for your favourite (not your own!)
- Lightning Showcase - one minute each, show something you built this year that you're proud of - from any module
- Help a classmate - if your project is finished and someone else is still polishing theirs, offer to help debug or playtest
- Personal reflection - write or record a short reflection: what's the most useful thing you learned this year? What are you looking forward to in Year 11?
- You wrote functions, handled files, and built classes and objects in Python
- You designed and built a complete arcade game in GDevelop, with controller support
- You planned, built, and deployed a real, live web app
- You did the work. Year 10 Digital Technology: done.
End of lesson: no marks, just celebration. See you in Year 11!