Games: Menu
Mix.install([
{:jason, "~> 1.4"},
{:kino, "~> 0.8.0", override: true},
{:youtube, github: "brooklinjazz/youtube"},
{:hidden_cell, github: "brooklinjazz/hidden_cell"}
])
Navigation
Setup
Ensure you type the ea keyboard shortcut to evaluate all Elixir cells before starting. Alternatively you can evaluate the Elixir cells as you read.
Games: Menu
In your existing Games project, you’re going to create a Games.Menu module which allows players to select which game they would like to play.
$ iex -S mix
iex> Games.Menu.display()
Select a game:
1. Guessing Game
2. Rock Paper Scissors
3. Wordle
Select:
Depending on their choice, this let the player play either the Guessing Game, Rock Paper Scissors, or Wordle games you have already created.
Select a game:
1. Guessing Game
2. Rock Paper Scissors
3. Wordle
Select: 3
Enter a five letter word:
Games: Escript
Configure your game as an Escript. You’ll need to create a Games.CLI module with a main/1 function to display the Games.Menu.
defmodule Games.CLI do
def main(args) do
Games.Menu.display()
end
end
And configure the Games.CLI module using the :escript option inside of the Games.MixProject.project/0 function.
def project do
[
...
escript: [main_module: Games.CLI]
]
end
You should be able to build and start the games project as an escript.
$ mix escript.build
$ ./games
Select a game:
1. Guessing Game
2. Rock Paper Scissors
3. Wordle
Select:
Bonus: Finish Game
Allow the user to type "stop" to end any game. They should then be re-prompted with the menu to select the game they want to play.
Select a game:
1. Guessing Game
2. Rock Paper Scissors
3. Wordle
Select: 1
Enter your guess:
stop
Select a game:
1. Guessing Game
2. Rock Paper Scissors
3. Wordle
Select:
This may require custom stop logic in each existing game.
Mark As Completed
file_name = Path.basename(Regex.replace(~r/#.+/, __ENV__.file, ""), ".livemd")
save_name =
case Path.basename(__DIR__) do
"reading" -> "games_menu_reading"
"exercises" -> "games_menu_exercise"
end
progress_path = __DIR__ <> "/../progress.json"
existing_progress = File.read!(progress_path) |> Jason.decode!()
default = Map.get(existing_progress, save_name, false)
form =
Kino.Control.form(
[
completed: input = Kino.Input.checkbox("Mark As Completed", default: default)
],
report_changes: true
)
Task.async(fn ->
for %{data: %{completed: completed}} <- Kino.Control.stream(form) do
File.write!(
progress_path,
Jason.encode!(Map.put(existing_progress, save_name, completed), pretty: true)
)
end
end)
form
Commit Your Progress
Run the following in your command line from the curriculum folder to track and save your progress in a Git commit.
Ensure that you do not already have undesired or unrelated changes by running git status or by checking the source control tab in Visual Studio Code.
$ git checkout -b games-menu-exercise
$ git add .
$ git commit -m "finish games menu exercise"
$ git push origin games-menu-exercise
Create a pull request from your games-menu-exercise branch to your solutions branch.
Please do not create a pull request to the DockYard Academy repository as this will spam our PR tracker.
DockYard Academy Students Only:
Notify your teacher by including @BrooklinJazz in your PR description to get feedback.
You (or your teacher) may merge your PR into your solutions branch after review.
If you are interested in joining the next academy cohort, sign up here to receive more news when it is available.
Up Next
| Previous | Next |
|---|---|
| Executables | Advanced Pattern Matching |