mirror of
https://github.com/correl/riichi.git
synced 2024-11-27 19:19:54 +00:00
Initial hand scoring, handles Daisangen only
This commit is contained in:
parent
6e8ab5e994
commit
d549089063
3 changed files with 49 additions and 1 deletions
|
@ -2,3 +2,14 @@
|
||||||
suit,
|
suit,
|
||||||
value
|
value
|
||||||
}).
|
}).
|
||||||
|
|
||||||
|
-record(hand, {
|
||||||
|
tiles=[],
|
||||||
|
sets=[]
|
||||||
|
}).
|
||||||
|
|
||||||
|
-record(set, {
|
||||||
|
count,
|
||||||
|
tile,
|
||||||
|
open=true
|
||||||
|
}).
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
is_valid_tile/1,
|
is_valid_tile/1,
|
||||||
dora/1,
|
dora/1,
|
||||||
nearest/2,
|
nearest/2,
|
||||||
score/3
|
score/3,
|
||||||
|
score_hand/1,
|
||||||
|
score_hand/2,
|
||||||
|
score_hand/3
|
||||||
]).
|
]).
|
||||||
|
|
||||||
is_valid_tile(#tile{suit=dragon, value=Value}) ->
|
is_valid_tile(#tile{suit=dragon, value=Value}) ->
|
||||||
|
@ -71,3 +74,26 @@ score(Fu, Han, Limit) ->
|
||||||
true ->
|
true ->
|
||||||
Score
|
Score
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
score_hand(#hand{}=H) ->
|
||||||
|
score_hand(H, 20).
|
||||||
|
|
||||||
|
score_hand(#hand{}=H, Fu) ->
|
||||||
|
score_hand(H, Fu, true).
|
||||||
|
|
||||||
|
score_hand(#hand{tiles=T, sets=_S}=_H, BaseFu, Limit) ->
|
||||||
|
Fu = [
|
||||||
|
BaseFu
|
||||||
|
],
|
||||||
|
Han = [
|
||||||
|
_DaiSanGen = case sets:is_subset(sets:from_list([{3, #tile{suit=dragon, value=red}}, {3, #tile{suit=dragon, value=white}}, {3, #tile{suit=dragon, value=green}}]), sets:from_list(find_sets(T))) of
|
||||||
|
true -> 13;
|
||||||
|
_ -> 0
|
||||||
|
end
|
||||||
|
],
|
||||||
|
score(lists:sum(Fu), lists:sum(Han), Limit).
|
||||||
|
|
||||||
|
find_sets(Tiles) ->
|
||||||
|
Unique = sets:to_list(sets:from_list(Tiles)),
|
||||||
|
[{length(lists:filter(fun(X) -> X == T end, Tiles)), T}
|
||||||
|
|| T <- Unique].
|
||||||
|
|
|
@ -82,3 +82,14 @@ score_fu_limit_test() ->
|
||||||
|
|
||||||
score_rounded_test() ->
|
score_rounded_test() ->
|
||||||
?assertEqual(riichi:score(20, 1, true), 200). % 160 rounded up
|
?assertEqual(riichi:score(20, 1, true), 200). % 160 rounded up
|
||||||
|
|
||||||
|
score_hand_dai_san_gan_test() ->
|
||||||
|
Hand = #hand{
|
||||||
|
tiles = lists:flatten([
|
||||||
|
lists:duplicate(3, #tile{suit=dragon, value=red}),
|
||||||
|
lists:duplicate(3, #tile{suit=dragon, value=white}),
|
||||||
|
lists:duplicate(3, #tile{suit=dragon, value=green}),
|
||||||
|
lists:duplicate(3, #tile{suit=wind, value=east}),
|
||||||
|
lists:duplicate(2, #tile{suit=wind, value=north})])
|
||||||
|
},
|
||||||
|
?assertEqual(riichi:score_hand(Hand, 30), 8000).
|
||||||
|
|
Loading…
Reference in a new issue