|
|
@ -1,5 +1,5 @@ |
|
|
|
-module(game_core). |
|
|
|
-export([start_game/3, play_cards/3, get_game_state/1, is_valid_play/2]). |
|
|
|
-export([start_game/3, init_game_state/0, play_cards/3, get_game_state/1, is_valid_play/2]). |
|
|
|
-export([init_deck/0, deal_cards/1, get_card_type/1, compare_cards/2]). |
|
|
|
|
|
|
|
-record(game_state, { |
|
|
@ -23,9 +23,9 @@ init_deck() -> |
|
|
|
deal_cards(Deck) -> |
|
|
|
{Players, Landlord} = lists:split(51, Deck), |
|
|
|
{lists:sublist(Players, 1, 17), |
|
|
|
lists:sublist(Players, 18, 17), |
|
|
|
lists:sublist(Players, 35, 17), |
|
|
|
Landlord}. |
|
|
|
lists:sublist(Players, 18, 17), |
|
|
|
lists:sublist(Players, 35, 17), |
|
|
|
Landlord}. |
|
|
|
|
|
|
|
%% 开始游戏 |
|
|
|
start_game(Player1, Player2, Player3) -> |
|
|
@ -55,7 +55,7 @@ validate_play(GameState, PlayerPid, Cards) -> |
|
|
|
case get_player_cards(GameState, PlayerPid) of |
|
|
|
{ok, PlayerCards} -> |
|
|
|
has_cards(PlayerCards, Cards) andalso |
|
|
|
is_valid_play(Cards, GameState#game_state.last_play); |
|
|
|
is_valid_play(Cards, GameState#game_state.last_play); |
|
|
|
_ -> |
|
|
|
false |
|
|
|
end. |
|
|
@ -104,8 +104,9 @@ analyze_complex_pattern(Cards) -> |
|
|
|
get_game_state(GameId) -> |
|
|
|
% 简单实现,实际应该从某种存储中获取 |
|
|
|
{ok, #game_state{}}. |
|
|
|
%% 初始化游戏状态 |
|
|
|
init_game_state() -> |
|
|
|
|
|
|
|
%% 初始化游戏状态 |
|
|
|
init_game_state() -> |
|
|
|
% 创建一个空的游戏状态 |
|
|
|
#game_state{ |
|
|
|
players = [], |
|
|
@ -126,7 +127,7 @@ is_valid_play(Cards, LastPlay) -> |
|
|
|
{ok, Type1, Value1} = get_card_type(Cards), |
|
|
|
{ok, Type2, Value2} = get_card_type(LastCards), |
|
|
|
(Type1 =:= Type2 andalso Value1 > Value2) orelse |
|
|
|
(Type1 =:= bomb andalso Type2 =/= bomb) |
|
|
|
(Type1 =:= bomb andalso Type2 =/= bomb) |
|
|
|
end. |
|
|
|
|
|
|
|
%% 判断牌型是否合法 |
|
|
@ -153,9 +154,9 @@ assign_roles(PlayerCards, LandlordIdx) -> |
|
|
|
lists:map( |
|
|
|
fun({Idx, {Pid, Cards}}) -> |
|
|
|
Role = case Idx of |
|
|
|
LandlordIdx -> landlord; |
|
|
|
_ -> farmer |
|
|
|
end, |
|
|
|
LandlordIdx -> landlord; |
|
|
|
_ -> farmer |
|
|
|
end, |
|
|
|
{Pid, Cards, Role} |
|
|
|
end, |
|
|
|
lists:zip(lists:seq(1, length(PlayerCards)), PlayerCards) |
|
|
@ -167,7 +168,7 @@ update_game_state(GameState, PlayerPid, Cards) -> |
|
|
|
UpdatedPlayers = lists:map( |
|
|
|
fun({Pid, PlayerCards, Role}) when Pid =:= PlayerPid -> |
|
|
|
{Pid, PlayerCards -- Cards, Role}; |
|
|
|
(Player) -> Player |
|
|
|
(Player) -> Player |
|
|
|
end, |
|
|
|
GameState#game_state.players |
|
|
|
), |
|
|
@ -287,7 +288,7 @@ is_straight(Cards) -> |
|
|
|
Values = [card_value(Card) || Card <- Cards], |
|
|
|
SortedValues = lists:sort(Values), |
|
|
|
length(SortedValues) >= 5 andalso |
|
|
|
lists:max(SortedValues) =< 14 andalso % A以下的牌才能组成顺子 |
|
|
|
lists:max(SortedValues) =< 14 andalso % A以下的牌才能组成顺子 |
|
|
|
SortedValues =:= lists:seq(hd(SortedValues), lists:last(SortedValues)). |
|
|
|
|
|
|
|
%% 分析其他牌型 |
|
|
|