Update chengdu_majiang_env.py
parent
9f7a22be7f
commit
3487c805d4
|
|
@ -26,23 +26,30 @@ class MahjongEnv(gym.Env):
|
||||||
|
|
||||||
def step(self, action):
|
def step(self, action):
|
||||||
"""
|
"""
|
||||||
每一步游戏,基于玩家的动作更新游戏状态。
|
执行玩家动作并更新游戏状态。
|
||||||
action:表示玩家的动作,可以是摸牌、打牌、碰牌等。
|
|
||||||
|
参数:
|
||||||
|
- action: 玩家动作,0 代表摸牌,1 代表打牌,2 代表碰牌,3 代表杠牌
|
||||||
|
|
||||||
|
返回:
|
||||||
|
- next_state: 当前玩家的手牌
|
||||||
|
- reward: 奖励
|
||||||
|
- done: 是否结束
|
||||||
|
- info: 其他信息(如奖励历史等)
|
||||||
"""
|
"""
|
||||||
done = False
|
done = False
|
||||||
reward = 0
|
reward = 0
|
||||||
|
|
||||||
# 根据action类型选择执行的动作
|
|
||||||
try:
|
try:
|
||||||
if action == 0: # 0代表摸牌
|
if action == 0: # 0代表摸牌
|
||||||
reward, done = draw_tile(self.engine)
|
reward, done = draw_tile(self.engine) # 调用摸牌函数
|
||||||
elif action == 1: # 1代表打牌
|
elif action == 1: # 1代表打牌
|
||||||
tile = self.engine.state.hands[self.engine.state.current_player][0] # 假设选择第一张牌
|
tile = self.engine.state.hands[self.engine.state.current_player][0] # 假设选择第一张牌
|
||||||
discard_tile(self.engine, tile)
|
discard_tile(self.engine, tile) # 调用打牌函数
|
||||||
reward, done = -1, False
|
reward, done = -1, False
|
||||||
elif action == 2: # 2代表碰牌
|
elif action == 2: # 2代表碰牌
|
||||||
tile = self.engine.state.hands[self.engine.state.current_player][0] # 假设选择第一张牌
|
tile = self.engine.state.hands[self.engine.state.current_player][0] # 假设选择第一张牌
|
||||||
peng(self.engine, tile)
|
peng(self.engine, tile) # 调用碰牌函数
|
||||||
reward, done = 0, False
|
reward, done = 0, False
|
||||||
elif action == 3: # 3代表杠牌
|
elif action == 3: # 3代表杠牌
|
||||||
tile = self.engine.state.hands[self.engine.state.current_player][0] # 假设选择第一张牌
|
tile = self.engine.state.hands[self.engine.state.current_player][0] # 假设选择第一张牌
|
||||||
|
|
@ -51,12 +58,12 @@ class MahjongEnv(gym.Env):
|
||||||
|
|
||||||
# 检查是否胡牌
|
# 检查是否胡牌
|
||||||
if self.engine.state.can_win(self.engine.state.hands[self.engine.state.current_player]):
|
if self.engine.state.can_win(self.engine.state.hands[self.engine.state.current_player]):
|
||||||
reward, done = self.handle_win()
|
reward, done = self.handle_win() # 胡牌时处理胜利逻辑
|
||||||
|
|
||||||
# 检查游戏结束条件
|
# 检查游戏结束条件
|
||||||
check_blood_battle(self.engine)
|
check_blood_battle(self.engine)
|
||||||
|
|
||||||
if self.engine.game_over:
|
if self.engine.game_over: # 检查是否游戏结束
|
||||||
done = True
|
done = True
|
||||||
|
|
||||||
except ValueError:
|
except ValueError:
|
||||||
|
|
@ -101,10 +108,13 @@ class MahjongEnv(gym.Env):
|
||||||
# 奖励设置为赢家得分
|
# 奖励设置为赢家得分
|
||||||
reward = scores["winner"]
|
reward = scores["winner"]
|
||||||
self.engine.state.winners.append(winner) # 添加赢家到列表
|
self.engine.state.winners.append(winner) # 添加赢家到列表
|
||||||
|
|
||||||
# 如果有玩家分数 <= 0,可进行其他处理,如记录惩罚或结束游戏
|
|
||||||
if any(score <= 0 for score in self.scores):
|
|
||||||
self.engine.game_over = True # 设置游戏结束标志
|
|
||||||
|
|
||||||
return reward, True # 胡牌结束当前局
|
return reward, True # 胡牌结束当前局
|
||||||
|
|
||||||
|
def render(self, mode="human"):
|
||||||
|
"""
|
||||||
|
打印游戏状态信息,便于调试。
|
||||||
|
"""
|
||||||
|
print(f"当前轮数: {self.current_round}")
|
||||||
|
print("玩家分数:", self.scores)
|
||||||
|
print("当前玩家状态:", self.engine.state.hands[self.engine.state.current_player])
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue