// Cornell · Design for Physical Interaction · Hardware Game
Color Matching
A two-player arcade duel on a single ring of light: spin your dial, find your color, and get there before your opponent does.
Overview
Color Matching is a two-player game played on a color wheel. Red and Blue each turn a rotary dial to chase their own target block. Whoever lands closest to their color, fastest, takes the round.
The brief was a 1D game: one dimension of input, one dimension of feedback, and no reliance on text. I led our three-person team (with Lexie Ma and Lisa Yang) and built most of the game myself: the hardware and circuitry, the on-screen interface, and the 3D-printed enclosure. We took it through three prototypes and a playtest with 15 classmates before showing it at the class Arcade.
My contribution at a glance
Project leadHardware & circuitryGame interface3D-printed enclosure
Game
01
One dial, one ring, two colors
We started from games that are about reading color, such as color-mixing and color-guessing games, and from Wavelength, where you turn a dial toward a hidden target. We compressed that into a race: both players share one wheel, but each one is hunting a different block.
A
Spin
the wheel spins for 3.5 s and lands on a random start
B
Guess
each player turns their dial toward their target
C
Score
the closer player wins; the ring flashes their color
D
Escalate
a new target appears and a segment is added
02
Harder by the clock, harder by the eye
With only one input, difficulty has to come from somewhere other than more buttons. We used two levers, and I designed the interface for every stage so the change reads at a glance. The guess window shrinks by 500 ms each stage (temporal difficulty), and the wheel gains more segments, so targets get smaller and neighbouring colors get closer (perceptual and motor difficulty).
10.0 sStage 1
9.5 s2
9.0 s3
8.5 s4
8.0 s5
7.5 sStage 6
Round guess time per stage. Segment count increases alongside it.
System
03
From a twist to a verdict
We split the software into three layers, so a physical turn becomes a clear result. The input layer reads the encoders, a state machine runs the round, and the output layer drives both the screen and the LED strip.
Rotary dialinput
→
Input interpreterkey · flags
→
State machinelogic
→
Game datascore · state
→
Screen + LED stripoutput
Round state machine
Every round runs the same loop. After a fixed 3.5-second spin, the guess timer starts. When it ends, the round is scored and the game checks whether it has reached the maximum number of rounds.
init→spin · 3.5 s→guess · timer→score→next / end
Winner logic
Distance is measured around the circle, so the wheel has no “edge.” Each player’s score is 100 minus their distance from the target, and the higher score wins.
distance = |final − target| (circular)
score = 100 − distance
winner = higher score (red vs. blue)
score = 100 − distance
winner = higher score (red vs. blue)
Hardware
04
Choosing the right input
I built the circuit to be deliberately small: an Arduino Micro, a KY-040 rotary encoder per player, a tactile switch, and a WS2812B addressable LED strip, prototyped on a breadboard.
The controller decided how the game would feel, so I compared a rotary encoder with a push button across six criteria. The rotary won on almost everything that mattered for this game.
| Rotary | Button | |
|---|---|---|
| Matches the circular wheel | ●●●●● | ●●○○○ |
| Keeps up with a fast pace | ●●●●● | ●●○○○ |
| Tactile feedback | ●●●●○ | ●●●○○ |
| Resists accidental input | ●●○○○ | ●●●●● |
| Fits the code (direction) | ●●●●○ | ●○○○○ |
| Continuous triggering | ●●●●○ | ●●○○○ |
Process
05
Three prototypes, one input
Each round of prototyping removed something. We started with a shared joystick, then gave each player their own dial, and finally took the words off the screen so light and color alone would carry the game.
Prototype 01
Does the loop work?
A cardboard dial on a shared joystick ran the core loop. Two players on one control felt lively, but their hands collided, the joystick’s direction didn’t match the screen, and someone had to hold it in place.
Prototype 02
One dial each
We switched to a rotary encoder per player and built a stand that puts the dial at an easy height while hiding the Arduino. On-screen words and extra buttons were removed to make the game truly 1D.
Prototype 03
Let the light talk
Playtesting with 15 classmates pushed us toward a fully integrated body: a 3D-printed drum with a clear acrylic face, an LED strip that announces the winner, level design, and reworked hints for players new to color theory.
What worked
Two players on one object felt more interactive.The joystick gave slight vibration feedback.A circular control matched the color wheel.
What broke
Players’ hands collided when rotating.The joystick’s direction didn’t match the screen.It had to be held in place while playing.The Arduino was exposed.
06
Building the cabinet
The final enclosure combines three materials: a 3D-printed drum I modeled to hold the electronics, a clear acrylic face that diffuses the LED strip, and a sanded wooden stand. Working in wood taught us to round every edge and sand every surface, because players grab the object without thinking.
Arcade
Two strangers, one ring
We showed Color Matching at the course’s Arcade at Cornell AAP on December 8, 2025. With no text to read, the setup had to explain itself: two dials, one ring, and a flash of red or blue that tells everyone nearby who just won.
Takeaway
Fewer inputs, clearer play.
With one physical action and feedback in light, color, and timing, the controller, pacing, and result flash carry the rules, so the game is designed to be read without instructions, the way a good attraction reads from across the room.