Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

260 řádky
7.8 KiB

před 2 měsíci
před 1 měsícem
před 2 měsíci
před 1 měsícem
před 1 měsícem
před 1 měsícem
před 2 měsíci
před 1 měsícem
před 1 měsícem
před 1 měsícem
před 1 měsícem
před 1 měsícem
před 1 měsícem
před 1 měsícem
před 1 měsícem
  1. -module(game_manager).
  2. -behaviour(gen_server).
  3. -export([start_link/0, init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
  4. -export([start_game/3, handle_play/2, end_game/1, create_ai_game/0]).
  5. -include("../include/game_records.hrl").
  6. %% API
  7. start_link() ->
  8. gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).
  9. %% 创建一个全AI玩家的游戏
  10. create_ai_game() ->
  11. gen_server:call(?MODULE, create_ai_game).
  12. % 使用include文件中定义的game_manager_state记录
  13. start_game(Player1, Player2, Player3) ->
  14. % 初始化游戏状态
  15. GameState = game_core:init_game_state(),
  16. % 初始化AI玩家
  17. AIPlayers = initialize_ai_players(),
  18. % 创建游戏管理器状态
  19. GameManagerState = #game_manager_state{
  20. game_id = generate_game_id(),
  21. players = [Player1, Player2, Player3],
  22. ai_players = AIPlayers,
  23. current_state = GameState,
  24. history = []
  25. },
  26. % 开始游戏循环
  27. game_loop(GameManagerState).
  28. handle_play(GameManagerState, Play) ->
  29. % 验证玩家行动
  30. case game_core:validate_play(GameManagerState#game_manager_state.current_state, Play) of
  31. true ->
  32. % 更新游戏状态
  33. NewState = game_core:update_state(GameManagerState#game_manager_state.current_state, Play),
  34. % 更新AI玩家
  35. UpdatedAIPlayers = update_ai_players(GameManagerState#game_manager_state.ai_players, Play),
  36. % 记录历史
  37. NewHistory = [Play | GameManagerState#game_manager_state.history],
  38. GameManagerState#game_manager_state{
  39. current_state = NewState,
  40. ai_players = UpdatedAIPlayers,
  41. history = NewHistory
  42. };
  43. false ->
  44. {error, invalid_play}
  45. end.
  46. %% 结束游戏
  47. end_game(GameManagerState) ->
  48. % 计算最终得分
  49. FinalScores = calculate_final_scores(GameManagerState),
  50. % 更新玩家统计数据
  51. update_player_stats(GameManagerState, FinalScores),
  52. % 保存游戏记录
  53. save_game_record(GameManagerState),
  54. % 返回游戏结果
  55. {game_ended, FinalScores}.
  56. %% 初始化AI玩家
  57. initialize_ai_players() ->
  58. % 创建不同类型的AI玩家
  59. BasicAI = ai_player:init(basic),
  60. AdvancedAI = advanced_ai_player:init(advanced),
  61. % 返回AI玩家列表
  62. [BasicAI, AdvancedAI].
  63. %% 生成游戏ID
  64. generate_game_id() ->
  65. % 使用时间戳和随机数生成唯一ID
  66. {{Year, Month, Day}, {Hour, Minute, Second}} = calendar:local_time(),
  67. Random = rand:uniform(1000),
  68. list_to_binary(io_lib:format("~4..0B~2..0B~2..0B~2..0B~2..0B~2..0B~4..0B",
  69. [Year, Month, Day, Hour, Minute, Second, Random])).
  70. %% 游戏循环
  71. game_loop(GameManagerState) ->
  72. % 检查游戏是否结束
  73. case is_game_over(GameManagerState#game_manager_state.current_state) of
  74. true ->
  75. % 游戏结束,返回结果
  76. end_game(GameManagerState);
  77. false ->
  78. % 获取当前玩家
  79. CurrentPlayer = get_current_player(GameManagerState),
  80. % 如果是AI玩家,自动出牌
  81. case is_ai_player(CurrentPlayer, GameManagerState) of
  82. true ->
  83. AIPlay = get_ai_play(CurrentPlayer, GameManagerState),
  84. NewState = handle_play(GameManagerState, AIPlay),
  85. game_loop(NewState);
  86. false ->
  87. % 如果是人类玩家,返回当前状态等待输入
  88. {waiting_for_player, GameManagerState}
  89. end
  90. end.
  91. %% 更新AI玩家
  92. update_ai_players(AIPlayers, Play) ->
  93. % 为每个AI玩家更新游戏信息
  94. lists:map(
  95. fun(AIPlayer) ->
  96. update_ai_knowledge(AIPlayer, Play)
  97. end,
  98. AIPlayers
  99. ).
  100. %% 辅助函数
  101. %% 计算最终得分
  102. calculate_final_scores(GameManagerState) ->
  103. % 根据游戏规则计算得分
  104. % 简单实现,实际应该有更复杂的计分逻辑
  105. Winner = get_winner(GameManagerState),
  106. Scores = get_player_scores(GameManagerState),
  107. #{
  108. winner => Winner,
  109. scores => Scores
  110. }.
  111. %% 获取获胜者
  112. get_winner(GameManagerState) ->
  113. % 简单实现:找出牌已出完的玩家
  114. GameState = GameManagerState#game_manager_state.current_state,
  115. Players = GameState#game_state.players,
  116. case lists:keyfind(0, 2, Players) of
  117. {Pid, _, _} -> Pid;
  118. false -> none
  119. end.
  120. %% 获取玩家得分
  121. get_player_scores(GameManagerState) ->
  122. % 简单实现:为每个玩家分配基础分数
  123. GameState = GameManagerState#game_manager_state.current_state,
  124. Players = GameState#game_state.players,
  125. lists:foldl(
  126. fun({Pid, Cards, Role}, Acc) ->
  127. Score = case Role of
  128. landlord -> 100 - length(Cards) * 10;
  129. farmer -> 50 - length(Cards) * 5
  130. end,
  131. Acc#{Pid => Score}
  132. end,
  133. #{},
  134. Players
  135. ).
  136. %% 更新玩家统计数据
  137. update_player_stats(GameManagerState, FinalScores) ->
  138. % 更新玩家的胜率、得分等统计信息
  139. % 简单实现
  140. ok.
  141. %% 保存游戏记录
  142. save_game_record(GameManagerState) ->
  143. % 将游戏记录保存到数据库或文件
  144. % 简单实现
  145. ok.
  146. %% 检查游戏是否结束
  147. is_game_over(GameState) ->
  148. % 检查是否有玩家的牌已经出完
  149. % 简单实现
  150. false.
  151. %% 获取当前玩家
  152. get_current_player(GameManagerState) ->
  153. % 从游戏状态中获取当前玩家
  154. GameState = GameManagerState#game_manager_state.current_state,
  155. GameState#game_state.current_player.
  156. %% 判断是否为AI玩家
  157. is_ai_player(Player, GameManagerState) ->
  158. % 检查玩家是否在AI玩家列表中
  159. lists:member(Player, GameManagerState#game_manager_state.ai_players).
  160. %% 获取AI出牌
  161. get_ai_play(AIPlayer, GameManagerState) ->
  162. % 调用AI模块获取出牌决策
  163. GameState = GameManagerState#game_manager_state.current_state,
  164. ai_core:make_decision(AIPlayer, GameState).
  165. %% 更新AI知识
  166. update_ai_knowledge(AIPlayer, Play) ->
  167. % 更新AI对游戏的认知
  168. ai_core:update_knowledge(AIPlayer, Play).
  169. %% Callbacks
  170. init([]) ->
  171. % 初始化状态
  172. {ok, #{active_games => #{}, game_count => 0}}.
  173. handle_call(create_ai_game, _From, State = #{active_games := Games, game_count := Count}) ->
  174. % 创建三个AI玩家
  175. {ok, AI1} = ai_player:create_ai_player(normal),
  176. {ok, AI2} = ai_player:create_ai_player(normal),
  177. {ok, AI3} = ai_player:create_ai_player(hard),
  178. % 启动游戏
  179. GameState = start_game(AI1, AI2, AI3),
  180. GameId = Count + 1,
  181. % 更新状态
  182. NewGames = maps:put(GameId, GameState, Games),
  183. % 启动自动游戏进程
  184. spawn(fun() -> auto_game_loop(GameId, GameState) end),
  185. {reply, {ok, GameId}, State#{active_games => NewGames, game_count => GameId}};
  186. handle_call(_Request, _From, State) ->
  187. {reply, {error, unknown_call}, State}.
  188. handle_cast(_Msg, State) ->
  189. {noreply, State}.
  190. handle_info(_Info, State) ->
  191. {noreply, State}.
  192. terminate(_Reason, _State) ->
  193. ok.
  194. code_change(_OldVsn, State, _Extra) ->
  195. {ok, State}.
  196. %% 自动游戏循环
  197. auto_game_loop(GameId, GameState) ->
  198. % 检查游戏是否结束
  199. case is_game_over(GameState#game_manager_state.current_state) of
  200. true ->
  201. % 游戏结束,记录结果
  202. end_game(GameState);
  203. false ->
  204. % 获取当前玩家
  205. CurrentPlayer = get_current_player(GameState),
  206. % AI自动出牌
  207. AIPlay = get_ai_play(CurrentPlayer, GameState),
  208. NewState = handle_play(GameState, AIPlay),
  209. % 添加延迟使游戏更自然
  210. timer:sleep(500),
  211. % 继续游戏循环
  212. auto_game_loop(GameId, NewState)
  213. end.