Skip to content

Commit 8048a4a

Browse files
committed
Add Python Hangman
PiperOrigin-RevId: 855999836 Change-Id: I4a02b014d3e10db99fd7c55023cb13a71ce5e8b8
1 parent adf1461 commit 8048a4a

File tree

6 files changed

+630
-0
lines changed

6 files changed

+630
-0
lines changed
Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
game: python_hangman
2+
3+
GameType.chance_mode = ChanceMode.EXPLICIT_STOCHASTIC
4+
GameType.dynamics = Dynamics.SEQUENTIAL
5+
GameType.information = Information.PERFECT_INFORMATION
6+
GameType.long_name = "Python Hangman"
7+
GameType.max_num_players = 1
8+
GameType.min_num_players = 1
9+
GameType.parameter_specification = ["max_num_incorrect_guesses", "word_list_file"]
10+
GameType.provides_information_state_string = True
11+
GameType.provides_information_state_tensor = False
12+
GameType.provides_observation_string = True
13+
GameType.provides_observation_tensor = True
14+
GameType.provides_factored_observation_string = False
15+
GameType.reward_model = RewardModel.TERMINAL
16+
GameType.short_name = "python_hangman"
17+
GameType.utility = Utility.GENERAL_SUM
18+
19+
NumDistinctActions() = 26
20+
PolicyTensorShape() = [26]
21+
MaxChanceOutcomes() = 1
22+
GetParameters() = {max_num_incorrect_guesses=6,word_list_file=}
23+
NumPlayers() = 1
24+
MinUtility() = -106.0
25+
MaxUtility() = 126.0
26+
UtilitySum() = None
27+
ObservationTensorShape() = [9]
28+
ObservationTensorLayout() = TensorLayout.CHW
29+
ObservationTensorSize() = 9
30+
MaxGameLength() = 26
31+
ToString() = "python_hangman(max_num_incorrect_guesses=6,word_list_file=)"
32+
33+
# State 0
34+
# Not started yet
35+
IsTerminal() = False
36+
History() = []
37+
HistoryString() = ""
38+
IsChanceNode() = True
39+
IsSimultaneousNode() = False
40+
CurrentPlayer() = -1
41+
InformationStateString(0) = ""
42+
ObservationString(0) = "Not started yet"
43+
ObservationTensor(0): ◯◯◯◯◯◯◯◯◯
44+
ChanceOutcomes() = [(0,0.04), (1,0.04), (2,0.04), (3,0.04), (4,0.04), (5,0.04), (6,0.04), (7,0.04), (8,0.04), (9,0.04), (10,0.04), (11,0.04), (12,0.04), (13,0.04), (14,0.04), (15,0.04), (16,0.04), (17,0.04), (18,0.04), (19,0.04), (20,0.04), (21,0.04), (22,0.04), (23,0.04), (24,0.04)]
45+
LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
46+
StringLegalActions() = ["Chance outcome 0: apple", "Chance outcome 1: banana", "Chance outcome 2: cat", "Chance outcome 3: dog", "Chance outcome 4: egg", "Chance outcome 5: fish", "Chance outcome 6: frog", "Chance outcome 7: giraffe", "Chance outcome 8: hippo", "Chance outcome 9: jackal", "Chance outcome 10: kangaroo", "Chance outcome 11: lemon", "Chance outcome 12: monkey", "Chance outcome 13: narwhal", "Chance outcome 14: orange", "Chance outcome 15: penguin", "Chance outcome 16: pineapple", "Chance outcome 17: pizza", "Chance outcome 18: quail", "Chance outcome 19: rabbit", "Chance outcome 20: snake", "Chance outcome 21: squirrel", "Chance outcome 22: tiger", "Chance outcome 23: unicorn", "Chance outcome 24: zebra"]
47+
48+
# Apply action "Chance outcome 20: snake"
49+
action: 20
50+
51+
# State 1
52+
# Word: snake
53+
# Letters Revealed: _____
54+
# Letters Guessed:
55+
# Num guesses: 0
56+
IsTerminal() = False
57+
History() = [20]
58+
HistoryString() = "20"
59+
IsChanceNode() = False
60+
IsSimultaneousNode() = False
61+
CurrentPlayer() = 0
62+
InformationStateString(0) = "20"
63+
ObservationString(0) = "Letters Revealed: _____\nLetters Guessed: \nNum guesses: 0\n"
64+
ObservationTensor(0): ◯◯◯◯◯◯◯◯◯
65+
Rewards() = [0]
66+
Returns() = [0]
67+
LegalActions() = [0, 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]
68+
StringLegalActions() = ["Guess letter a", "Guess letter b", "Guess letter c", "Guess letter d", "Guess letter e", "Guess letter f", "Guess letter g", "Guess letter h", "Guess letter i", "Guess letter j", "Guess letter k", "Guess letter l", "Guess letter m", "Guess letter n", "Guess letter o", "Guess letter p", "Guess letter q", "Guess letter r", "Guess letter s", "Guess letter t", "Guess letter u", "Guess letter v", "Guess letter w", "Guess letter x", "Guess letter y", "Guess letter z"]
69+
70+
# Apply action "Guess letter n"
71+
action: 13
72+
73+
# State 2
74+
# Word: snake
75+
# Letters Revealed: _n___
76+
# Letters Guessed: n
77+
# Num guesses: 1
78+
IsTerminal() = False
79+
History() = [20, 13]
80+
HistoryString() = "20, 13"
81+
IsChanceNode() = False
82+
IsSimultaneousNode() = False
83+
CurrentPlayer() = 0
84+
InformationStateString(0) = "20, 13"
85+
ObservationString(0) = "Letters Revealed: _n___\nLetters Guessed: n\nNum guesses: 1\n"
86+
ObservationTensor(0): ◯◯◯◯◯◯◯◯◯
87+
Rewards() = [1]
88+
Returns() = [1]
89+
LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
90+
StringLegalActions() = ["Guess letter a", "Guess letter b", "Guess letter c", "Guess letter d", "Guess letter e", "Guess letter f", "Guess letter g", "Guess letter h", "Guess letter i", "Guess letter j", "Guess letter k", "Guess letter l", "Guess letter m", "Guess letter o", "Guess letter p", "Guess letter q", "Guess letter r", "Guess letter s", "Guess letter t", "Guess letter u", "Guess letter v", "Guess letter w", "Guess letter x", "Guess letter y", "Guess letter z"]
91+
92+
# Apply action "Guess letter k"
93+
action: 10
94+
95+
# State 3
96+
# Word: snake
97+
# Letters Revealed: _n_k_
98+
# Letters Guessed: nk
99+
# Num guesses: 2
100+
IsTerminal() = False
101+
History() = [20, 13, 10]
102+
HistoryString() = "20, 13, 10"
103+
IsChanceNode() = False
104+
IsSimultaneousNode() = False
105+
CurrentPlayer() = 0
106+
InformationStateString(0) = "20, 13, 10"
107+
ObservationString(0) = "Letters Revealed: _n_k_\nLetters Guessed: nk\nNum guesses: 2\n"
108+
ObservationTensor(0): ◯◯◯◯◯◯◯◯◯
109+
Rewards() = [1]
110+
Returns() = [2]
111+
LegalActions() = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
112+
StringLegalActions() = ["Guess letter a", "Guess letter b", "Guess letter c", "Guess letter d", "Guess letter e", "Guess letter f", "Guess letter g", "Guess letter h", "Guess letter i", "Guess letter j", "Guess letter l", "Guess letter m", "Guess letter o", "Guess letter p", "Guess letter q", "Guess letter r", "Guess letter s", "Guess letter t", "Guess letter u", "Guess letter v", "Guess letter w", "Guess letter x", "Guess letter y", "Guess letter z"]
113+
114+
# Apply action "Guess letter j"
115+
action: 9
116+
117+
# State 4
118+
# Apply action "Guess letter e"
119+
action: 4
120+
121+
# State 5
122+
# Apply action "Guess letter w"
123+
action: 22
124+
125+
# State 6
126+
# Apply action "Guess letter l"
127+
action: 11
128+
129+
# State 7
130+
# Apply action "Guess letter r"
131+
action: 17
132+
133+
# State 8
134+
# Apply action "Guess letter a"
135+
action: 0
136+
137+
# State 9
138+
# Apply action "Guess letter d"
139+
action: 3
140+
141+
# State 10
142+
# Apply action "Guess letter i"
143+
action: 8
144+
145+
# State 11
146+
# Word: snake
147+
# Letters Revealed: _nake
148+
# Letters Guessed: nkjewlradi
149+
# Num guesses: 10
150+
IsTerminal() = True
151+
History() = [20, 13, 10, 9, 4, 22, 11, 17, 0, 3, 8]
152+
HistoryString() = "20, 13, 10, 9, 4, 22, 11, 17, 0, 3, 8"
153+
IsChanceNode() = False
154+
IsSimultaneousNode() = False
155+
CurrentPlayer() = -4
156+
InformationStateString(0) = "20, 13, 10, 9, 4, 22, 11, 17, 0, 3, 8"
157+
ObservationString(0) = "Letters Revealed: _nake\nLetters Guessed: nkjewlradi\nNum guesses: 10\n"
158+
ObservationTensor(0): ◯◯◯◯◯◯◯◯◯
159+
Rewards() = [-101]
160+
Returns() = [-102]

open_spiel/python/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ set(PYTHON_TESTS ${PYTHON_TESTS}
229229
games/data_test.py
230230
games/dynamic_routing_test.py
231231
games/dynamic_routing_utils_test.py
232+
games/hangman_test.py
232233
games/liars_poker_test.py
233234
games/pokerkit_wrapper_test.py
234235
games/team_dominoes_test.py

open_spiel/python/games/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from open_spiel.python.games import block_dominoes
3030
from open_spiel.python.games import chat_game
3131
from open_spiel.python.games import dynamic_routing
32+
from open_spiel.python.games import hangman
3233
from open_spiel.python.games import iterated_prisoners_dilemma
3334
from open_spiel.python.games import kuhn_poker
3435
from open_spiel.python.games import liars_poker

0 commit comments

Comments
 (0)