Puzzle format
From Sokoban Wiki
Contents |
Level
The most commonly used format for representing a level of Sokoban is:
Level element | Character | ASCII Code |
---|---|---|
Wall | # | 0x23 |
Player | @ | 0x40 |
Player on goal square | + | 0x2b |
Box | $ | 0x24 |
Box on goal square | * | 0x2a |
Goal square | . | 0x2e |
Floor | (Space) | 0x20 |
The simplest solvable level looks like this:
##### #@$.# #####
It's important that the whole level is surrounded by walls (#
).
This means - assumed all boxes are removed from the board - the player musn't be able to get to the border of the level. Hence a level like this can't be loaded by most of the Sokoban programs:
The player can reach the right border of the level, since the level is not "closed".
Formats not all programs support
During the years some Sokoban programs have added support for Sokoban formats that aren't supported by many old programs.
Circular levels
Circular levels are levels that start in the end position.
Example level:
Levels with decorative outside elements
Some levels have walls, boxes and goals outside the player reachable area to create a better look.
An example level is "Sasquatch 01 / Level 41":
The boxes on the left side can't be reached by the player. The whole left area is just there to for a decorative purpose.
Interior empty rows
Some levels look better having interior empty rows.
An example is the level "Steaming Hot" by David Buchweitz.
Note: Since in the sok format an empty line is used to separate level, solutions, snapshots, ... such interior empty rows can't be written as an empty line.
Hence, the rule for is: "An empty interior row is written with at least one "-" or "_".
The level "Steaming Hot" can therefore be stored in a txt file like this:
# # # # # # # # # # # # # # # # # # # # - ########## #........#### # $$$$$$$# # #.$......# # # $$$$$$ # # #......$+# # #$$$$$$$ # # # #### ##########
Not closed levels
Some websites and programs also allow levels that aren't surrounded by walls. The player can move to the border of such levels but not further.
In extreme cases, such a level doesn't have any walls at all.
An example is the level "No walls" created by Rincewind:
Solution
A solution of a level is represented by the moves of the player. The player can move up, down, left or right. Hence, the letters for these directions are: u, d, l, r. ⇒ Solution format
A possible solution string may look like this:
DDrdrruLruLLDllU
The capitals in this solution show that a box is pushed as the player moves. Usually this information is stored in a solution, too, although the solution is still correct if all letters are lowercase.
Note: Although it's common to use the letters (n)orth, (s)outh, (e)ast and (w)est in other games the letters u, d, l and r have been become a standard for Sokoban directions. The letters n and s are instead used for the additional directions in the Sokoban variations Hexoban and Trioban, and n, s, e, and w are needed for additional Octoban directions.
Some programs allow playing a level in reverse mode.
The level is displayed having all boxes at goals and the player can pull the boxes.
This way it's sometimes easier to determine the push sequence needed to solve a level at the end when forward playing (-> pushing the boxes).
Reverse solutions and snapshots must start with: [] Hence, a valid reverse solution for this level:
would be: []urLdrLdrLdrL
Note that in a reverse solution the pulls must be written with capital letters.
Since the player may be in different areas at the end of the level the start position in reverse mode is not known when reverse mode is used.
It's therefore possible for the player to "jump" to the start position before the first pull is made.
For instance in this example level:
the player starts at a goal.
Since reverse mode starts with all boxes on a goal the player would start "above" a box.
Hence, the player must "jump" to any valid start position (= a square without a wall and box).
The jump moves must be written inside the brackets. A valid reverse solution for that level with initial jump moves is: [dr]RulUrddllldLuuurLdrLdrrrDluLL
Snapshot
It's also possible to save moves of the player even if they don't constitute a solution for the level.
In this case these moves are called "snapshot".
The only differences between a solution and a snapshot is the fact that the moves of a snapshot don't result in a solved state of the level.
Level collection
Many authors publish several levels as a collection of levels. This collection is named, for instance "Sokoban Perfect". Usually all levels contained in this collection are then referred to as "the Sokoban Perfect levels".
A specific level of this level collection is specified by adding the number of the level in that collection after the collection name. For instance to refer to the 10th level of the collection "Sokoban Perfect" one can write: "Sokoban Perfect #10" or simply "Sokoban Perfect 10".
In the case the levels don't have own titles they are just numbered (1, 2, 3, ...) However, some authors also named their levels.
Level file format
There exist various file formats for storing the data of a level / level collection. The most common file extensions are: .sok, .xsb and .txt
Every file format stores the data in a different way. Some store all data in just one file and others store different data in different files (for instance the solutions may be saved in extra files for every level).
The widely used .sok-format is described here, including a detailed description of how to implement a program that can read the format.
Run length encoding
The XSB format with RLE (run-length-encoding), is more compact and efficient in mobile devices (as Palm, PocketPC, Smart Phones), besides being smaller to send for SMS. It can be used for both: levels and solutions.
In this format digits show how many elements of the same type are following.
#### becomes 4#
This level ("Claire", by Lee J Haywood):
####### #.@ # # #$* $ # # $ # # .. # # * # #######
runlength encoded looks like this:
7#|#.@-#-#|#$*-$-#|#3-$-#|#-..--#|#--*--#|7#
The rows of the level are separated by "|"s. There has been a discussion in the Yahoo Group about what character should represent an empty square in May 2006. Finally the hyphen has been elected to be the standard character for an empty square. Nevertheless, programs are encouraged to support both, hyphens and underscores.
If only two level elements are grouped together they may be run length encoded, but needn't to. Example:
$$ may keep $$ or be encoded as 2$
It's recommended to write run-length encoded boards in a single line because currently some programs may not be able to handle RLE-boards spanning multiple lines. Most of the editor programs (for instance "notepad" in Windows) have a automatic wrapping of lines so there is no need for manually creating new lines. However, when a RLE board spans multiple lines, the trailing "|" on each line may be omitted.
In the RLE format empty squares at the end of a row should be omitted.
For example, this level:
###__ <- two empty squares / spaces at the end of the row
#.###
#*$ #
# @ #
#####
Should be RLE this way:
3#|#.3#|#*$-#|#--@#|5#
Exchange of Sokoban levels in Emails
Many e-mail servers strip empty spaces and multiple spaces, too. To ensure the levels can be imported to the email recipients properly here are some suggestions:
Replace all spaces by hyphens "-" (preferred) or underscores "_". (Recipients of your mail will have to transpose them back to spaces in order to import the levels into their Sokoban programs, although, some Sokoban programs will perform this transposition automatically.)