sokoenginepy - Sokoban and variants¶
This project implements various utilities for Sokoban:
board representation for Sokoban, Hexoban, Trioban and Octoban variants with support for Sokoban+ and Multiban for all four variants
game engine implementation
SokobanYASC compatible level collections file reader / writer
It provides two implementations:
sokoenginepy
- pure Python implementationlibsokoengine
- C++ library
Documentation¶
Tutorial: Read the Docs - Tutorial
Python docs: Read the Docs
C++ docs: libsokoengine Doxygen documentation
Example¶
In Python:
import textwrap
from sokoenginepy.io import SokobanPuzzle
from sokoenginepy.game import BoardGraph, Mover, Direction, Config
data = textwrap.dedent("""
#####
# @#
#$ #
### $##
# $ $ #
### # ## # ######
# # ## ##### ..#
# $ $ ..#
##### ### #@## ..#
# #########
#######
""")
puzzle = SokobanPuzzle(board=data)
board = BoardGraph(puzzle)
mover = Mover(board)
mover.select_pusher(Config.DEFAULT_ID + 1)
mover.move(Direction.UP)
print(board)
or in C++:
#include <sokoengine.hpp>
#include <iostream>
using sokoengine::game::BoardGraph;
using sokoengine::game::Direction;
using sokoengine::game::Mover;
using sokoengine::game::Config;
using sokoengine::io::SokobanPuzzle;
using std::string;
int main() {
string data = R"""(
#####
# @#
#$ #
### $##
# $ $ #
### # ## # ######
# # ## ##### ..#
# $ $ ..#
##### ### #@## ..#
# #########
#######
)""";
SokobanPuzzle puzzle(data);
BoardGraph board(puzzle);
Mover mover(board);
mover.select_pusher(Config::DEFAULT_ID + 1);
mover.move(Direction::UP);
std::cout << board.str() << std::endl;
return 0;
}
Install¶
sokoenginepy
package from PyPi:
pip install sokoenginepy
or libsokoengine
C++ library:
You will need vcpkg and then:
sudo apt install git build-essential cmake doxygen
git clone https://github.com/tadams42/sokoenginepy.git
cd sokoenginepy/
export CMAKE_TOOLCHAIN_FILE=[path to vcpkg]/scripts/buildsystems/vcpkg.cmake
cmake --preset "debug"
cd build/debug/
make && make install
For more elaborate details, see INSTALL.md
Why?¶
experimenting with Boost.X3 in C++
experimenting with Boost.Graph in C++
experimenting with NetworkX in Python
experimenting with pybind11
playing with SokobanYASC
.sok
file format and providing fully compatible implementation for it in both, Python and C++