DEV BLOG / 03
Getting two teams through a game
Taking the more varied player profiles into a first single-game simulation.
Game screenshots
The last update was about making the players less interchangeable. I could have kept tweaking that generator forever. At some point, I had to give the players a game to play.
So I started connecting it to the Game Simulation Engine. One matchup was enough for now. Thinking about a whole league before I could make sense of one game would have been a very efficient way to overwhelm myself.
Naming it an engine was the easy part. I had mistaken a filename for a qualification.
What changed since the last post
- Player data moved into team rosters. I was working with two sides in a matchup, rather than checking generated players one at a time.
- I started the single-game simulation loop. The immediate goal was to get those rosters through one football game and produce a result I could examine.
- Ratings started needing a football meaning. I began working through how the differences from the player generator should affect what happened in a matchup.
- I looked past the final score. Player contributions and the route to a result became part of what I needed to inspect.
- The two engines started feeding work back to each other. Trying to use a player field in a game showed me where the generator was still making assumptions I hadn’t thought through.
Getting to kickoff
Prototype captures of the matchup and the game itself.


A score wasn’t enough
A better roster should usually have an advantage. It shouldn’t get handed a win. I understood that as a football fan; turning it into something useful in code was another job entirely.
The temptation was to see a plausible score and call the run a success. But a believable final number could hide some very questionable decisions underneath it. I needed to look at how the players contributed, especially after changing who was on the team.
This was progress, but I was nowhere near ready to declare that I’d cracked football simulation. Getting a result gave me something to investigate. It didn’t tell me the result deserved to be trusted.
That’s where the next stretch went: working out why a game ended the way it did.
