File size: 3,052 Bytes
2a33798
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class BasicLevelTranslator:
    def __init__(self):
        pass

    def translate(self, state):
        player_sum, dealer_showing, usable_ace = state
        usable_ace_text = "yes" if usable_ace else "no"
        res = (f"The player's current sum is {player_sum}, the dealer is showing {dealer_showing}, "
               f"and the player has a usable ace: {usable_ace_text}.")
        return res

class GameDescriber:
    def __init__(self, args):
        self.is_only_local_obs = args.is_only_local_obs == 1
        self.max_episode_len = args.max_episode_len
        self.action_desc_dict = {
            1: "Stick",
            2: "Hit"
        }
        self.reward_desc_dict = {
            1: "which lets him win the game and receive 1 reward",
            -1: "which lets him lose the game and receive -1 reward",
            0: "which lets him draw the game and receive 0 reward"
        }

    def describe_goal(self):
        return "The goal is to beat the dealer by obtaining cards that sum to closer to 21, without going over 21."
        
    def translate_terminate_state(self, state, episode_len, max_episode_len): 
        return '' 
    
    def translate_potential_next_state(self, state, action): 
        return '' 
        
    def describe_game(self):
        return ("In the game of Blackjack, the main aim is to obtain a higher card sum than the dealer, but not higher "
                "than 21. Face cards count as 10, numerical cards hold their value, and aces can count either as "
                "1 or 11. The game starts with the dealer having one face-up and one face-down card, while the player has "
                "two face-up cards. The player can either choose to 'hit' (add a card) or 'stick' (stop receiving cards). "
                "The game ends when the player or the dealer busts or when both the player and dealer are finished "
                "drawing cards.")

    def describe_action(self):
        return ("Your Next Move: \\n Please choose an action. Type '1' to stick (stop receiving cards) or '2' to hit (add a card). "
                "Ensure you only provide the action number from the valid action list, i.e., [1, 2] in json format.")

class BasicStateSequenceTranslator(BasicLevelTranslator):
    def translate(self, infos, is_current=False):
        descriptions = []
        if is_current:
            state_desc = BasicLevelTranslator().translate(infos[-1]['state'])
            return state_desc
        for i, info in enumerate(infos):
            assert 'state' in info, "info should contain state information"

            state_desc = BasicLevelTranslator().translate(info['state'])
            action_desc = f"Take Action: {'Hit' if info['action'] == 2 else 'Stick'} ({info['action']})."
            reward_desc = f"Result: Reward of {info['reward']}, "
            next_state_desc = BasicLevelTranslator().translate(info['next_state'])
            descriptions.append(f"{state_desc}.\n {action_desc} \n {reward_desc} \n Transit to {next_state_desc}")
        return descriptions