Game Tutorial
Mix.install([
:phoenix,
:kino,
:elixir_math,
{:game_server, git: "https://github.com/nettinho/game_server.git"}
])
Kino.SmartCell.register(SmartCells.Game1)
Kino.SmartCell.register(SmartCells.Game2)
Kino.SmartCell.register(SmartCells.Game3)
Kino.SmartCell.register(SmartCells.Game4)
Kino.SmartCell.register(SmartCells.Game5)
Game tutorial
En el mini-juego de Elixir Adventure tendrás que dar instrucciones para mover tu jugador, representado por un círculo con el nombre de 3 caractéres.
A continuación están 5 niveles para guiarte por los conceptos básicos del juego.
En cada nivel, tras ejecutar la primera celda (que pone ‘Evalúa la celda par aactivar el mapa’), se mostra el mapa del nivel. Abajo estará la descripción y instrucciones básicas del nível.
En seguida hay una celda de código dónde deberás ejecutar los comandos para la solución. Al ejecutar el mapa, quedará disponible en el entorno una variable server
que deberás utilizar para interactuar con el mapa.
Level 1 - Entrar y mover
{:ok, server} =
GameServer.start_link(:local, %{
initial_fruit: {600, 125, 20},
fruit_generated_probability: 0,
success_func: fn %{fruits: fruits} -> Enum.empty?(fruits) end
})
SmartCells.KinoGame.new(server)
Descripción
En ese nível aprenderás a registrar tu jugador en el mapa y moverlo. Deberás enviar el comando de move
a la posición de la fruta.
Intrucciones
- Registra un jugador
-
Muévelo a la coordenada
{600, 125}
para comer la fruta.
Game.register(server, "nombre_jugador")
# Mueve el jugador a la coordenada {600, 125} usando la siguiente función:
# Game.move(server, {coordenada_x, coordenada_y})
Level 2 - Comer todas las frutas
{:ok, server} =
GameServer.start_link(:local, %{
initial_fruits_count: 5,
fruit_generated_probability: 0,
success_func: fn %{fruits: fruits} -> Enum.empty?(fruits) end
})
SmartCells.KinoGame.new(server)
Descripción
Aqui deberás solicitar el estado del juego para descubrir dónde se han generado aleatoriamente las frutas. Luego tendrás que ir a cada una de las posiciones para recoger todas las frutas.
Atención: Si mandas 2 comandos de move
seguidos, no se encolarán. El segundo comando sobrescribirá el anterior.
Intrucciones
- Registra un jugador
- Obtén la posición de las frutas.
- Come todas las frutas, en cualquier orden.
Game.register(server, "nombre_jugador")
# La posición de las frutas se puede obtener con:
# Game.view(server)
# Encontrarás:
# fruits: %{
# {coordenada_x_fruta_1, coordenada_y_fruta_1} => {tamaño, :default},
# {coordenada_x_fruta_2, coordenada_y_fruta_2} => {tamaño, :default},
# <... resto de frutas>
# }
# Mueve el jugador a cada una de las frutas usando la función Game.move
Level 3 - Fruta PowerUp
{:ok, server} =
GameServer.start_link(:local, %{
initial_fruits: [{500, 125, 20}, {300, 125, 20, :power_up}],
fruit_generated_probability: 0,
success_func: fn %{fruits: fruits} ->
fruits |> Enum.find(fn {_, {_, type}} -> type == :power_up end) |> is_nil()
end,
failure_func: fn %{fruits: fruits} ->
fruits |> Enum.find(fn {_, {_, type}} -> type == :default end) |> is_nil()
end
})
SmartCells.KinoGame.new(server)
Descripción
Hay frutas que brillan y al comerlas te dejan en un modo especial. Estas frutas son del tipo :power_up
. En este nivel verás 2 frutas, y deberás buscar y comer la fruta power_up
Intrucciones
- Come la fruta powerup, la de color violeta. Ignora la fruta normal amarilla.
Game.register(server, "nombre_jugador")
# Busca la posición de la fruta powerup
# En Game.view(server) encontrarás:
# fruits: %{
# {coordenada_x_fruta_1, coordenada_y_fruta_1} => {tamaño, :power_up},
# <...resto de frutas>
# }
Level 4
{:ok, server} =
GameServer.start_link(:local, %{
initial_fruits: [{500, 125, 20}, {300, 125, 20, :power_up}],
initial_enemies: [{"enemy", %{pos_x: 600, pos_y: 200, size: 20, score: 5000}}],
powered_ticks_per_fruit_size: 50,
max_powered: 10000,
powered_velocity_bonus: 0,
fruit_generated_probability: 0,
success_func: fn %{players: players} ->
{_, %{score: score, status: status}} =
players |> Enum.find(fn {_, %{pid: pid}} -> is_nil(pid) end)
score < 5000 and status == :idle
end
})
SmartCells.KinoGame.new(server)
Instrucciones
- Come primero la fruta powerup y dirígete después al enemigo para atacarlo.
Game.register(server, "nombre_jugador")
# La posición del enemigo se puede encontrar en Game.view(server):
# players: %{
# "nodo_jugador@host" => %{
# ...
# name: "enemy"
# pos: {coordenada_x_enemigo, coordenada_y_enemigo},
# }
# }
Level 5
{:ok, server} =
GameServer.start_link(:local, %{
initial_fruits: [
{450, 125, 5, :power_up},
{400, 70, 10},
{300, 125, 15, :power_up},
{400, 205, 20},
{600, 75, 25}
],
powered_ticks_per_fruit_size: 50,
max_powered: 10000,
powered_velocity_bonus: 0.001,
fruit_generated_probability: 0,
success_func: fn %{fruits: fruits} -> Enum.empty?(fruits) end,
failure_func: fn
%{fruits: fruits} when fruits == %{} ->
false
%{fruits: fruits} ->
min_size = fruits |> Enum.map(fn {_, {size, _}} -> size end) |> Enum.min()
count = Enum.count(fruits)
min_size < 30 - count * 5
end
})
SmartCells.KinoGame.new(server)
Instrucciones
- Come las frutas por orden de cercanía.
Game.register(server, "nombre_jugador")
# Las coordenadas {x,y} de la fruta más cercana se pueden obtener con:
# GameUtils.closest_fruit(player, fruits)
# Definición de un módulo Bot
defmodule Bot do
# Función principal de ejecución
def run(server) do
# Eliminación de posibles mensajes anteriores
:c.flush()
# Entrada a un bucle que recibe continuamente mensajes
loop_receive(server)
end
defp loop_receive(server) do
receive do
{:board_tick, %{status: :idle} = player, _players, fruits} ->
# Si el jugador se encuentra parado (:idle), nos movemos a la fruta más cercana
# Escribe aquí tu código
_ ->
# Si el jugador se encuentra en otro estado (incluído movimiento), no hacemos nada:
:ok
end
loop_receive(server)
end
end
# Ejecución del bot:
Bot.run(server)