-
Notifications
You must be signed in to change notification settings - Fork 3
/
game_example.py
113 lines (93 loc) · 4.23 KB
/
game_example.py
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Example code demonstrating the Python Hanabi interface."""
from __future__ import print_function
import numpy as np
import pyhanabi
def run_game(game_parameters):
"""Play a game, selecting random actions."""
def print_state(state):
"""Print some basic information about the state."""
print("")
print("Current player: {}".format(state.cur_player()))
print(state)
# Example of more queries to provide more about this state. For
# example, bots could use these methods to to get information
# about the state in order to act accordingly.
print("### Information about the state retrieved separately ###")
print("### Information tokens: {}".format(state.information_tokens()))
print("### Life tokens: {}".format(state.life_tokens()))
print("### Fireworks: {}".format(state.fireworks()))
print("### Deck size: {}".format(state.deck_size()))
print("### Discard pile: {}".format(str(state.discard_pile())))
print("### Player hands: {}".format(str(state.player_hands())))
print("")
def print_observation(observation):
"""Print some basic information about an agent observation."""
print("--- Observation ---")
print(observation)
print("### Information about the observation retrieved separately ###")
print("### Current player, relative to self: {}".format(
observation.cur_player_offset()))
print("### Observed hands: {}".format(observation.observed_hands()))
print("### Card knowledge: {}".format(observation.card_knowledge()))
print("### Discard pile: {}".format(observation.discard_pile()))
print("### Fireworks: {}".format(observation.fireworks()))
print("### Deck size: {}".format(observation.deck_size()))
move_string = "### Last moves:"
for move_tuple in observation.last_moves():
move_string += " {}".format(move_tuple)
print(move_string)
print("### Information tokens: {}".format(observation.information_tokens()))
print("### Life tokens: {}".format(observation.life_tokens()))
print("### Legal moves: {}".format(observation.legal_moves()))
print("--- EndObservation ---")
def print_encoded_observations(encoder, state, num_players):
print("--- EncodedObservations ---")
print("Observation encoding shape: {}".format(encoder.shape()))
print("Current actual player: {}".format(state.cur_player()))
for i in range(num_players):
print("Encoded observation for player {}: {}".format(
i, encoder.encode(state.observation(i))))
print("--- EndEncodedObservations ---")
game = pyhanabi.HanabiGame(game_parameters)
print(game.parameter_string(), end="")
obs_encoder = pyhanabi.ObservationEncoder(
game, enc_type=pyhanabi.ObservationEncoderType.CANONICAL)
state = game.new_initial_state()
while not state.is_terminal():
if state.cur_player() == pyhanabi.CHANCE_PLAYER_ID:
state.deal_random_card()
continue
print_state(state)
observation = state.observation(state.cur_player())
print_observation(observation)
print_encoded_observations(obs_encoder, state, game.num_players())
legal_moves = state.legal_moves()
print("")
print("Number of legal moves: {}".format(len(legal_moves)))
move = np.random.choice(legal_moves)
print("Chose random legal move: {}".format(move))
state.apply_move(move)
print("")
print("Game done. Terminal state:")
print("")
print(state)
print("")
print("score: {}".format(state.score()))
if __name__ == "__main__":
# Check that the cdef and library were loaded from the standard paths.
assert pyhanabi.cdef_loaded(), "cdef failed to load"
assert pyhanabi.lib_loaded(), "lib failed to load"
run_game({"players": 3, "random_start_player": True})