Algorithm

Pokemon Game Algorithm

This is a real take-home challenge I've encountered. It's not about finding the optimal algorithm — it's about demonstrating clean domain modeling, OOP pr...

10 Apr 2024

Pokemon Game Algorithm

This is a real take-home challenge I've encountered. It's not about finding the optimal algorithm — it's about demonstrating clean domain modeling, OOP principles, and testable code.

The challenge

Build a creature-collecting game. Think Pokemon, but simplified. A Collector moves around a world, finds nearby Creatures, and catches them.

Part 1: Domain modeling

Creatures have a family (flyer, swimmer, runner) and a species (Bird, Shark, Lion). Both Collectors and Creatures have a Position. A World holds references to all entities.

Typescript
type Family = "flyer" | "swimmer" | "runner";

interface Position {
    x: number;
    y: number;
}

class Creature {
    constructor(
        public name: string,
        public family: Family,
        public species: string,
        public position: Position
    ) {}
}

class Collector {
    public collection: Creature[] = [];

    constructor(
        public name: string,
        public position: Position
    ) {}
}

class World {
    public creatures: Creature[] = [];
    public collectors: Collector[] = [];
}

Part 2: Finding and catching

Define "nearby" however you want. I use Euclidean distance with a configurable radius. Catching picks a random nearby creature and moves it to the collector's collection.

Typescript
function distance(a: Position, b: Position): number {
    return Math.sqrt((a.x - b.x) ** 2 + (a.y - b.y) ** 2);
}

function getNearbyCreatures(
    world: World,
    collector: Collector,
    radius: number
): Creature[] {
    return world.creatures.filter(
        (c) => distance(c.position, collector.position) <= radius
    );
}

function catchCreature(
    world: World,
    collector: Collector,
    radius: number
): Creature | null {
    const nearby = getNearbyCreatures(world, collector, radius);
    if (nearby.length === 0) return null;

    const target = nearby[Math.floor(Math.random() * nearby.length)];
    collector.collection.push(target);
    world.creatures = world.creatures.filter((c) => c !== target);
    return target;
}

What interviewers look for

This challenge tests design thinking, not algorithm knowledge. They want to see:

  • Clean abstractions that separate concerns
  • Meaningful names that communicate intent
  • Tests that cover edge cases (empty world, no nearby creatures, catching the last creature)
  • Code that's easy to extend (add new families, new behaviors)

Trade-offs

I kept Position as a simple {x, y} object. In a real game, you might want a grid-based system, hex coordinates, or a spatial index for efficient proximity queries. The random catch mechanic is simple but could be extended with probabilities based on creature rarity or distance.

Go further
Live cohort on Maven

Production-Ready Systems with LLMs and Agents

A live Maven cohort, 5 October to 2 November: eight 90-minute sessions where you build LLM and agent systems that survive real traffic, real cost and real failure. Tuesdays and Thursdays, 7:30 to 9:00pm London.

Cohort 2 starts 5 October. Eight live sessions, $1,500.

View the live cohort

Keep reading