Simon Painter

Down the Oregon Trail with Functional C#

What if the Oregon Trail's messy GOTO logic could become a clean, monadic pipeline? See how functional C# transforms a classic game into modern, testable code.

Down the Oregon Trail with Functional C#
#1about 5 minutes

Core principles of the functional programming paradigm

Functional programming is a declarative style emphasizing immutability, pure functions, and expressions over statements to write more testable and robust code.

#2about 2 minutes

Applying the umbra and penumbra metaphor to C#

Achieve nearly pure functional code by isolating necessary compromises, like I/O, to the outer edges (penumbra) of the application.

#3about 3 minutes

The historical context behind the Oregon Trail game

The game is based on the 19th-century migration of settlers in covered wagons from the US East Coast to Oregon.

#4about 7 minutes

How BASIC and time-sharing enabled interactive games

The creation of the user-friendly BASIC language and time-sharing terminals at Dartmouth University led to a boom in early computer games.

#5about 4 minutes

Analyzing the original 1975 Oregon Trail BASIC code

The original game's logic is built on line numbers, GOTO statements, and reversed IF conditions, which requires careful translation.

#6about 11 minutes

Handling impure user input with discriminated unions

Manage the side effects of console input by wrapping results in a `Maybe` type, a discriminated union representing `Something`, `Nothing`, or `Error` states.

#7about 5 minutes

Replacing indefinite loops with a functional helper

Avoid imperative `while` loops for input validation by using a recursive `iterate until` helper function that encapsulates the looping logic.

#8about 2 minutes

Structuring the main game loop with a monadic flow

Chain game events together using a `continue game` extension method that checks the game state before executing the next function, simplifying the main loop.

#9about 1 minute

Recreating the time-based hunting mini-game functionally

Implement the time-sensitive "type BANG" mechanic by injecting a time service to enable pure, testable functions for calculating shot accuracy.

#10about 3 minutes

Refactoring complex conditional logic with switch expressions

Replace the original game's convoluted, nested IF statements for rider encounters with a clean and readable C# switch expression.

#11about 3 minutes

Exploring other classic text-based games to remake

Consider other classic text-based games like Star Trek, Doctor Who, and Zork as potential future projects for functional programming exercises.

Related jobs
Jobs that call for the skills explored in this talk.

test

Milly
Vienna, Austria

Intermediate

test

Milly
Vienna, Austria

Intermediate

Featured Partners

Related Articles

View all articles
CH
Chris Heilmann
CODE100 Live Day challenge -"Scavenger Hunt" solution and winners
At last week's WeAreDevelopers LIVE day we released a new CODE100 challenge, this time a Scavenger Hunt where we hid parts of an overall message inside an HTML document and its assets. The overall message was:Hi, my name is Werner Brandes. My voice i...
CODE100 Live Day challenge -"Scavenger Hunt" solution and winners
BB
Benedikt Bischof
Get Old, go Slow, Write Code!
Welcome to the newest series of the WeAreDevelopers Magazine – Dev Talk Recap. This article recaps an interesting talk by Tobias Modig who gave advice about getting old(er) as a developer and slowing down. What you will learn:Thoughts of the speaker ...
Get Old, go Slow, Write Code!
CH
Chris Heilmann
WeAreDevelopers LIVE days are changing - get ready to take part
Starting with this week's Web Dev Day edition of WeAreDevelopers LIVE Days, we changed the the way we run these online conferences. The main differences are:Shorter talks (half an hour tops)More interaction in Q&AA tips and tricks "Did you know" sect...
WeAreDevelopers LIVE days are changing - get ready to take part

From learning to earning

Jobs that call for the skills explored in this talk.

C# Programmeur

C# Programmeur

HeadFirst

Intermediate
Blazor
.NET Core
Microsoft SQL Server