Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Digital Pet written in Elixir
defmodule DigiPet do
def new(name \\ "George"), do: _new(name)
defp _new(name), do: spawn(__MODULE__, :start, [%{ name: name, age: 0, hunger: 0, dirtyness: 0, thirst: 0, sadness: 0 }])
def show(pet), do: send(pet, { self, :show })
def feed(pet), do: send(pet, { self, :feed })
def clean(pet), do: send(pet, { self, :clean })
def drink(pet), do: send(pet, { self, :drink })
def play(pet), do: send(pet, { self, :play })
def start(pet) do
receive do
{sender, msg} ->
pet = _update(pet, msg)
send sender, { :ok, _pet_state(pet) }
start(pet)
after 500 ->
_step(pet)
|> start
end
end
defp _pet_state(pet), do: _state(pet.name, pet.age, pet.hunger, pet.dirtyness, pet.thirst, pet.sadness)
# Happyness States
defp _state(name, _a, _h, _d, _t, sadness) when sadness > 60, do: _render "#{name} is inconsolable."
defp _state(name, _a, _h, _d, _t, sadness) when sadness > 40, do: _render "#{name} is sad."
defp _state(name, _a, _h, _d, _t, sadness) when sadness > 20, do: _render "#{name} is a a little upset."
defp _state(name, _a, _h, _d, _t, sadness) when sadness < 0, do: _render "#{name} is a happy."
defp _state(name, _a, _h, _d, _t, sadness) when sadness < -20, do: _render "#{name} is a extatic."
# Thirst States
defp _state(name, _a, _h, _d, thirst, _s) when thirst > 35, do: _render "#{name} is parched."
defp _state(name, _a, _h, _d, thirst, _s) when thirst > 15, do: _render "#{name} is thirsty."
# Hunger States
defp _state(name, _a, hunger, _d, _t, _s) when hunger > 100, do: _render "#{name} is starving."
defp _state(name, _a, hunger, _d, _t, _s) when hunger > 50, do: _render "#{name} is hungry."
defp _state(name, _a, hunger, _d, _t, _s) when hunger > 25, do: _render "#{name} is peckish."
defp _state(name, _a, hunger, _d, _t, _s) when hunger < 0, do: _render "#{name} is full."
# Age States
defp _state(name, age, _h, _d, _t, _s) when age < 50, do: _render "#{name} is a baby."
defp _state(name, age, _h, _d, _t, _s) when age < 250, do: _render "#{name} is a child."
defp _state(name, age, _h, _d, _t, _s) when age < 450, do: _render "#{name} is a teenager."
defp _state(name, age, _h, _d, _t, _s) when age < 750, do: _render "#{name} is an adult."
defp _state(name, age, _h, _d, _t, _s) when age < 950, do: _render "#{name} is getting old."
defp _state(name, _a, _h, _d, _t, _s), do: _render "#{name} is fine."
defp _update(pet, :show), do: pet
defp _update(pet, :feed), do: %{ name: pet.name,
age: pet.age,
hunger: pet.hunger - 30,
dirtyness: pet.dirtyness,
thirst: pet.thirst,
sadness: pet.sadness}
defp _update(pet, :clean), do: %{ name: pet.name,
age: pet.age,
hunger: pet.hunger,
dirtyness: pet.dirtyness - 20,
thirst: pet.thirst,
sadness: pet.sadness}
defp _update(pet, :drink), do: %{ name: pet.name,
age: pet.age,
hunger: pet.hunger,
dirtyness: pet.dirtyness,
thirst: pet.thirst - 25,
sadness: pet.sadness}
defp _update(pet, :play), do: %{ name: pet.name,
age: pet.age,
hunger: pet.hunger,
dirtyness: pet.dirtyness,
thirst: pet.thirst,
sadness: pet.sadness - 18}
defp _step(pet), do: %{ name: pet.name,
age: pet.age + 1,
hunger: pet.hunger + 1,
dirtyness: pet.dirtyness + 1,
thirst: pet.thirst + 1,
sadness: pet.sadness + 1}
defp _render(text), do: IO.puts "\n\n#{text}\n\n"
end

Instuctions

Run the file with:

$ iex digipet.ex

The create a pet via:

iex> pet = DigiPet.new "Franklin"

Available commands are:

iex> DigiPet.show pet
iex> DigiPet.feed pet
iex> DigiPet.clean pet
iex> DigiPet.drink pet
iex> DigiPet.play pet
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.