Skip to main content

No project description provided

Project description

blokus-rl

A PettingZoo-API-compatible reinforcement learning (RL) environment for the strategy board game Blokus.

blokus-rl

Installation

pip

pip install -U blokus-rl

Poetry

poetry add blokus-rl

Source

git clone https://github.com/APirchner/blokus-rl.git
cd blokus-rl
pip install -U maturin
maturin build [--release]
pip install {path/to/wheel}.whl

Example usage

from blokus_rl import BlokusEnv

env = BlokusEnv(render_mode="human")
env.reset()
for i, agent in enumerate(env.agent_iter()):
    observation, reward, termination, truncation, info = env.last()
    action = env.action_space(agent).sample(mask=observation["action_mask"])
    env.step(action)
    if all([t[1] for t in env.terminations.items()]):
        break
print(env.rewards)

Motivation

I'm not a passionate gamer and get frustrated quite easily when a board game does not go my way. For some reason, I always enjoy playing Blokus - wheter I'm winning or not. And being a computer scientist by training, I was always wondering what weird/effective strategies a powerful RL agent would uncover.

While there are a few comprehensive RL libraries such as RLlib and environments for common classical boardgames and Atari games, I was not able to find an environment for Blokus that implements with the typical APIs. This repo should fill this gap.

Working mostly in Python, I started out with a inefficient implementation and soon found that masking invalid moves did not scale well. It never hurts to have some lower-level language in your toolbox, so I started from scratch in Rust - both as a Rust-learning experience and a way to speed up Blokus episodes.

Implementation details

Internally, the game is implemented with bitboards. A set of 4 u128 integers represents the board of 20x20 tiles and an additional column of separating bits. All game logic is built on bit operations - from generating all possible actions to finding the valid subsets of actions for each player at each turn of the game. While doing research on how to speed up the masking of invalid actions, I found the smart Blokus implementation by nicohass. From this repo I picked up the idea of using bitboards. The basics on how to rotate boards come from the Chess Programming Wiki.

The internal logic of the game is implemented in Rust, while the API is exposed through a Python class. The Python bindings for the Rust code are built with PyO3 and maturin.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

blokus_rl-0.1.4.tar.gz (1.8 MB view hashes)

Uploaded Source

Built Distributions

blokus_rl-0.1.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ x86-64

blokus_rl-0.1.4-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ s390x

blokus_rl-0.1.4-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ppc64le

blokus_rl-0.1.4-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARMv7l

blokus_rl-0.1.4-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded PyPy manylinux: glibc 2.17+ ARM64

blokus_rl-0.1.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded PyPy manylinux: glibc 2.5+ i686

blokus_rl-0.1.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ s390x

blokus_rl-0.1.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ppc64le

blokus_rl-0.1.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARMv7l

blokus_rl-0.1.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.13 manylinux: glibc 2.17+ ARM64

blokus_rl-0.1.4-cp312-none-win_amd64.whl (173.3 kB view hashes)

Uploaded CPython 3.12 Windows x86-64

blokus_rl-0.1.4-cp312-none-win32.whl (171.4 kB view hashes)

Uploaded CPython 3.12 Windows x86

blokus_rl-0.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ x86-64

blokus_rl-0.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ s390x

blokus_rl-0.1.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ppc64le

blokus_rl-0.1.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARMv7l

blokus_rl-0.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.17+ ARM64

blokus_rl-0.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.12 manylinux: glibc 2.5+ i686

blokus_rl-0.1.4-cp312-cp312-macosx_11_0_arm64.whl (304.2 kB view hashes)

Uploaded CPython 3.12 macOS 11.0+ ARM64

blokus_rl-0.1.4-cp312-cp312-macosx_10_12_x86_64.whl (304.3 kB view hashes)

Uploaded CPython 3.12 macOS 10.12+ x86-64

blokus_rl-0.1.4-cp311-none-win_amd64.whl (174.5 kB view hashes)

Uploaded CPython 3.11 Windows x86-64

blokus_rl-0.1.4-cp311-none-win32.whl (172.6 kB view hashes)

Uploaded CPython 3.11 Windows x86

blokus_rl-0.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ x86-64

blokus_rl-0.1.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ s390x

blokus_rl-0.1.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ppc64le

blokus_rl-0.1.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARMv7l

blokus_rl-0.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.17+ ARM64

blokus_rl-0.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.11 manylinux: glibc 2.5+ i686

blokus_rl-0.1.4-cp311-cp311-macosx_11_0_arm64.whl (304.8 kB view hashes)

Uploaded CPython 3.11 macOS 11.0+ ARM64

blokus_rl-0.1.4-cp311-cp311-macosx_10_12_x86_64.whl (305.4 kB view hashes)

Uploaded CPython 3.11 macOS 10.12+ x86-64

blokus_rl-0.1.4-cp310-none-win_amd64.whl (174.6 kB view hashes)

Uploaded CPython 3.10 Windows x86-64

blokus_rl-0.1.4-cp310-none-win32.whl (172.6 kB view hashes)

Uploaded CPython 3.10 Windows x86

blokus_rl-0.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ x86-64

blokus_rl-0.1.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl (1.3 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ s390x

blokus_rl-0.1.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ppc64le

blokus_rl-0.1.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARMv7l

blokus_rl-0.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.1 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.17+ ARM64

blokus_rl-0.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl (1.2 MB view hashes)

Uploaded CPython 3.10 manylinux: glibc 2.5+ i686

blokus_rl-0.1.4-cp310-cp310-macosx_11_0_arm64.whl (304.7 kB view hashes)

Uploaded CPython 3.10 macOS 11.0+ ARM64

blokus_rl-0.1.4-cp310-cp310-macosx_10_12_x86_64.whl (305.3 kB view hashes)

Uploaded CPython 3.10 macOS 10.12+ x86-64

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page