Packages
islands_engine
0.2.39
0.2.65
0.2.64
0.2.63
0.2.62
0.2.61
0.2.60
0.2.59
0.2.58
0.2.56
0.2.55
0.2.54
0.2.53
0.2.52
0.2.51
0.2.50
0.2.49
0.2.48
0.2.47
0.2.46
0.2.45
0.2.44
0.2.43
0.2.42
0.2.41
0.2.40
0.2.39
0.2.38
0.2.37
0.2.36
0.2.35
0.2.34
0.2.33
0.2.32
0.2.31
0.2.30
0.2.29
0.2.28
0.2.27
0.2.25
0.2.24
0.2.23
0.2.22
0.2.21
0.2.20
0.2.19
0.2.18
0.2.17
0.2.16
0.2.15
0.2.13
0.2.12
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.81
0.1.80
0.1.79
0.1.78
0.1.77
0.1.76
0.1.75
0.1.73
0.1.72
0.1.71
0.1.70
0.1.69
0.1.68
0.1.67
0.1.66
0.1.65
0.1.64
0.1.63
0.1.62
0.1.61
0.1.60
0.1.59
0.1.58
0.1.57
0.1.56
0.1.55
0.1.54
0.1.53
0.1.52
0.1.51
0.1.50
0.1.49
0.1.48
0.1.47
0.1.46
0.1.45
0.1.44
0.1.43
0.1.42
0.1.41
0.1.40
0.1.39
0.1.38
0.1.37
0.1.36
0.1.35
0.1.34
0.1.33
0.1.32
0.1.31
0.1.30
0.1.29
0.1.28
0.1.27
0.1.26
0.1.25
0.1.24
0.1.23
0.1.22
0.1.21
0.1.20
0.1.19
0.1.18
0.1.17
0.1.16
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.0
Models the Game of Islands.
Current section
Files
Jump to
Current section
Files
lib/islands/engine/ie.ex
defmodule Islands.Engine.IE do
@moduledoc false
# Example of an IEx session...
#
# iex --sname islands -S mix
#
# use Islands.Engine.IE
# print_tiles()
# DemoProc.loop_test()
# guesses = Guesses.new()
# {:ok, coord1} = Coord.new(1, 1)
# {:ok, coord2} = Coord.new(2, 2)
# guesses = update_in(guesses.hits, &MapSet.put(&1, coord1))
# guesses = update_in(guesses.hits, &MapSet.put(&1, coord2))
# guesses = update_in(guesses.hits, &MapSet.put(&1, coord1))
# {:ok, coord} = Coord.new(4, 6)
# Island.new(:l_shape, coord)
# Island.new(:wrong, coord)
# {:ok, coord} = Coord.new(10, 10)
# Island.new(:l_shape, coord)
# Island.new(:dot, coord)
# Example of IEx sessions in different nodes...
#
# iex --sname c1 -S mix
#
# Islands.Text.Client.start("Eden", "Adam", :m, mode: :auto)
#
# iex --sname c2 -S mix
#
# Islands.Text.Client.join("Eden", "Eve", :f, mode: :auto)
#
# iex --sname islands -S mix
#
# :observer.start # optional
# use Islands.Engine.IE
#
# pid = keep_killing(DynSup)
# -- or --
# pid = keep_killing("Eden")
#
# Process.exit(pid, :kill)
alias Islands.Grid.Tile
alias Islands.Engine
# Supervisor option defaults for :max_restarts and :max_seconds
@max_restarts 3
@max_seconds 5
# Pause of 2 seconds between kills...
@buffer 333
@seconds_per_restart Float.round(@max_seconds / @max_restarts, 3)
@pause round(@seconds_per_restart * 1000) + @buffer
@snooze 10
defmacro __using__(_options) do
quote do
import unquote(__MODULE__)
alias unquote(__MODULE__)
alias IO.ANSI.Plus, as: ANSI
alias Islands.Engine.Server.{
AddPlayer,
Error,
GuessCoord,
Log,
PositionAllIslands,
PositionIsland,
Restart,
SetIslands,
Stop
}
alias Islands.Engine.{
Callback,
DemoProc,
DynSup,
Server,
Top
}
alias Islands.Grid.Tile
alias Islands.Island.Offsets
alias Islands.Board.{Cache, Response}
alias Islands.{
Board,
Coord,
Engine,
Game,
Grid,
Guesses,
Island,
PlayerID,
Player,
Request,
Response,
Score,
State,
Tally
}
:ok
end
end
@spec print_tiles :: :ok
def print_tiles do
IO.puts(":atoll => #{Tile.new(:atoll)}")
IO.puts(":dot => #{Tile.new(:dot)}")
IO.puts(":l_shape => #{Tile.new(:l_shape)}")
IO.puts(":s_shape => #{Tile.new(:s_shape)}")
IO.puts(":square => #{Tile.new(:square)}")
IO.puts(":atoll_hit => #{Tile.new(:atoll_hit)}")
IO.puts(":dot_hit => #{Tile.new(:dot_hit)}")
IO.puts(":l_shape_hit => #{Tile.new(:l_shape_hit)}")
IO.puts(":s_shape_hit => #{Tile.new(:s_shape_hit)}")
IO.puts(":square_hit => #{Tile.new(:square_hit)}")
IO.puts(":board_miss => #{Tile.new(:board_miss)}")
IO.puts(":hit => #{Tile.new(:hit)}")
IO.puts(":miss => #{Tile.new(:miss)}")
IO.puts(":ocean => #{Tile.new(nil)}")
end
@spec keep_killing(atom | binary) :: pid
def keep_killing(name) do
IO.puts("Pause between kills: #{@pause} ms...")
spawn(fn ->
for _ <- Stream.cycle([:ok]) do
name |> pid() |> Process.exit(:kill)
Process.sleep(@pause)
end
end)
end
## Private functions
@spec pid(atom | binary) :: pid
defp pid(name) when is_atom(name) do
case Process.whereis(name) do
pid when is_pid(pid) ->
pid
nil ->
Process.sleep(@snooze)
pid(name)
end
end
defp pid(name) when is_binary(name) do
case Engine.game_pid(name) do
pid when is_pid(pid) ->
pid
nil ->
Process.sleep(@snooze)
pid(name)
end
end
end