1
1
This commit is contained in:
10
src/engine/dizhu/deck.py
Normal file
10
src/engine/dizhu/deck.py
Normal file
@@ -0,0 +1,10 @@
|
||||
import numpy as np
|
||||
|
||||
class Deck:
|
||||
def __init__(self):
|
||||
self.cards = [i for i in range(54)] # 0-53 表示54张牌
|
||||
np.random.shuffle(self.cards)
|
||||
|
||||
def deal(self):
|
||||
# 返回三位玩家的手牌和地主牌
|
||||
return self.cards[:17], self.cards[17:34], self.cards[34:51], self.cards[51:]
|
||||
0
src/engine/dizhu/dizhu_engine.py
Normal file
0
src/engine/dizhu/dizhu_engine.py
Normal file
5
src/engine/dizhu/player_state.py
Normal file
5
src/engine/dizhu/player_state.py
Normal file
@@ -0,0 +1,5 @@
|
||||
class PlayerState:
|
||||
def __init__(self, hand_cards, role):
|
||||
self.hand_cards = hand_cards # 玩家手牌
|
||||
self.role = role # "地主" 或 "农民"
|
||||
self.history = [] # 出牌历史
|
||||
0
src/engine/mahjong/__init__.py
Normal file
0
src/engine/mahjong/__init__.py
Normal file
@@ -2,9 +2,9 @@ import random as random_module
|
||||
|
||||
from loguru import logger
|
||||
|
||||
from src.engine.calculate_fan import calculate_fan
|
||||
from src.engine.mahjong_tile import MahjongTile
|
||||
from src.engine.meld import Meld
|
||||
from src.engine.mahjong.calculate_fan import calculate_fan
|
||||
from src.engine.mahjong.mahjong_tile import MahjongTile
|
||||
from src.engine.mahjong.meld import Meld
|
||||
|
||||
|
||||
def draw_tile(engine):
|
||||
@@ -1,4 +1,4 @@
|
||||
from src.engine.fan_type import is_terminal_fan,is_cleared,is_full_request,is_seven_pairs,is_basic_win,is_dragon_seven_pairs
|
||||
from src.engine.mahjong.fan_type import is_terminal_fan,is_cleared,is_full_request,is_seven_pairs,is_basic_win,is_dragon_seven_pairs
|
||||
from loguru import logger
|
||||
|
||||
def calculate_fan(hand, melds, is_self_draw, winning_tile, conditions):
|
||||
@@ -3,9 +3,9 @@ import random
|
||||
from loguru import logger
|
||||
|
||||
from configs.log_config import setup_logging
|
||||
from src.engine.actions import draw_tile, should_gang, random_choice, handle_win, handle_gang, handle_peng
|
||||
from src.engine.actions import set_missing_suit, check_other_players
|
||||
from src.engine.chengdu_mahjong_state import ChengduMahjongState
|
||||
from src.engine.mahjong.actions import draw_tile, random_choice, handle_win, handle_gang, handle_peng
|
||||
from src.engine.mahjong.actions import set_missing_suit
|
||||
from src.engine.mahjong.chengdu_mahjong_state import ChengduMahjongState
|
||||
|
||||
|
||||
class ChengduMahjongEngine:
|
||||
@@ -1,7 +1,7 @@
|
||||
from collections import Counter
|
||||
from src.engine.hand import Hand
|
||||
from src.engine.mahjong_tile import MahjongTile
|
||||
from src.engine.meld import Meld
|
||||
from src.engine.mahjong.hand import Hand
|
||||
from src.engine.mahjong.mahjong_tile import MahjongTile
|
||||
from src.engine.mahjong.meld import Meld
|
||||
from loguru import logger
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
from src.engine.utils import try_win,is_terminal_tile
|
||||
from src.engine.mahjong.utils import try_win
|
||||
from collections import Counter
|
||||
|
||||
def is_basic_win(hand):
|
||||
@@ -1,4 +1,4 @@
|
||||
from src.engine.mahjong_tile import MahjongTile
|
||||
from src.engine.mahjong.mahjong_tile import MahjongTile
|
||||
from collections import defaultdict
|
||||
|
||||
class Hand:
|
||||
@@ -1,4 +1,4 @@
|
||||
from src.engine.mahjong_tile import MahjongTile
|
||||
from src.engine.mahjong.mahjong_tile import MahjongTile
|
||||
|
||||
class Meld:
|
||||
def __init__(self, tile, type: str):
|
||||
0
src/environment/__init__.py
Normal file
0
src/environment/__init__.py
Normal file
@@ -2,8 +2,8 @@ import gym
|
||||
from gym import spaces
|
||||
import numpy as np
|
||||
|
||||
from src.engine.actions import handle_peng, handle_gang, handle_win
|
||||
from src.engine.chengdu_mahjong_engine import ChengduMahjongEngine
|
||||
from src import handle_peng, handle_gang, handle_win
|
||||
from src import ChengduMahjongEngine
|
||||
from loguru import logger
|
||||
|
||||
|
||||
|
||||
35
src/environment/dizhu_env.py
Normal file
35
src/environment/dizhu_env.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from gym import spaces
|
||||
|
||||
from src.engine.dizhu.player_state import PlayerState
|
||||
from src.engine.dizhu.deck import Deck
|
||||
|
||||
class DouDiZhuEnv:
|
||||
def __init__(self):
|
||||
self.deck = Deck()
|
||||
self.players = [] # 初始化玩家
|
||||
self.landlord = None
|
||||
self.current_player_index = 0
|
||||
self.action_space = spaces.Discrete(54) # 动作空间,出一张牌或“过牌”
|
||||
self.observation_space = spaces.Box(low=0, high=1, shape=(54,)) # 牌局状态表示
|
||||
|
||||
def reset(self):
|
||||
p1_hand, p2_hand, p3_hand, landlord_cards = self.deck.deal()
|
||||
self.players = [
|
||||
PlayerState(p1_hand, "农民"),
|
||||
PlayerState(p2_hand, "农民"),
|
||||
PlayerState(p3_hand, "地主"),
|
||||
]
|
||||
self.landlord = self.players[2]
|
||||
self.current_player_index = 0
|
||||
return self._get_observation()
|
||||
|
||||
def _get_observation(self):
|
||||
# 返回当前玩家的状态,具体实现根据模型需求定制
|
||||
return {
|
||||
"hand": self.players[self.current_player_index].hand_cards,
|
||||
"history": self.players[self.current_player_index].history,
|
||||
}
|
||||
|
||||
def step(self, action):
|
||||
# 执行动作,更新状态
|
||||
pass
|
||||
Reference in New Issue
Block a user