DEV Community

Chau Kirahi
Chau Kirahi

Posted on

Daily Pokémon Battle Game

I Built a Daily Pokémon Battle Game as a Browser-Based Strategy Puzzle

I wanted to explore whether a turn-based battle could work as a small daily puzzle instead of an endless progression system.

The result is Daily Red Pokémon: a free browser game where you face the same six-Pokémon team once per local day. The goal is not to collect items or grind levels. It is to make a few meaningful decisions with a fixed team and a limited official attempt.

The daily constraint

Each day, the game selects six level-100 Pokémon from a curated pool. The selection is deterministic, so players on the same local date receive the same team.

There is one official attempt per day, but practice battles are unlimited. This distinction was important. A failed official battle should create tension, while practice mode should make it possible to understand a matchup without waiting until tomorrow.

The player's progress is saved in the browser, so an unfinished battle can be resumed later. No account or server-side profile is required.

Running the battle in the browser

The site is built as a static Astro application. The battle simulator runs in a browser Web Worker, which keeps the interface responsive while turns are processed.

The simulator uses Gen III battle data and damage rules. Physical and special damage are determined by move type, and the battle state includes weather, status effects, held items, abilities, move PP, switching, and fainted Pokémon.

The worker exposes a small message-based interface:

  • initialize a battle with the daily team and seed
  • submit a move or switch action
  • return a public battle snapshot and event log

The UI only receives the information needed to render the battle. The simulator itself stays isolated from the page controls.

A small opponent AI

Red does not use a neural network or a large search tree. The opponent scores legal moves using estimated damage, accuracy, type immunity, status effects, recovery, and setup moves.

That approach is deliberately modest. A simple heuristic is easier to inspect, faster to run in a browser, and predictable enough for a daily puzzle. It also leaves room for interesting mistakes: the opponent is consistent, but not perfectly optimal.

Designing for short sessions

The interface is designed around a few repeated actions:

  1. Choose a lead Pokémon.
  2. Inspect the available moves and their PP.
  3. Choose an action for the current turn.
  4. Read the event log and react to the result.
  5. Switch when a matchup requires it.

The battle log is kept in local storage along with the daily result. Practice sessions do not overwrite the official daily record.

The game also works without a backend, which keeps hosting simple. Astro generates the site as static files, and the browser handles the battle session locally.

What I learned

The hardest part was not drawing the battle screen. It was making the rules visible enough that a player could learn from a loss.

A daily format needs clear feedback:

  • why a move dealt the damage it did
  • when a switch consumed the turn
  • which Pokémon are still available
  • whether the result belongs to the official attempt or practice mode

I also learned that deterministic content changes the role of balancing. A team that feels reasonable in isolation can become frustrating when every player encounters it on the same day. The daily team pool and rules version therefore need to be treated as part of the product, not just configuration data.

You can try the current build here: https://dailyredpokemon.org/

Daily Red Pokémon is an unofficial fan project and is not affiliated with or endorsed by Nintendo, Creatures Inc., GAME FREAK, or The Pokémon Company. I am interested in feedback about the battle rules, browser performance, and whether the daily format creates the right amount of pressure.

Top comments (0)