Current section

Files

Jump to
gchess src gchess.erl
Raw

src/gchess.erl

-module(gchess).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([perft/2, main/0]).
-spec perft(gleam@erlang@process:subject(game_server:message()), integer()) -> integer().
perft(Game_server_subject, Depth) ->
case Depth of
0 ->
1;
_ ->
Moves = game_server:all_legal_moves(Game_server_subject),
Nodes@2 = gleam@list:fold(
Moves,
0,
fun(Nodes, Move) ->
_assert_subject = game_server:apply_move_raw(
Game_server_subject,
Move
),
{ok, _} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"gchess"/utf8>>,
function => <<"perft"/utf8>>,
line => 34})
end,
Nodes@1 = Nodes + perft(Game_server_subject, Depth - 1),
_assert_subject@1 = game_server:undo_move(
Game_server_subject
),
{ok, _} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail@1,
module => <<"gchess"/utf8>>,
function => <<"perft"/utf8>>,
line => 38})
end,
Nodes@1
end
),
Nodes@2
end.
-spec main() -> {ok, nil} | {error, gleam@otp@actor:start_error()}.
main() ->
gleam@result:'try'(
game_server:new_server(),
fun(Server) ->
_assert_subject = game_server:new_game_from_fen(
Server,
<<"8/3k4/8/2BKB3/2PRP3/8/8/8 w - - 0 1"/utf8>>
),
{ok, _} = case _assert_subject of
{ok, _} -> _assert_subject;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail,
module => <<"gchess"/utf8>>,
function => <<"main"/utf8>>,
line => 10})
end,
_assert_subject@1 = game_server:disable_status(Server),
{ok, _} = case _assert_subject@1 of
{ok, _} -> _assert_subject@1;
_assert_fail@1 ->
erlang:error(#{gleam_error => let_assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _assert_fail@1,
module => <<"gchess"/utf8>>,
function => <<"main"/utf8>>,
line => 12})
end,
Start = os:system_time(second),
Perft_result = perft(Server, 2),
End = os:system_time(second),
gleam@io:print(<<"Perft result: "/utf8>>),
gleam@io:print(gleam@int:to_string(Perft_result)),
gleam@io:print(<<"\n"/utf8>>),
gleam@io:print(<<"Time: "/utf8>>),
gleam@io:print(gleam@int:to_string(End - Start)),
gleam@io:print(<<" seconds"/utf8>>),
gleam@io:print(<<"\n"/utf8>>),
{ok, nil}
end
).