89 lines
2.0 KiB
Elixir
89 lines
2.0 KiB
Elixir
defmodule PentoWeb.WrongLive do
|
|
use PentoWeb, :live_view
|
|
|
|
@winning_score 15
|
|
|
|
def mount(_params, _session, socket) do
|
|
socket =
|
|
socket
|
|
|> assign(score: 0)
|
|
|> assign(message: "Make a guess:")
|
|
|> assign(number: random_number())
|
|
|
|
{:ok, socket}
|
|
end
|
|
|
|
def render(assigns) do
|
|
~H"""
|
|
<h1 class="mb-4 text-4xl font-extrabold">Your score: <%= @score %></h1>
|
|
<h2>
|
|
<%= @message %>
|
|
</h2>
|
|
<br />
|
|
<h2 class="flex justify-center">
|
|
<%= if @score >= winning_score() do %>
|
|
<.link
|
|
href={~p"/guess"}
|
|
class="bg-blue-500 hover:bg-blue-700 text-white text-center font-bold py-2 px-4 border border-blue-700 rounded m-1"
|
|
>
|
|
Play again!
|
|
</.link>
|
|
<% else %>
|
|
<%= for n <- 1..10 do %>
|
|
<.link
|
|
class="bg-blue-500 hover:bg-blue-700 text-white text-center font-bold py-2 px-4 border border-blue-700 rounded m-1"
|
|
phx-click="guess"
|
|
phx-value-number={n}
|
|
>
|
|
<%= n %>
|
|
</.link>
|
|
<% end %>
|
|
<% end %>
|
|
</h2>
|
|
"""
|
|
end
|
|
|
|
defp random_number() do
|
|
:rand.uniform(10)
|
|
end
|
|
|
|
defp winning_score(), do: @winning_score
|
|
|
|
def handle_event("guess", %{"number" => guess}, socket) do
|
|
number = socket.assigns.number |> to_string()
|
|
|
|
socket =
|
|
if number == guess do
|
|
correct_guess(guess, socket)
|
|
else
|
|
wrong_guess(guess, socket)
|
|
end
|
|
|
|
{:noreply, socket}
|
|
end
|
|
|
|
defp correct_guess(guess, socket) do
|
|
score = socket.assigns.score + 8
|
|
|
|
message = if score >= @winning_score do
|
|
"Your guess: #{guess}. Correct. You won!"
|
|
else
|
|
"Your guess: #{guess}. Correct. Guess the next number."
|
|
end
|
|
|
|
socket
|
|
|> assign(message: message)
|
|
|> assign(score: score)
|
|
|> assign(number: random_number())
|
|
end
|
|
|
|
defp wrong_guess(guess, socket) do
|
|
message = "Your guess: #{guess}. Wrong. Guess again."
|
|
score = socket.assigns.score - 1
|
|
|
|
socket
|
|
|> assign(message: message)
|
|
|> assign(score: score)
|
|
end
|
|
end
|