A procedural level generator for Sokoban, written in JavaScript.
npm i sokoban-generator
Play Sokoban created by this generator in action!
The website above uses the default options for the generator, except that it specifies the initial position of the player.
// es6
import {generateSokobanLevel} from sokoban-generator;
generateSokobanLevel();
// es5 or older
var sokobanGenerator = require("sokoban-generator");
sokobanGenerator.generateSokobanLevel();
The generator accepts an optional options
, and can return either a string representation of the level, or a grid
class.
If will return null
if no solution is found. Increasing attempts
might help.
const options = {
width: 9, // the width of the sokoban grid
height: 9, // the height of the sokoban grid
boxes: 3, // the boxes on the grid
minWalls: 13, // the minimum number of walls on the grid
attempts: 5000, // when generating the map, the maximum attempts
seed: Date.now(), // map seed. See note below
initialPosition: { // The initial position of player
x: 0,
y: 0
},
type: "string", // the return type, either "string" or "class"
};
let level = generateSokobanLevel(options);
- Seed is only expected to generate the same map under the same options. This means, for example,
generateSokobanLevel({seed: 1, boxes: 2})
andgenerateSokobanLevel({seed: 1, boxes: 3})
will probably generate different levels.
The time it takes to generate a level is greatly increased when the number of size and walls are increased.
It took ~1 seconds to generate a result on default settings on a 2015 Ultrabook Laptop on Node, but it took only less than a second on runkit.
GNU GPLv3
The whole algorithm is partially based on this paper