wsy182 2024-12-01 17:00:07 +08:00
parent df0aa388e2
commit 2bc34bc860
2 changed files with 29 additions and 23 deletions

View File

@ -225,6 +225,7 @@ def check_other_players(self, tile):
if not actions_taken: if not actions_taken:
logger.info(f"玩家 {current_player} 打出的牌 {tile} 没有触发其他玩家的操作") logger.info(f"玩家 {current_player} 打出的牌 {tile} 没有触发其他玩家的操作")
return actions_taken

View File

@ -42,55 +42,60 @@ class ChengduMahjongEngine:
logger.info("发牌结束并完成缺门设置!") logger.info("发牌结束并完成缺门设置!")
def play_turn(self): def play_turn(self):
if self.state.draw_counts[self.current_player] == 0: current_player = self.state.current_player
if self.state.draw_counts[current_player] == 0:
# 判断庄家是否天胡 # 判断庄家是否天胡
tianhu = self.state.can_win( tianhu = self.state.can_win(
self.state.hands[self.current_player], self.state.hands[current_player],
self.state.melds[self.current_player], self.state.melds[current_player],
self.state.missing_suits[self.current_player], self.state.missing_suits[current_player],
) )
if tianhu: if tianhu:
# 天胡结算 # 天胡结算
self.state.winners.append(self.current_player) self.state.winners.append(current_player)
self.state.print_game_state(self.current_player) self.state.print_game_state(current_player)
for i in range(4): for i in range(4):
if i != self.current_player: if i != current_player:
self.state.scores[i] -= self.state.bottom_score * 2 ** 5 self.state.scores[i] -= self.state.bottom_score * 2 ** 5
self.state.scores[self.current_player] += self.state.bottom_score * 2 ** 5 self.state.scores[current_player] += self.state.bottom_score * 2 ** 5
else: else:
# 判断是否可以杠 # 判断是否可以杠
if self.state.hands[self.current_player].can_gang(): if self.state.hands[current_player].can_gang():
# 获取杠牌类型 # 获取杠牌类型
gang_type = self.state.hands[self.current_player].get_gang_type() gang_type = self.state.hands[current_player].get_gang_type()
# AI 决策是否杠牌 # AI 决策是否杠牌
if should_gang(self.current_player, self.state, gang_type): if should_gang(current_player, self.state, gang_type):
self.state.hands[self.current_player].perform_gang() # 执行杠操作 self.state.hands[current_player].perform_gang() # 执行杠操作
self.state.print_game_state(self.current_player) self.state.print_game_state(current_player)
# 计算杠牌得分 # 计算杠牌得分
if gang_type == "暗杠": if gang_type == "暗杠":
# 暗杠分数结算 # 暗杠分数结算
for i in range(4): for i in range(4):
if i != self.current_player: if i != current_player:
self.state.scores[i] -= self.state.bottom_score * 2 ** 2 # 扣分 self.state.scores[i] -= self.state.bottom_score * 2 ** 2 # 扣分
self.state.scores[self.current_player] += self.state.bottom_score * 2 ** 2 * 3 # 加分 self.state.scores[current_player] += self.state.bottom_score * 2 ** 2 * 3 # 加分
elif gang_type == "明杠": elif gang_type == "明杠":
# 明杠分数结算 # 明杠分数结算
for i in range(4): for i in range(4):
if i != self.current_player: if i != current_player:
self.state.scores[i] -= self.state.bottom_score * 2 ** 1 # 扣分 self.state.scores[i] -= self.state.bottom_score * 2 ** 1 # 扣分
self.state.scores[self.current_player] += self.state.bottom_score * 2 ** 1 * 3 # 加分 self.state.scores[current_player] += self.state.bottom_score * 2 ** 1 * 3 # 加分
logger.info(f"玩家 {self.current_player} 杠牌,类型: {gang_type}") logger.info(f"玩家 {current_player} 杠牌,类型: {gang_type}")
else: else:
title = random_choice(self.state.hands[self.current_player], self.state.missing_suits[self.current_player]) # 当前玩家出牌
check_other_players(self, title) tile = random_choice(self.state.hands[current_player], self.state.missing_suits[current_player])
logger.info(f"玩家 {current_player} 打出牌: {tile}")
# 检查其他玩家的反应
if not check_other_players(self,tile):
# 没有触发其他玩家操作,移动到下一个玩家
self.state.current_player = (current_player + 1) % 4
draw_tile(self)
def check_game_over(self): def check_game_over(self):
""" """