NH NEON HEISTStudent HQ

Student HQ // Summer operation

Seven weeks.
One game.

You’re going to build a real Python game from scratch. Each week unlocks a new system. You do not need to know any programming yet.

Mission map

From first line to finished game

MISSION00

Install · Open · Run · Save

Get Python ready

Before building the game, set up the tool that reads and runs Python instructions.

First: what is Python?

Python is both a language and a program.

You will write instructions in the Python language. The Python program on your computer reads those instructions and carries them out. Your files will end in .py, so the first game file will be called week1.py.

Get an adult for installation.Only download Python from python.org or an approved school source. Do not pay for it—Python is free.
Windows 10 or 11
  1. Open the official Python downloads page.
  2. Choose the current Python 3 download or Python Install Manager. Open the downloaded installer and choose Install.
  3. Open Command Prompt, type python and press Enter. If Python asks to install the latest runtime, allow it.
  4. Close Command Prompt. Open the Start menu and search for IDLE. Choose the IDLE entry for Python 3.

If the computer is school-managed, installation may need an administrator. Follow the school’s instructions instead of trying to bypass the restriction.

macOS
  1. Open the official Python downloads page and download the current macOS Python 3 installer.
  2. Open the downloaded .pkg file and follow the installation steps.
  3. Open Applications, then the Python 3.x folder. Run Install Certificates.command once.
  4. In the same folder, open IDLE.

Do not delete or change Apple’s built-in Python. The python.org installer creates its own separate installation.

Chromebook or managed device

Stop here and ask the tutor or school which editor to use. Linux installation may be disabled, and changing device settings can break school rules. The course code works in any editor that runs ordinary Python 3.

Meet the editor

IDLE has two useful windows

The Shell shows >>> and runs one instruction immediately. It is useful for quick experiments. The Editor holds a complete program that you can save and run again.

For this project, use the Editor for game code.

Shell
>>> 2 + 3
5
>>> _
Try one thing now
Editor
print("NEON HEIST: ENDS EDITION")
print("Run loaded. Move smart.")
Save a whole program

Your first run

Prove the setup works

  1. Create a folderMake a folder called neon-heist somewhere easy to find.
  2. Open an editorIn IDLE choose File → New File. A blank Editor window opens.
  3. Type one instructionType print("Python is ready"). Type it yourself rather than pasting it.
  4. Save itChoose File → Save As and save it as setup_check.py inside your folder.
  5. Run itChoose Run → Run Module. The Shell should display Python is ready. If F5 changes screen brightness, use the Run menu.
Setup checkpoint

I have run a saved .py file and can find it again.

Before you code

Crew rules

01

Predict first

Before pressing Run, say what you expect the program to do.

02

Errors are clues

Read the last line of the error, find the line number, then check spelling and punctuation.

03

Know your code

If you cannot explain a line yet, pause and ask. Every line belongs to you.

04

Save working versions

Keep week1.py, week2.py and so on. Never destroy your last working game.

WEEK01

Input · Output · Variables

Pattern the crew

Create a personalised opening scene with proper ends energy.

Your mission

Ask the player for their name, crew name and getaway vehicle. Store each answer, then use it in a dramatic introduction.

Concept lesson

How a conversation with Python works

A function is a ready-made action with a name. Parentheses tell Python to perform that action. Information placed inside the parentheses tells the function what to use.

print() sends output to the screen

print("Welcome to the ends")
printName of the function( )Perform the function"Welcome..."The string to display

A string is text. Quotation marks show where the text begins and ends. The quotation marks are instructions for Python; they are not displayed.

input() receives text from the player

player_name = input("What's your tag? ")
  1. Python displays What's your tag?.
  2. The program pauses and waits.
  3. The player types something and presses Enter.
  4. input() gives that text back.
  5. = stores it under the name player_name.
Try it

Change, predict, run

  1. Run print("Red whip").
  2. Predict what changing Red to Blacked-out will do.
  3. Add car = input("Pick your whip: ").
  4. Display the answer using print("Whip secured:", car).

Learn

  • print() displays output.
  • input() collects text.
  • A variable is a labelled place to store a value.
  • Python follows instructions from top to bottom.

Build

print("==========================")
print("  NEON HEIST: ENDS EDITION")
print("==========================")

player_name = input("What's your tag? ")
crew_name = input("Name your crew: ")
vehicle = input("Pick your whip: ")

print(player_name, "rolls with", crew_name)
print("Whip secured:", vehicle)
print("The ends are watching. Move smart.")
Main challenge

Make it yours

Add a crew slogan, favourite colour and two new story lines. Create some ASCII decoration using characters such as =, * and #.

Need a hint?

Copy the pattern used for vehicle: collect an answer into a new variable, then include that variable in a print() line.

Optional solo mission

Crew identity card

Display at least four player answers in a neat identity card. Change the labels and decoration to match your crew.

Checkpoint

I can explain what input() does and where the player’s answer is stored.

WEEK02

Numbers · Types · Arithmetic

Stack your stats

Add cash, heat, rep and the cost of your whip.

Your mission

Give the player £1,000, charge them for a vehicle and show their remaining cash.

Concept lesson

Text, numbers and changing values

Python treats different kinds of information differently. A string is text; an integer is a whole number. Arithmetic works on integers, not on text that merely looks like a number.

"10" + "5""105"joins two strings
10 + 515adds two integers

Convert input when you need a number

cost_text = input("Cost: ")
cost = int(cost_text)

int() attempts to turn digit text such as "300" into the integer 300. Text such as "three hundred" cannot be converted.

Assignment changes the stored value

cash = 1000
cash = cash - 300

Python calculates the right side first: 1000 - 300. It then replaces the old value of cash with 700. This is assignment, not an algebra equation.

Try it

Be the computer

  1. Write down cash = 1000.
  2. Trace cash = cash - 250.
  3. Trace cash = cash + 100.
  4. Predict the final value before running it.

Learn

  • An integer is a whole number.
  • Text and numbers are different data types.
  • int() converts suitable text into a number.
  • cash = cash - cost updates a variable.
"10" + "5" → "105"10 + 5 → 15

Build

cash = 1000
heat = 0
reputation = 1

print("Starting cash: £", cash)
vehicle_cost = int(input("Whip price: £"))
cash = cash - vehicle_cost

print("Cash remaining: £", cash)
print("Heat:", heat)
print("Reputation:", reputation)
Main challenge

Pattern the garage

Invent three whips—a rapid e-bike, a blacked-out hatchback and a low-key van. Give each a cost, speed and toughness score.

Need a hint?

Start with one vehicle only. Make three variables: vehicle_cost, speed and toughness.

Optional solo mission

Fuel gauge

Add a fuel statistic. Preparing the car should cost cash and increase fuel.

Checkpoint

I can update a number variable and predict its new value.

WEEK03

Selection · Conditions · Boolean logic

Choose your move

Let the player pattern an approach and live with the outcome.

Your mission

Use if, elif and else to turn menu choices into different mission outcomes.

Concept lesson

Let the program choose a route

A condition is a question with only two possible answers: True or False. Selection uses that answer to decide which instructions run.

speed >= 7True → run the indented if blockFalse → check the next branch

Comparison is not assignment

=store a value

==is equal to?

>=greater than or equal to?

!=is not equal to?

Indentation shows ownership

if speed >= 7:
    print("Clean getaway. You're gone.")
    heat = heat - 1
print("Run's done.")

The first two indented lines belong to the if. The final line is not indented, so it runs whichever route was taken.

Try it

Test both paths

  1. Set speed = 9 and predict the result.
  2. Change it to speed = 4.
  3. Add an else message for the slower vehicle.
  4. Run once for each possible path.

Learn

  • A condition is either True or False.
  • == compares; = assigns.
  • Indentation shows which instructions belong to a branch.
  • and requires both conditions to be true.

Build

print("1. Cut through the back roads")
print("2. Chat to security")
print("3. Take the main road")

approach = input("What's the move? ")

if approach == "1" and speed >= 7:
    print("Clean. You're gone before anyone clocks you.")
    reputation = reputation + 2
elif approach == "2" and reputation >= 5:
    print("Security buys the chat. You're through.")
else:
    print("Too bait. Heat just went up.")
    heat = heat + 2
Main challenge

Three-way mission

Create three approaches. Make one require speed, one require cash and one require reputation.

Need a hint?

Build and test one branch at a time. Print the relevant statistic before the decision so you know its current value.

Optional solo mission

Secret route

Add a hidden fourth approach that succeeds only when two conditions are true.

Checkpoint

I can read a condition and explain exactly when its code will run.

WEEK04

Random numbers · Loops · Algorithms

Run the ends

Play several runs with changing pressure, luck and rewards.

Your mission

Mix vehicle skill with a random roll, then repeat the mission three times. Player choices should matter more than luck alone.

Concept lesson

Repeat instructions and add uncertainty

A loop saves us from copying the same instructions. The random module supplies tools for generating unpredictable game values.

Import and use a random tool

import random
roll = random.randint(1, 6)

import makes the module available. randint(1, 6) returns one whole number from 1 through 6—including both ends.

Read the loop aloud

for turn in range(1, 4):
    print("Run", turn)

“For each value called turn in 1, 2 and 3, run the indented instructions.” The value 4 is the stopping point and is not used.

Turn1Turn2Turn3Stop before4
Try it

Make a tiny countdown

  1. Loop through range(1, 4).
  2. Print the loop variable each time.
  3. Change the stop value and predict the final number printed.
  4. Indent another message so it also repeats.

Learn

  • random.randint(1, 6) produces a value from 1 to 6.
  • A for loop repeats a known number of times.
  • A counter tracks the current turn.
  • A logic error can run without crashing.

Build

import random

for turn in range(1, 4):
    print("Run", turn)
    difficulty = random.randint(7, 14)
    roll = random.randint(1, 6)
    score = speed + roll

    if score >= difficulty:
        reward = random.randint(200, 500)
        cash = cash + reward
        print("Clean run. Bagged £", reward)
    else:
        heat = heat + 2
        print("Run flopped. Heat:", heat)
Main challenge

Balance the operation

Change the difficulty, reward, heat penalty and number of turns. Play several times and decide whether your game feels fair.

Need a hint?

If every mission fails, lower the difficulty. If every mission succeeds, raise it. Change one value at a time.

Optional solo mission

Random events

Add a shortcut, engine problem, roadblock or bonus reward before a mission.

Checkpoint

I can identify the repeated instructions and explain how many times the loop runs.

WEEK05

Lists · Searching · Iteration

Build the lineup

Store your people and check whether the run has the right specialist.

Your mission

Link a Wheelman, Tech or Scout, display the lineup and award a bonus when the right specialist is active.

Concept lesson

Keep related values together

A list stores several values under one name. Square brackets mark the list, and commas separate its items.

crew = ["Wheelman", "Tech", "Scout"]
Index 0WheelmanIndex 1TechIndex 2Scout

Change and search

crew.append("Lookout")add an item at the end

"Tech" in crewproduce True or False

len(crew)count the items

Visit every item

for member in crew:
    print(member)

During each repetition, member refers to the next item. It is first "Wheelman", then "Tech", then "Scout".

Try it

Build a three-item inventory

  1. Start with inventory = [].
  2. Append three items.
  3. Print the list.
  4. Use a loop to print one item per line.

Learn

  • A list stores several related values.
  • List positions start at zero.
  • append() adds an item.
  • in checks whether an item is present.
  • A loop can process every item.
0
Wheelman
1
Tech
2
Scout

Build

crew = []
recruit = input("Link Wheelman, Tech or Scout? ")
crew.append(recruit)

print("Lineup active:")
for member in crew:
    print("-", member)

if "Tech" in crew:
    print("Tech kills the alarm. Clean.")
    mission_bonus = 3
else:
    mission_bonus = 0
Main challenge

Specialist outcomes

Create different outcomes for a Tech, a Wheelman and a lineup with neither specialist.

Need a hint?

Use if "Wheelman" in crew:. Capital letters matter: "wheelman" and "Wheelman" are different strings.

Optional solo mission

Equipment inventory

Create an empty inventory, add two items and display every item with a loop.

Checkpoint

I can add an item, display a list and check whether an item is present.

WEEK06

Functions · Parameters · Decomposition

Pattern the code

Turn repeated code into clean, named game systems.

Your mission

Create functions for the title and status display. If earlier ideas still feel uncertain, use this week to consolidate instead.

Concept lesson

Name a reusable job

A function groups instructions into one named job. This is decomposition: breaking a large game into smaller parts that are easier to understand, test and reuse.

1 · Define
def show_title():
    print("NEON HEIST: ENDS EDITION")
2 · Call
show_title()
3 · Output
ENDS EDITION

Defining does not run it

def teaches Python what the function means. Nothing appears until a later line calls the function by writing its name with parentheses.

Parameters carry information in

def show_cash(cash):
    print("Cash: £", cash)

show_cash(700)

cash is the parameter. When called with 700, that value is available inside the function.

Try it

Define, call, change

  1. Create show_warning() with one print line.
  2. Run without calling it and observe what happens.
  3. Add the call.
  4. Call it twice and explain why the message repeats.

Learn

  • A function is a named block of instructions.
  • Defining a function does not run it.
  • Calling a function runs it.
  • Parameters give information to a function.
  • return can send a value back.

Build

def show_title():
    print("======================")
    print("  NEON HEIST: ENDS EDITION")
    print("======================")

def show_status(cash, heat, reputation):
    print("Cash: £", cash)
    print("Heat:", heat)
    print("Reputation:", reputation)

show_title()
show_status(cash, heat, reputation)
Main challenge

Remove repetition

Turn one repeated section—title, status, crew list or mission choices—into a function.

Need a hint?

First copy the repeated lines below a def line and indent them. Then replace the old lines with the function call.

Optional solo mission

Game-over function

Create show_game_over() to display the final cash, heat and reputation.

Checkpoint

I understand the difference between defining and calling a function.

WEEK07

Validation · Testing · Refinement

Drop the summer edition

Make the game solid enough for somebody else to run it.

Your mission

Reject bad menu choices, add a clear ending, create a test table and watch another person play without helping them.

Concept lesson

Keep asking until the answer is usable

Validation checks whether input follows a rule. A while loop repeats while its condition remains True, making it useful for rejecting bad choices.

Ask for choiceIs it valid?Yes → continueNo ↺ ask again

Read the validation loop

while choice not in ["1", "2", "3"]:
    print("Try again")
    choice = input("Choose: ")

The loop runs only when the choice is not allowed. Asking again inside the loop gives the condition a chance to become false.

Plan tests before running

Normala common valid value, such as 2

Boundaryat and just beyond a limit

Erroneousthe wrong type or format, such as car

Try it

Attack your menu

  1. Predict what each input should do.
  2. Test 1, 3, 4, an empty answer and car.
  3. Record expected and actual results.
  4. Fix one failed test, then repeat it.

Learn

  • Validation rejects unacceptable input.
  • Normal data should be accepted.
  • Boundary data tests the limits.
  • Erroneous data should be rejected.
  • Testing compares expected and actual results.

Build

choice = input("Choose 1, 2 or 3: ")

while choice not in ["1", "2", "3"]:
    print("That choice ain't it.")
    choice = input("Pick 1, 2 or 3: ")

if cash >= 2000:
    print("Your name rings through the ends. Serious motion.")
elif heat >= 10:
    print("Way too bait. The whole crew goes ghost.")
else:
    print("Run complete. Low-key finish, still active.")
Starter test plan
TestInputExpected
Normal2Option 2 runs
Lower boundary1First option runs
Upper boundary3Last option runs
Outside range4Choice rejected
ErroneouscarChoice rejected
Main challenge

Family playtest

Watch somebody play without explaining anything. Record where they became confused, what broke and what they enjoyed. Fix two or three issues.

Need a hint?

Test one feature at a time. Write down what you expect before running the test.

Optional solo mission

Final polish

Add one feature: title art, difficulty selection, extra dialogue, credits or a high score for the current run.

Final checkpoint

Another person can start, play and finish my game without me intervening—and I can explain most of the code.

Operation complete

You shipped your first Python game.

That matters more than perfect syntax. Keep the seven versions, show someone what changed each week and decide what the autumn edition should add.

Back to the top