An optional, open project. Students turn the pitch card and prototype from Will it work in Arcade? into a game of their own, in three milestones with goals only, then look ahead to tilemaps, animation and extensions.
Load these into Waypoints Prepare: choose Load URL and paste the copied address, or download the file and import it. In Prepare, the worksheet's Teacher edition shows the answers; the student copy hides them.
Predict and Run 10 min · Milestone 1 30 min · Milestone 2 25 min · Milestone 3 and playtest 40 min · Arcade's real tools 15 min (two or more lessons)
This lesson is optional and open: it is the high ceiling of the course. Students start from the pitch card and one-screen prototype they made in Will it work in Arcade? (genre, building blocks, the hard part and a workaround). There is no starter code and no new block; every milestone is a goal, not a recipe. Only Milestone 1 has a code check (sprites, an overlap event and something from Info, such as score or lives); the others are honest ticks after testing, because every game ends and polishes differently.
Scope is the main risk. Students aim for a big game and finish nothing. Hold the line: Milestone 1 must be playable before anything else is added, and Milestone 3 is one polish, not three. A small finished game beats a big unfinished one. If a pitch card is "not a good fit" for Arcade (3D, realistic physics, typing-heavy), steer back to its workaround from Will it work in Arcade?.
Playtesting is the habit to build: after each milestone someone else plays for one minute while the maker watches in silence and notes where they got stuck. Then the maker changes one thing. Budget two to four lessons for a full project; one lesson gets most students through Milestone 2.
Students' work is saved in this browser only. Copying from the Will it work in Arcade? playground (switch to JavaScript, select all, copy, paste) keeps the prototype; the editor's Download saves a file as a backup.
Scoping their own game and playtesting early. Ask whether someone can play it yet, before more sprites are drawn.
| What you will see | A question to ask | The fix |
|---|---|---|
| The student is still drawing sprites after 20 minutes. | Can someone play your game yet? | Use simple shapes for now; make the art nice after the game works. |
| Nothing happens when sprites touch. | Which kinds are your sprites, and which kinds does each overlap event name? | Make the kinds match the event, as in the Overlaps lesson. |
| A hit takes all the lives, or a coin scores again and again. | What happens to the other sprite after the touch? | Destroy it (or move it) inside the overlap event. |
| The game never ends. | Which ending did you choose, and where does it happen? | Set life (and lose lives in an overlap), start a countdown, or call game over when the target is reached. |
| The student wants to add everything at once. | Which one change would make your game more fun for the player who just tested it? | Add that one, test it, then decide on the next. |
One possible solution for each task. Other correct programs are fine.

let fish: Sprite = null
let seal: Sprite = null
sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) {
otherSprite.destroy()
info.changeScoreBy(1)
})
sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) {
otherSprite.destroy()
info.changeScoreBy(-3)
})
scene.setBackgroundColor(9)
let penguin = sprites.create(img`
. f f .
f 1 1 f
f 1 1 f
. 4 4 .
`, SpriteKind.Player)
controller.moveSprite(penguin)
penguin.setStayInScreen(true)
game.onUpdateInterval(1000, function () {
fish = sprites.create(img`
. 4 4 . 4
4 4 4 4 .
. 4 4 . 4
`, SpriteKind.Food)
fish.setPosition(randint(10, 150), randint(10, 110))
})
game.onUpdateInterval(3000, function () {
seal = sprites.create(img`
. c c c .
c f c c c
c c c c c
`, SpriteKind.Enemy)
seal.setPosition(160, randint(10, 110))
seal.vx = -40
seal.setFlag(SpriteFlag.AutoDestroy, true)
})

let fish: Sprite = null
let seal: Sprite = null
sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) {
otherSprite.destroy()
info.changeScoreBy(1)
if (info.score() == 20) {
game.gameOver(true)
}
})
sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) {
otherSprite.destroy()
info.changeLifeBy(-1)
})
scene.setBackgroundColor(9)
let penguin = sprites.create(img`
. f f .
f 1 1 f
f 1 1 f
. 4 4 .
`, SpriteKind.Player)
controller.moveSprite(penguin)
penguin.setStayInScreen(true)
info.setLife(3)
info.startCountdown(60)
game.onUpdateInterval(1000, function () {
fish = sprites.create(img`
. 4 4 . 4
4 4 4 4 .
. 4 4 . 4
`, SpriteKind.Food)
fish.setPosition(randint(10, 150), randint(10, 110))
})
game.onUpdateInterval(3000, function () {
seal = sprites.create(img`
. c c c .
c f c c c
c c c c c
`, SpriteKind.Enemy)
seal.setPosition(160, randint(10, 110))
seal.vx = -40
seal.setFlag(SpriteFlag.AutoDestroy, true)
})

let fish: Sprite = null
let seal: Sprite = null
sprites.onOverlap(SpriteKind.Player, SpriteKind.Food, function (sprite, otherSprite) {
otherSprite.destroy()
info.changeScoreBy(1)
if (info.score() == 20) {
game.gameOver(true)
}
})
sprites.onOverlap(SpriteKind.Player, SpriteKind.Enemy, function (sprite, otherSprite) {
otherSprite.destroy()
info.changeLifeBy(-1)
})
scene.setBackgroundColor(9)
let penguin = sprites.create(img`
. f f .
f 1 1 f
f 1 1 f
. 4 4 .
`, SpriteKind.Player)
controller.moveSprite(penguin)
penguin.setStayInScreen(true)
info.setLife(3)
info.startCountdown(60)
let orca = sprites.create(img`
f f f f . f
f 1 f f f f
f f f f . f
`, SpriteKind.Enemy)
orca.setPosition(150, 110)
orca.follow(penguin, 25)
game.onUpdateInterval(1000, function () {
fish = sprites.create(img`
. 4 4 . 4
4 4 4 4 .
. 4 4 . 4
`, SpriteKind.Food)
fish.setPosition(randint(10, 150), randint(10, 110))
})
game.onUpdateInterval(3000, function () {
seal = sprites.create(img`
. c c c .
c f c c c
c c c c c
`, SpriteKind.Enemy)
seal.setPosition(160, randint(10, 110))
seal.vx = -40
seal.setFlag(SpriteFlag.AutoDestroy, true)
})
Stretch: Start a second, bigger project with tilemaps: a maze with walls, or a platformer whose camera follows the player across a level wider than the screen.
Support: A working Milestone 1 is a good result. Offer Space dodger (end of Arcade Foundations) or the Power-ups game as a base: change the sprites, the kinds and one rule to make it a new game.
What did you change after someone else played your game, and why?
Any change tied to what the player did, for example: they kept losing straight away, so I slowed the enemies down.
This ends Arcade advanced skills. The Game Maker Guide skillmap (arcade.makecode.com/skillmaps) is the next step for students building their own games. Class ideas: an arcade afternoon where everyone plays everyone's games and leaves one sticky note of praise and one of advice; a short design diary (pitch, what changed after playtesting, what you would add next). Students who want more can explore tilemaps and animation, or move to games in text code later.