kaggle-environments 1.17.2__tar.gz → 1.17.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kaggle-environments might be problematic. Click here for more details.
- {kaggle_environments-1.17.2/kaggle_environments.egg-info → kaggle_environments-1.17.3}/PKG-INFO +1 -1
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/__init__.py +1 -1
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/__init__.py +0 -0
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/__init__.py +0 -0
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js +296 -0
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy.py +86 -0
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four_proxy_test.py +57 -0
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/observation.py +133 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/open_spiel/open_spiel.py +83 -21
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/proxy.py +139 -0
- kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/proxy_test.py +64 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/open_spiel/test_open_spiel.py +1 -1
- kaggle_environments-1.17.3/kaggle_environments/envs/rps/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3/kaggle_environments.egg-info}/PKG-INFO +1 -1
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/SOURCES.txt +9 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/LICENSE +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/MANIFEST.in +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/README.md +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/agent.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/api.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/core.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/chess.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/chess.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/chess.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/chess/test_chess.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/connectx.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/connectx.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/connectx.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/connectx/test_connectx.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/football.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/football.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/helpers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/football/test_football.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/halite.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/halite.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/halite.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/helpers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/halite/test_halite.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/hungry_geese.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/hungry_geese.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/hungry_geese.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/hungry_geese/test_hungry_geese.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/identity/identity.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/identity/identity.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/helpers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/kore_fleets.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/kore_fleets.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/kore_fleets.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/test/configuration.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/test/fullob.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/java/test/observation.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/python/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/python/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/Bot.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/DoNothingBot.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/MinerBot.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/interpreter.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Board.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Cell.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Configuration.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Direction.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Fleet.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/KoreIO.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Observation.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Pair.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Player.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Point.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/Shipyard.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/kore/ShipyardAction.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/miner.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/package.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/BoardTest.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ConfigurationTest.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ObservationTest.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/PointTest.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/ShipyardTest.ts +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/configuration.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/fullob.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/test/observation.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/starter_bots/ts/tsconfig.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/kore_fleets/test_kore_fleets.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/keywords.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/llm_20_questions.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/llm_20_questions.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/llm_20_questions.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/llm_20_questions/test_llm_20_questions.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/agents.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/dimensions/754.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/dimensions/main.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/index.html +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/lux_ai_2021.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/lux_ai_2021.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_constants.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/game_objects.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/io.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/kit.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/map.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/lux/parser.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/js_simple/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/annotate.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/constants.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_constants.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_map.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/lux/game_objects.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/random_agent.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_agents/python/simple_agent.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_2021/test_lux.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/agents.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/index.html +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/lux_ai_s2.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/lux_ai_s2.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/actions.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/config.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/env.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/factory.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/globals.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/bfs_deltas_gen.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/board.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map/position.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/generator.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/symnoise.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/timing.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/visualize.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/map_generator/visualize_samples.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/pyvisual/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/pyvisual/visualizer.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/replay/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/replay/replay.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/spaces/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/spaces/act_space.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/spaces/obs_space.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/state.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/stats.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/state/typing.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/team.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/tools/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/tools/replay.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/unit.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/animate.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/bidding.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/factory.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/heuristics/factory_placement.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/utils/utils.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/version.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/wrappers/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/wrappers/controllers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/luxai_s2/wrappers/sb3.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/agent.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/cargo.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/config.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/factory.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/kit.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/team.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/unit.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/lux/utils.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_agents/python/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s2/test_lux.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/agents.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/index.html +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/lux_ai_s3.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/lux_ai_s3.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/env.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/globals.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/params.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/profiler.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/pygame_render.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/spaces.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/state.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/utils.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/luxai_s3/wrappers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/agent.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/kit.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/lux/utils.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_agents/python/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/lux_ai_s3/test_lux.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/agents.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/mab.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/mab.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/mab/mab.py +0 -0
- {kaggle_environments-1.17.2/kaggle_environments/envs/rps → kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel}/__init__.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/agents.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/helpers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/rps.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/rps.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/rps.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/test_rps.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/rps/utils.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/test_tictactoe.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/tictactoe.js +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/tictactoe.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/envs/tictactoe/tictactoe.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/errors.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/helpers.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/main.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/schemas.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/static/player.html +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/status_codes.json +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments/utils.py +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/dependency_links.txt +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/entry_points.txt +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/requires.txt +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/kaggle_environments.egg-info/top_level.txt +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/setup.cfg +0 -0
- {kaggle_environments-1.17.2 → kaggle_environments-1.17.3}/setup.py +0 -0
|
File without changes
|
|
File without changes
|
kaggle_environments-1.17.3/kaggle_environments/envs/open_spiel/games/connect_four/connect_four.js
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
function renderer(options) {
|
|
2
|
+
const { environment, step, parent, interactive, isInteractive } = options;
|
|
3
|
+
|
|
4
|
+
const DEFAULT_NUM_ROWS = 6;
|
|
5
|
+
const DEFAULT_NUM_COLS = 7;
|
|
6
|
+
const PLAYER_SYMBOLS = ['O', 'X']; // O: Player 0 (Yellow), X: Player 1 (Red)
|
|
7
|
+
const PLAYER_COLORS = ['#facc15', '#ef4444']; // Yellow for 'O', Red for 'X'
|
|
8
|
+
const EMPTY_CELL_COLOR = '#e5e7eb';
|
|
9
|
+
const BOARD_COLOR = '#3b82f6';
|
|
10
|
+
|
|
11
|
+
const SVG_NS = "http://www.w3.org/2000/svg";
|
|
12
|
+
const CELL_UNIT_SIZE = 100;
|
|
13
|
+
const CIRCLE_RADIUS = CELL_UNIT_SIZE * 0.42;
|
|
14
|
+
const SVG_VIEWBOX_WIDTH = DEFAULT_NUM_COLS * CELL_UNIT_SIZE;
|
|
15
|
+
const SVG_VIEWBOX_HEIGHT = DEFAULT_NUM_ROWS * CELL_UNIT_SIZE;
|
|
16
|
+
|
|
17
|
+
let currentBoardSvgElement = null;
|
|
18
|
+
let currentStatusTextElement = null;
|
|
19
|
+
let currentWinnerTextElement = null;
|
|
20
|
+
let currentMessageBoxElement = typeof document !== 'undefined' ? document.getElementById('messageBox') : null;
|
|
21
|
+
let currentRendererContainer = null;
|
|
22
|
+
let currentTitleElement = null;
|
|
23
|
+
|
|
24
|
+
function _showMessage(message, type = 'info', duration = 3000) {
|
|
25
|
+
if (typeof document === 'undefined' || !document.body) return;
|
|
26
|
+
if (!currentMessageBoxElement) {
|
|
27
|
+
currentMessageBoxElement = document.createElement('div');
|
|
28
|
+
currentMessageBoxElement.id = 'messageBox';
|
|
29
|
+
currentMessageBoxElement.style.position = 'fixed';
|
|
30
|
+
currentMessageBoxElement.style.top = '10px';
|
|
31
|
+
currentMessageBoxElement.style.left = '50%';
|
|
32
|
+
currentMessageBoxElement.style.transform = 'translateX(-50%)';
|
|
33
|
+
currentMessageBoxElement.style.padding = '0.75rem 1rem';
|
|
34
|
+
currentMessageBoxElement.style.borderRadius = '0.375rem';
|
|
35
|
+
currentMessageBoxElement.style.boxShadow = '0 2px 4px rgba(0,0,0,0.1)';
|
|
36
|
+
currentMessageBoxElement.style.zIndex = '1000';
|
|
37
|
+
currentMessageBoxElement.style.opacity = '0';
|
|
38
|
+
currentMessageBoxElement.style.transition = 'opacity 0.3s ease-in-out, background-color 0.3s';
|
|
39
|
+
currentMessageBoxElement.style.fontSize = '0.875rem';
|
|
40
|
+
currentMessageBoxElement.style.fontFamily = "'Inter', sans-serif";
|
|
41
|
+
document.body.appendChild(currentMessageBoxElement);
|
|
42
|
+
}
|
|
43
|
+
currentMessageBoxElement.textContent = message;
|
|
44
|
+
currentMessageBoxElement.style.backgroundColor = type === 'error' ? '#ef4444' : '#10b981';
|
|
45
|
+
currentMessageBoxElement.style.color = 'white';
|
|
46
|
+
currentMessageBoxElement.style.opacity = '1';
|
|
47
|
+
setTimeout(() => { if (currentMessageBoxElement) currentMessageBoxElement.style.opacity = '0'; }, duration);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function _ensureRendererElements(parentElementToClear, rows, cols) {
|
|
51
|
+
if (!parentElementToClear) return false;
|
|
52
|
+
parentElementToClear.innerHTML = '';
|
|
53
|
+
|
|
54
|
+
currentRendererContainer = document.createElement('div');
|
|
55
|
+
currentRendererContainer.style.display = 'flex';
|
|
56
|
+
currentRendererContainer.style.flexDirection = 'column';
|
|
57
|
+
currentRendererContainer.style.alignItems = 'center';
|
|
58
|
+
currentRendererContainer.style.padding = '20px';
|
|
59
|
+
currentRendererContainer.style.boxSizing = 'border-box';
|
|
60
|
+
currentRendererContainer.style.width = '100%';
|
|
61
|
+
currentRendererContainer.style.height = '100%';
|
|
62
|
+
currentRendererContainer.style.fontFamily = "'Inter', sans-serif";
|
|
63
|
+
|
|
64
|
+
currentTitleElement = document.createElement('h1');
|
|
65
|
+
currentTitleElement.textContent = 'Connect Four';
|
|
66
|
+
currentTitleElement.style.fontSize = '1.875rem';
|
|
67
|
+
currentTitleElement.style.fontWeight = 'bold';
|
|
68
|
+
currentTitleElement.style.marginBottom = '1rem';
|
|
69
|
+
currentTitleElement.style.textAlign = 'center';
|
|
70
|
+
currentTitleElement.style.color = '#2563eb';
|
|
71
|
+
currentRendererContainer.appendChild(currentTitleElement);
|
|
72
|
+
|
|
73
|
+
currentBoardSvgElement = document.createElementNS(SVG_NS, "svg");
|
|
74
|
+
currentBoardSvgElement.setAttribute("viewBox", `0 0 ${SVG_VIEWBOX_WIDTH} ${SVG_VIEWBOX_HEIGHT}`);
|
|
75
|
+
currentBoardSvgElement.setAttribute("preserveAspectRatio", "xMidYMid meet");
|
|
76
|
+
currentBoardSvgElement.style.width = "auto";
|
|
77
|
+
currentBoardSvgElement.style.maxWidth = "500px";
|
|
78
|
+
currentBoardSvgElement.style.maxHeight = `calc(100vh - 200px)`;
|
|
79
|
+
currentBoardSvgElement.style.aspectRatio = `${cols} / ${rows}`;
|
|
80
|
+
currentBoardSvgElement.style.display = "block";
|
|
81
|
+
currentBoardSvgElement.style.margin = "0 auto 20px auto";
|
|
82
|
+
|
|
83
|
+
const boardBgRect = document.createElementNS(SVG_NS, "rect");
|
|
84
|
+
boardBgRect.setAttribute("x", "0");
|
|
85
|
+
boardBgRect.setAttribute("y", "0");
|
|
86
|
+
boardBgRect.setAttribute("width", SVG_VIEWBOX_WIDTH.toString());
|
|
87
|
+
boardBgRect.setAttribute("height", SVG_VIEWBOX_HEIGHT.toString());
|
|
88
|
+
boardBgRect.setAttribute("fill", BOARD_COLOR);
|
|
89
|
+
boardBgRect.setAttribute("rx", (CELL_UNIT_SIZE * 0.1).toString());
|
|
90
|
+
currentBoardSvgElement.appendChild(boardBgRect);
|
|
91
|
+
|
|
92
|
+
// SVG Circles are created with (0,0) being top-left visual circle
|
|
93
|
+
for (let r_visual = 0; r_visual < rows; r_visual++) {
|
|
94
|
+
for (let c_visual = 0; c_visual < cols; c_visual++) {
|
|
95
|
+
const circle = document.createElementNS(SVG_NS, "circle");
|
|
96
|
+
const cx = c_visual * CELL_UNIT_SIZE + CELL_UNIT_SIZE / 2;
|
|
97
|
+
const cy = r_visual * CELL_UNIT_SIZE + CELL_UNIT_SIZE / 2;
|
|
98
|
+
circle.setAttribute("id", `cell-${r_visual}-${c_visual}`);
|
|
99
|
+
circle.setAttribute("cx", cx.toString());
|
|
100
|
+
circle.setAttribute("cy", cy.toString());
|
|
101
|
+
circle.setAttribute("r", CIRCLE_RADIUS.toString());
|
|
102
|
+
circle.setAttribute("fill", EMPTY_CELL_COLOR);
|
|
103
|
+
currentBoardSvgElement.appendChild(circle);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
currentRendererContainer.appendChild(currentBoardSvgElement);
|
|
107
|
+
|
|
108
|
+
const statusContainer = document.createElement('div');
|
|
109
|
+
statusContainer.style.padding = '10px 15px';
|
|
110
|
+
statusContainer.style.backgroundColor = 'white';
|
|
111
|
+
statusContainer.style.borderRadius = '8px';
|
|
112
|
+
statusContainer.style.boxShadow = '0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -1px rgba(0,0,0,0.06)';
|
|
113
|
+
statusContainer.style.textAlign = 'center';
|
|
114
|
+
statusContainer.style.width = 'auto';
|
|
115
|
+
statusContainer.style.minWidth = '200px';
|
|
116
|
+
statusContainer.style.maxWidth = '90vw';
|
|
117
|
+
currentRendererContainer.appendChild(statusContainer);
|
|
118
|
+
|
|
119
|
+
currentStatusTextElement = document.createElement('p');
|
|
120
|
+
currentStatusTextElement.style.fontSize = '1.1rem';
|
|
121
|
+
currentStatusTextElement.style.fontWeight = '600';
|
|
122
|
+
currentStatusTextElement.style.margin = '0 0 5px 0';
|
|
123
|
+
statusContainer.appendChild(currentStatusTextElement);
|
|
124
|
+
|
|
125
|
+
currentWinnerTextElement = document.createElement('p');
|
|
126
|
+
currentWinnerTextElement.style.fontSize = '1.25rem';
|
|
127
|
+
currentWinnerTextElement.style.fontWeight = '700';
|
|
128
|
+
currentWinnerTextElement.style.margin = '5px 0 0 0';
|
|
129
|
+
statusContainer.appendChild(currentWinnerTextElement);
|
|
130
|
+
|
|
131
|
+
parentElementToClear.appendChild(currentRendererContainer);
|
|
132
|
+
|
|
133
|
+
if (typeof document !== 'undefined' && !document.body.hasAttribute('data-renderer-initialized')) {
|
|
134
|
+
document.body.setAttribute('data-renderer-initialized', 'true');
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function _renderBoardDisplay_svg(gameStateToDisplay, displayRows, displayCols) {
|
|
140
|
+
if (!currentBoardSvgElement || !currentStatusTextElement || !currentWinnerTextElement) return;
|
|
141
|
+
|
|
142
|
+
if (!gameStateToDisplay || typeof gameStateToDisplay.board !== 'object' || !Array.isArray(gameStateToDisplay.board) || gameStateToDisplay.board.length === 0) {
|
|
143
|
+
currentStatusTextElement.textContent = "Waiting for game data...";
|
|
144
|
+
currentWinnerTextElement.textContent = "";
|
|
145
|
+
for (let r_visual = 0; r_visual < displayRows; r_visual++) {
|
|
146
|
+
for (let c_visual = 0; c_visual < displayCols; c_visual++) {
|
|
147
|
+
const circleElement = currentBoardSvgElement.querySelector(`#cell-${r_visual}-${c_visual}`);
|
|
148
|
+
if (circleElement) {
|
|
149
|
+
circleElement.setAttribute("fill", EMPTY_CELL_COLOR);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const { board, current_player, is_terminal, winner } = gameStateToDisplay;
|
|
157
|
+
|
|
158
|
+
for (let r_data = 0; r_data < displayRows; r_data++) {
|
|
159
|
+
const dataRow = board[r_data];
|
|
160
|
+
if (!dataRow || !Array.isArray(dataRow) || dataRow.length !== displayCols) {
|
|
161
|
+
// Error handling for malformed row
|
|
162
|
+
for (let c_fill = 0; c_fill < displayCols; c_fill++) {
|
|
163
|
+
// Determine visual row for error display. If r_data=0 is top data,
|
|
164
|
+
// and we want to flip, then this error is for visual row (displayRows-1)-0.
|
|
165
|
+
const visual_row_for_error = (displayRows - 1) - r_data;
|
|
166
|
+
const circleElement = currentBoardSvgElement.querySelector(`#cell-${visual_row_for_error}-${c_fill}`);
|
|
167
|
+
if (circleElement) circleElement.setAttribute("fill", '#FF00FF'); // Magenta for error
|
|
168
|
+
}
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const visual_svg_row_index = (displayRows - 1) - r_data;
|
|
173
|
+
|
|
174
|
+
for (let c_data = 0; c_data < displayCols; c_data++) { // c_data iterates through columns of `board[r_data]`
|
|
175
|
+
const originalCellValue = dataRow[c_data];
|
|
176
|
+
const cellValueForComparison = String(originalCellValue).trim().toLowerCase();
|
|
177
|
+
|
|
178
|
+
// The column index for SVG is the same as c_data
|
|
179
|
+
const visual_svg_col_index = c_data;
|
|
180
|
+
const circleElement = currentBoardSvgElement.querySelector(`#cell-${visual_svg_row_index}-${visual_svg_col_index}`);
|
|
181
|
+
|
|
182
|
+
if (!circleElement) continue;
|
|
183
|
+
|
|
184
|
+
let fillColor = EMPTY_CELL_COLOR;
|
|
185
|
+
if (cellValueForComparison === "o") {
|
|
186
|
+
fillColor = PLAYER_COLORS[0]; // Yellow
|
|
187
|
+
} else if (cellValueForComparison === "x") {
|
|
188
|
+
fillColor = PLAYER_COLORS[1]; // Red
|
|
189
|
+
}
|
|
190
|
+
circleElement.setAttribute("fill", fillColor);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
currentStatusTextElement.innerHTML = '';
|
|
195
|
+
currentWinnerTextElement.innerHTML = '';
|
|
196
|
+
if (is_terminal) {
|
|
197
|
+
currentStatusTextElement.textContent = "Game Over!";
|
|
198
|
+
if (winner !== null && winner !== undefined) {
|
|
199
|
+
if (String(winner).toLowerCase() === 'draw') {
|
|
200
|
+
currentWinnerTextElement.textContent = "It's a Draw!";
|
|
201
|
+
} else {
|
|
202
|
+
let winnerSymbolDisplay, winnerColorDisplay;
|
|
203
|
+
if (String(winner).toLowerCase() === "o") {
|
|
204
|
+
winnerSymbolDisplay = PLAYER_SYMBOLS[0];
|
|
205
|
+
winnerColorDisplay = PLAYER_COLORS[0];
|
|
206
|
+
} else if (String(winner).toLowerCase() === "x") {
|
|
207
|
+
winnerSymbolDisplay = PLAYER_SYMBOLS[1];
|
|
208
|
+
winnerColorDisplay = PLAYER_COLORS[1];
|
|
209
|
+
}
|
|
210
|
+
if (winnerSymbolDisplay) {
|
|
211
|
+
currentWinnerTextElement.innerHTML = `Player <span style="color: ${winnerColorDisplay}; font-weight: bold;">${winnerSymbolDisplay}</span> Wins!`;
|
|
212
|
+
} else {
|
|
213
|
+
currentWinnerTextElement.textContent = `Winner: ${String(winner).toUpperCase()}`;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
} else { currentWinnerTextElement.textContent = "Game ended."; }
|
|
217
|
+
} else {
|
|
218
|
+
let playerSymbolToDisplay, playerColorToDisplay;
|
|
219
|
+
if (String(current_player).toLowerCase() === "o") {
|
|
220
|
+
playerSymbolToDisplay = PLAYER_SYMBOLS[0];
|
|
221
|
+
playerColorToDisplay = PLAYER_COLORS[0];
|
|
222
|
+
} else if (String(current_player).toLowerCase() === "x") {
|
|
223
|
+
playerSymbolToDisplay = PLAYER_SYMBOLS[1];
|
|
224
|
+
playerColorToDisplay = PLAYER_COLORS[1];
|
|
225
|
+
}
|
|
226
|
+
if (playerSymbolToDisplay) {
|
|
227
|
+
currentStatusTextElement.innerHTML = `Current Player: <span style="color: ${playerColorToDisplay}; font-weight: bold;">${playerSymbolToDisplay}</span>`;
|
|
228
|
+
} else {
|
|
229
|
+
currentStatusTextElement.textContent = "Waiting for player...";
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// --- Main execution logic ---
|
|
235
|
+
if (!_ensureRendererElements(parent, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS)) {
|
|
236
|
+
if (parent && typeof parent.innerHTML !== 'undefined') {
|
|
237
|
+
parent.innerHTML = "<p style='color:red; font-family: sans-serif;'>Critical Error: Renderer element setup failed.</p>";
|
|
238
|
+
}
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (!environment || !environment.steps || !environment.steps[step]) {
|
|
243
|
+
_renderBoardDisplay_svg(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
244
|
+
if(currentStatusTextElement) currentStatusTextElement.textContent = "Initializing environment...";
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const currentStepAgents = environment.steps[step];
|
|
249
|
+
if (!currentStepAgents || !Array.isArray(currentStepAgents) || currentStepAgents.length === 0) {
|
|
250
|
+
_renderBoardDisplay_svg(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
251
|
+
if(currentStatusTextElement) currentStatusTextElement.textContent = "Waiting for agent data...";
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const gameMasterAgentIndex = currentStepAgents.length - 1;
|
|
256
|
+
const gameMasterAgent = currentStepAgents[gameMasterAgentIndex];
|
|
257
|
+
|
|
258
|
+
if (!gameMasterAgent || typeof gameMasterAgent.observation === 'undefined') {
|
|
259
|
+
_renderBoardDisplay_svg(null, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
260
|
+
if(currentStatusTextElement) currentStatusTextElement.textContent = "Waiting for observation data...";
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
const observationForRenderer = gameMasterAgent.observation;
|
|
264
|
+
|
|
265
|
+
let gameSpecificState = null;
|
|
266
|
+
|
|
267
|
+
if (observationForRenderer && typeof observationForRenderer.observation_string === 'string' && observationForRenderer.observation_string.trim() !== '') {
|
|
268
|
+
try {
|
|
269
|
+
gameSpecificState = JSON.parse(observationForRenderer.observation_string);
|
|
270
|
+
} catch (e) {
|
|
271
|
+
_showMessage("Error: Corrupted game state (obs_string).", 'error');
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (!gameSpecificState && observationForRenderer && typeof observationForRenderer.json === 'string' && observationForRenderer.json.trim() !== '') {
|
|
276
|
+
try {
|
|
277
|
+
gameSpecificState = JSON.parse(observationForRenderer.json);
|
|
278
|
+
} catch (e) {
|
|
279
|
+
_showMessage("Error: Corrupted game state (json).", 'error');
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (!gameSpecificState && observationForRenderer &&
|
|
284
|
+
Array.isArray(observationForRenderer.board) &&
|
|
285
|
+
typeof observationForRenderer.current_player !== 'undefined'
|
|
286
|
+
) {
|
|
287
|
+
if( (observationForRenderer.board.length === DEFAULT_NUM_ROWS &&
|
|
288
|
+
(observationForRenderer.board.length === 0 ||
|
|
289
|
+
(Array.isArray(observationForRenderer.board[0]) && observationForRenderer.board[0].length === DEFAULT_NUM_COLS)))
|
|
290
|
+
){
|
|
291
|
+
gameSpecificState = observationForRenderer;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
_renderBoardDisplay_svg(gameSpecificState, DEFAULT_NUM_ROWS, DEFAULT_NUM_COLS);
|
|
296
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Change Connect Four state and action string representations."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from ... import proxy
|
|
7
|
+
import pyspiel
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ConnectFourState(proxy.State):
|
|
11
|
+
"""Connect Four state proxy."""
|
|
12
|
+
|
|
13
|
+
def _player_string(self, player: int) -> str:
|
|
14
|
+
if player < 0:
|
|
15
|
+
return pyspiel.PlayerId(player).name.lower()
|
|
16
|
+
elif player == 0:
|
|
17
|
+
return 'x'
|
|
18
|
+
elif player == 1:
|
|
19
|
+
return 'o'
|
|
20
|
+
else:
|
|
21
|
+
raise ValueError(f'Invalid player: {player}')
|
|
22
|
+
|
|
23
|
+
def state_dict(self) -> dict[str, Any]:
|
|
24
|
+
# row 0 is now bottom row
|
|
25
|
+
rows = reversed(self.to_string().strip().split('\n'))
|
|
26
|
+
board = [list(row) for row in rows]
|
|
27
|
+
winner = None
|
|
28
|
+
if self.is_terminal():
|
|
29
|
+
if self.returns()[0] > self.returns()[1]:
|
|
30
|
+
winner = 'x'
|
|
31
|
+
elif self.returns()[1] > self.returns()[0]:
|
|
32
|
+
winner = 'o'
|
|
33
|
+
else:
|
|
34
|
+
winner = 'draw'
|
|
35
|
+
return {
|
|
36
|
+
'board': board,
|
|
37
|
+
'current_player': self._player_string(self.current_player()),
|
|
38
|
+
'is_terminal': self.is_terminal(),
|
|
39
|
+
'winner': winner,
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
def to_json(self) -> str:
|
|
43
|
+
return json.dumps(self.state_dict())
|
|
44
|
+
|
|
45
|
+
def action_to_dict(self, action: int) -> dict[str, Any]:
|
|
46
|
+
return {'col': action}
|
|
47
|
+
|
|
48
|
+
def action_to_json(self, action: int) -> str:
|
|
49
|
+
return json.dumps(self.action_to_dict(action))
|
|
50
|
+
|
|
51
|
+
def dict_to_action(self, action_dict: dict[str, Any]) -> int:
|
|
52
|
+
return int(action_dict['col'])
|
|
53
|
+
|
|
54
|
+
def json_to_action(self, action_json: str) -> int:
|
|
55
|
+
action_dict = json.loads(action_json)
|
|
56
|
+
return self.dict_to_action(action_dict)
|
|
57
|
+
|
|
58
|
+
def observation_string(self, player: int) -> str:
|
|
59
|
+
return self.observation_json(player)
|
|
60
|
+
|
|
61
|
+
def observation_json(self, player: int) -> str:
|
|
62
|
+
del player
|
|
63
|
+
return self.to_json()
|
|
64
|
+
|
|
65
|
+
def __str__(self):
|
|
66
|
+
return self.to_json()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
class ConnectFourGame(proxy.Game):
|
|
70
|
+
"""Connect Four game proxy."""
|
|
71
|
+
|
|
72
|
+
def __init__(self, params: Any | None = None):
|
|
73
|
+
params = params or {}
|
|
74
|
+
wrapped = pyspiel.load_game('connect_four', params)
|
|
75
|
+
super().__init__(
|
|
76
|
+
wrapped,
|
|
77
|
+
short_name='connect_four_proxy',
|
|
78
|
+
long_name='Connect Four (proxy)',
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
def new_initial_state(self, *args) -> ConnectFourState:
|
|
82
|
+
return ConnectFourState(self.__wrapped__.new_initial_state(*args),
|
|
83
|
+
game=self)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
pyspiel.register_game(ConnectFourGame().get_type(), ConnectFourGame)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"""Test for proxied Connect Four game."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
|
|
5
|
+
from absl.testing import absltest
|
|
6
|
+
from absl.testing import parameterized
|
|
7
|
+
import pyspiel
|
|
8
|
+
from . import connect_four_proxy as connect_four
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
NUM_ROWS = 6
|
|
12
|
+
NUM_COLS = 7
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ConnectFourTest(parameterized.TestCase):
|
|
16
|
+
|
|
17
|
+
def test_game_is_registered(self):
|
|
18
|
+
game = pyspiel.load_game('connect_four_proxy')
|
|
19
|
+
self.assertIsInstance(game, connect_four.ConnectFourGame)
|
|
20
|
+
|
|
21
|
+
def test_random_sim(self):
|
|
22
|
+
game = connect_four.ConnectFourGame()
|
|
23
|
+
pyspiel.random_sim_test(game, num_sims=10, serialize=False, verbose=False)
|
|
24
|
+
|
|
25
|
+
def test_state_to_json(self):
|
|
26
|
+
game = connect_four.ConnectFourGame()
|
|
27
|
+
state = game.new_initial_state()
|
|
28
|
+
json_state = json.loads(state.to_json())
|
|
29
|
+
expected_board = [['.'] * NUM_COLS for _ in range(NUM_ROWS)]
|
|
30
|
+
self.assertEqual(json_state['board'], expected_board)
|
|
31
|
+
self.assertEqual(json_state['current_player'], 'x')
|
|
32
|
+
state.apply_action(3)
|
|
33
|
+
json_state = json.loads(state.to_json())
|
|
34
|
+
expected_board[0][3] = 'x'
|
|
35
|
+
self.assertEqual(json_state['board'], expected_board)
|
|
36
|
+
self.assertEqual(json_state['current_player'], 'o')
|
|
37
|
+
state.apply_action(2)
|
|
38
|
+
json_state = json.loads(state.to_json())
|
|
39
|
+
expected_board[0][2] = 'o'
|
|
40
|
+
self.assertEqual(json_state['board'], expected_board)
|
|
41
|
+
self.assertEqual(json_state['current_player'], 'x')
|
|
42
|
+
state.apply_action(2)
|
|
43
|
+
json_state = json.loads(state.to_json())
|
|
44
|
+
expected_board[1][2] = 'x'
|
|
45
|
+
self.assertEqual(json_state['board'], expected_board)
|
|
46
|
+
self.assertEqual(json_state['current_player'], 'o')
|
|
47
|
+
|
|
48
|
+
def test_action_to_json(self):
|
|
49
|
+
game = connect_four.ConnectFourGame()
|
|
50
|
+
state = game.new_initial_state()
|
|
51
|
+
action = json.loads(state.action_to_json(3))
|
|
52
|
+
self.assertEqual(json.loads(state.action_to_json(3)), action)
|
|
53
|
+
self.assertEqual(action['col'], 3)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
if __name__ == '__main__':
|
|
57
|
+
absltest.main()
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Copyright 2019 DeepMind Technologies Limited
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
"""An observation of a game.
|
|
16
|
+
|
|
17
|
+
This is intended to be the main way to get observations of states in Python.
|
|
18
|
+
The usage pattern is as follows:
|
|
19
|
+
|
|
20
|
+
0. Create the game we will be playing
|
|
21
|
+
1. Create each kind of observation required, using `make_observation`
|
|
22
|
+
2. Every time a new observation is required, call:
|
|
23
|
+
`observation.set_from(state, player)`
|
|
24
|
+
The tensor contained in the Observation class will be updated with an
|
|
25
|
+
observation of the supplied state. This tensor is updated in-place, so if
|
|
26
|
+
you wish to retain it, you must make a copy.
|
|
27
|
+
|
|
28
|
+
The following options are available when creating an Observation:
|
|
29
|
+
- perfect_recall: if true, each observation must allow the observing player to
|
|
30
|
+
reconstruct their history of actions and observations.
|
|
31
|
+
- public_info: if true, the observation should include public information
|
|
32
|
+
- private_info: specifies for which players private information should be
|
|
33
|
+
included - all players, the observing player, or no players
|
|
34
|
+
- params: game-specific parameters for observations
|
|
35
|
+
|
|
36
|
+
We ultimately aim to have all games support all combinations of these arguments.
|
|
37
|
+
However, initially many games will only support the combinations corresponding
|
|
38
|
+
to ObservationTensor and InformationStateTensor:
|
|
39
|
+
- ObservationTensor: perfect_recall=False, public_info=True,
|
|
40
|
+
private_info=SinglePlayer
|
|
41
|
+
- InformationStateTensor: perfect_recall=True, public_info=True,
|
|
42
|
+
private_info=SinglePlayer
|
|
43
|
+
|
|
44
|
+
Three formats of observation are supported:
|
|
45
|
+
a. 1-D numpy array, accessed by `observation.tensor`
|
|
46
|
+
b. Dict of numpy arrays, accessed by `observation.dict`. These are pieces of the
|
|
47
|
+
1-D array, reshaped. The np.array objects refer to the same memory as the
|
|
48
|
+
1-D array (no copying!).
|
|
49
|
+
c. String, hopefully human-readable (primarily for debugging purposes)
|
|
50
|
+
|
|
51
|
+
For usage examples, see `observation_test.py`.
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
import numpy as np
|
|
55
|
+
|
|
56
|
+
import pyspiel
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# Corresponds to the old information_state_XXX methods.
|
|
60
|
+
INFO_STATE_OBS_TYPE = pyspiel.IIGObservationType(perfect_recall=True)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class _Observation:
|
|
64
|
+
"""Contains an observation from a game."""
|
|
65
|
+
|
|
66
|
+
def __init__(self, game, observer):
|
|
67
|
+
self._observation = pyspiel._Observation(game, observer)
|
|
68
|
+
self.dict = {}
|
|
69
|
+
if self._observation.has_tensor():
|
|
70
|
+
self.tensor = np.frombuffer(self._observation, np.float32)
|
|
71
|
+
offset = 0
|
|
72
|
+
for tensor_info in self._observation.tensors_info():
|
|
73
|
+
size = np.prod(tensor_info.shape, dtype=np.int64)
|
|
74
|
+
values = self.tensor[offset:offset + size].reshape(tensor_info.shape)
|
|
75
|
+
self.dict[tensor_info.name] = values
|
|
76
|
+
offset += size
|
|
77
|
+
else:
|
|
78
|
+
self.tensor = None
|
|
79
|
+
|
|
80
|
+
def set_from(self, state, player):
|
|
81
|
+
self._observation.set_from(state, player)
|
|
82
|
+
|
|
83
|
+
def string_from(self, state, player):
|
|
84
|
+
return (self._observation.string_from(state, player)
|
|
85
|
+
if self._observation.has_string() else None)
|
|
86
|
+
|
|
87
|
+
def compress(self):
|
|
88
|
+
return self._observation.compress()
|
|
89
|
+
|
|
90
|
+
def decompress(self, compressed_observation):
|
|
91
|
+
self._observation.decompress(compressed_observation)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def make_observation(
|
|
95
|
+
game,
|
|
96
|
+
imperfect_information_observation_type=None,
|
|
97
|
+
params=None,
|
|
98
|
+
):
|
|
99
|
+
"""Returns an _Observation instance if the imperfect_information_observation_type is supported, otherwise None."""
|
|
100
|
+
params = params or {}
|
|
101
|
+
if hasattr(game, 'make_py_observer'):
|
|
102
|
+
return game.make_py_observer(imperfect_information_observation_type, params)
|
|
103
|
+
else:
|
|
104
|
+
if imperfect_information_observation_type is not None:
|
|
105
|
+
observer = game.make_observer(
|
|
106
|
+
imperfect_information_observation_type, params
|
|
107
|
+
)
|
|
108
|
+
else:
|
|
109
|
+
observer = game.make_observer(params)
|
|
110
|
+
if observer is None:
|
|
111
|
+
return None
|
|
112
|
+
return _Observation(game, observer)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class IIGObserverForPublicInfoGame:
|
|
116
|
+
"""Observer for imperfect information obvservations of public-info games."""
|
|
117
|
+
|
|
118
|
+
def __init__(self, iig_obs_type, params):
|
|
119
|
+
if params:
|
|
120
|
+
raise ValueError(f'Observation parameters not supported; passed {params}')
|
|
121
|
+
self._iig_obs_type = iig_obs_type
|
|
122
|
+
self.tensor = None
|
|
123
|
+
self.dict = {}
|
|
124
|
+
|
|
125
|
+
def set_from(self, state, player):
|
|
126
|
+
pass
|
|
127
|
+
|
|
128
|
+
def string_from(self, state, player):
|
|
129
|
+
del player
|
|
130
|
+
if self._iig_obs_type.public_info:
|
|
131
|
+
return state.history_str()
|
|
132
|
+
else:
|
|
133
|
+
return '' # No private information to return
|