Initial upload

This commit is contained in:
Luxferre
2024-10-08 09:25:43 +03:00
commit cb346bb218
7 changed files with 5523 additions and 0 deletions
Executable
+584
View File
@@ -0,0 +1,584 @@
#!/usr/bin/env tclsh
# BOXcl: a simple and self-contained Sokoban clone that can load any custom levelset
# Depends upon Tcllib and Tk
# Compatible with *plaintext* levels downloaded from https://www.sourcecode.se/sokoban/levels.php
# Press h or F1 to get in-game help
# Controls: WASD or arrow keys to move, u to undo, r to restart,
# Ctrl+N / Ctrl+P to switch levels in the set, Ctrl+O to open a new set, Ctrl+Q to quit
# Created by Luxferre in 2024, released into public domain
package require textutil
package require Tk
# hardcoded tile sizes
set tilew 64
set tileh 64
# check if the line contains only valid Sokoban format characters
proc islevelline {line} {
return [regexp {^[ #pPbB._*$+@-]+$} $line]
}
# convert a level data line into the internal format
proc levelconvert {datalist} {
set convdata ""
foreach dataline $datalist {
set outlist ""
foreach chr [split $dataline ""] {
switch $chr {
{#} {lappend outlist 8}
p -
@ {lappend outlist 2}
P -
+ {lappend outlist 3}
b -
$ {lappend outlist 4}
B -
* {lappend outlist 5}
. {lappend outlist 1}
" " -
"-" -
_ {lappend outlist 0}
default {}
}
}
lappend convdata $outlist
}
return $convdata
}
# load and parse a levelset file
proc loadlevels {fname} {
set fp [open $fname r]
fconfigure $fp -encoding utf-8 -translation auto
set fdata [read $fp]
close $fp
set levelblocks [::textutil::splitx $fdata {\n\n}]
set levelsettitle ""
set levelsetauthor ""
set outlevels ""
foreach lblock $levelblocks {
set leveldata ""
set leveltitle ""
foreach line [split $lblock "\n"] {
set line [string trimright $line]
if {[islevelline $line]} { # the line contains valid level characters
lappend leveldata $line
} else {
if {[regexp {^Title:(.*)$} $line _ title]} {
set leveltitle [string trim $title]
} elseif {[regexp {^Author:(.*)$} $line _ author]} {
set levelsettitle $leveltitle
set leveltitle ""
set levelsetauthor [string trim $author]
}
}
}
if {$leveldata ne ""} {
set lobj ""
dict set lobj settitle $levelsettitle
dict set lobj author $levelsetauthor
dict set lobj title $leveltitle
dict set lobj data [levelconvert $leveldata]
lappend outlevels $lobj
}
}
return $outlevels
}
# render the level state
proc renderfield {leveldata} {
global tilew tileh fieldw
global tile_0 tile_1 tile_2 tile_3 tile_4 tile_5 tile_8
.c delete anytile
set rownum 0
foreach line $leveldata {
set tiley [expr {$rownum * $tileh}]
for {set colnum 0} {$colnum < $fieldw} {incr colnum} {
set colval [lindex $line $colnum]
if {$colval eq ""} {set colval 0}
set curtile "tile_$colval"
set tilex [expr {$colnum * $tilew}]
.c create image $tilex $tiley -image $curtile -anchor nw -tag anytile
}
incr rownum
}
}
# move logic
# dir: 0 up, 1 left, 2 down, 3 right
# return 1 if won
proc domove {dir} {
global leveldata fieldw fieldh pushcount
# detect horizontal and vertical direction factors
if {$dir % 2} {
set hd [expr {$dir - 2}]
set vd 0
} else {
set vd [expr {$dir - 1}]
set hd 0
}
# find the player position into cx and cy
for {set cy 0; set outbreak 0} {($outbreak < 1) && ($cy < $fieldh)} {incr cy} {
for {set cx 0} {($outbreak < 1) && ($cx < $fieldw)} {incr cx} {
if {[lindex $leveldata $cy $cx] & 2} { # found it
set outbreak 1
incr cx -1
incr cy -1
}
}
}
# calculate the new target player position
set tx [expr {$cx + $hd}]
set ty [expr {$cy + $vd}]
# start by checking if it is within the field boundaries
if {($tx >= 0) && ($tx < $fieldw) && ($ty >= 0) && ($ty < $fieldh)} {
# get the target object value
set tov [lindex $leveldata $ty $tx]
if {$tov < 6} { # we're not pushing a wall
if {$tov & 4} { # we've hit a box
# get next-to-target positions
set ntx [expr {$tx + $hd}]
set nty [expr {$ty + $vd}]
# calculate the condition under which we can push
if {($ntx >= 0) && ($ntx < $fieldw) && ($nty >= 0) && ($nty < $fieldh)} {
set ntov [lindex $leveldata $nty $ntx]
if {$ntov < 4} { # now we can push
# remove the box from the target field
lset leveldata $ty $tx [expr {$tov & 11}]
# push the box further
lset leveldata $nty $ntx [expr {$ntov | 4}]
# increment the push counter
incr pushcount
} else {return 0}
} else { # otherwise don't perform the move
return 0
}
}
# now, remove player from the current field
lset leveldata $cy $cx [expr {[lindex $leveldata $cy $cx] & 13}]
# add player to the target field
lset leveldata $ty $tx [expr {[lindex $leveldata $ty $tx] | 2}]
# check for victory by counting boxes not on goals
set bcount 0
for {set cy 0} {$cy < $fieldh} {incr cy} {
for {set cx 0} {$cx < $fieldw} {incr cx} {
if {int([lindex $leveldata $cy $cx]) == 4} { # non-goal box
incr bcount
}
}
}
if {$bcount > 0} {return 0} else {return 1}
}
}
return 0
}
# perform a move and render it
proc rendermove {dir} {
global leveldata pushcount undobuffer
lappend undobuffer $leveldata
set res [domove $dir]
# remove the last undobuffer entry if the field is the same
if {[lindex $undobuffer end] eq $leveldata} {
set undobuffer [lreplace $undobuffer end end]
}
renderfield $leveldata
# check for victory flag
if {$res eq 1} {
tk_messageBox -title {Victory!} -type ok -message "Level complete!\nPushes: $pushcount"
nextlevel 1
}
}
# undo the last move and render the result
# Tcl 8.6 compatible (no lpop)
proc renderundo {} {
global leveldata undobuffer
if {[llength $undobuffer] > 0} {
set leveldata [lindex $undobuffer end]
set undobuffer [lreplace $undobuffer end end]
renderfield $leveldata
}
}
# start a loaded level
proc startlevel {level} {
global tilew tileh fieldw fieldh leveldata pushcount
global undobuffer
set undobuffer ""
set leveltitle [dict get $level title]
set leveldata [dict get $level data]
set settitle [dict get $level settitle]
set pushcount 0
# determine field width and field height (in tiles)
set fieldh [llength $leveldata]
set fieldw 0
foreach l $leveldata {
set lw [llength $l]
if {$lw > $fieldw} {set fieldw $lw}
}
# align level data
set idx 0
foreach l $leveldata {
set lw [llength $l]
if {$lw < $fieldw} {
set diff [expr {$fieldw - $lw}]
for {set i 0} {$i < $diff} {incr i} {
lset leveldata $idx end+1 0
}
}
incr idx
}
.c configure -width [expr {$fieldw * $tilew}] -height [expr {$fieldh * $tileh}]
wm title . "BOXcl - $settitle - $leveltitle"
renderfield $leveldata
}
# move to the next level in the set
proc nextlevel {natural} {
global sublevel levels levelcount
incr sublevel
if {$sublevel == $levelcount} {
if {$natural eq 1} {
tk_messageBox -title {All clear!} -type ok -message "Congratulations!\nYou have beaten the last level in the set!"
exit 0
} else {
set sublevel 0
startlevel [lindex $levels $sublevel]
}
} else {
startlevel [lindex $levels $sublevel]
}
}
# move to the previous level in the set
proc prevlevel {} {
global sublevel levels levelcount
incr sublevel -1
if {$sublevel == -1} {
set sublevel [expr {$levelcount - 1}]
}
startlevel [lindex $levels $sublevel]
}
# open a levelsetfile
proc openlevel {} {
set types {
{{Plain text levelset} {.txt} TEXT}
{{Sokoban YASC levelset} {.sok} TEXT}
}
return [tk_getOpenFile -filetypes $types -title {Choose a Sokoban levelset file}]
}
# define the tiles
set imgdata(wall) {
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAAAAACPAi4CAAADQ0lEQVRYw8VX23bqIBDtD9mLra1a
q9Vj6wq5nIRkBcKa//+OQ4AQGIjV+nDmpXZDdsjMZjPc3d8YdzcTzB4eTbzIeFvJeHtxQiELF1n0
U+b6mfvZ3Wy+lLH9k6ggDICTxIlUADQukBAOAH+Pu5V87sEQHMZRgNSbnpQAxEcKgE7++X63BHtn
VLAEBYSIXtNpZQjW7iC7iICqv3tD4C4g6To0O4UQgVb9+DYEX85gDpD70ylA4SM1gNCJWmsCl1xm
mHtZzGUVRIkYh0mbnuD1I7dRgwoaIIza4BoRtfy9f+wJPuGKEGzgapmA05MkeF5TKtRYlZvFk7xo
9VvybPgSvZbO/by0VQR9DkjPUARyK3DuUILTr4EgyYbSjgwCKVhWOFDEpyVIWqxX+cIiQNBLku1I
QAHLjWJBSOQsAdpDSRNZQYuQ3UjAIzlA00mHdyo5WgK5Z6HyBjlGSNMLMIuXUevNWUOmdAAN8UTe
S6OxkmyMkBZbxpkKPgrOIN05RIpSfcLifVxlqcZrp6KkjSOisJvJ241SLCh3JIqY9EQIypgnhojx
mAjBhZ5IpwnYjQQELvLEJjmTg9ATQ0SQCYK0i3liiBiJaU/cXOCJIcJL+Xt7vSf6YaQ8/EuxJ0Iz
emLBFFLnQ0KyvBZ2M1G0l4xL+ju8Z6j9U9YSSPfADljYVDuHFkKSw2goXeCJHL0uhjiWVgeeeLWp
/saVHU9soAxOgfBc4AjZWwKZdJEhUwbwkSrwzdxWQRueI3lSqaqXiNGvVTkcrnklzCFuo/Od0EE6
i3CjxNfdYLP1MEs0hdZ9SesphNPK7IWXJeo+/H6kiiLGZCJ+wACXo4khk34g9XqjIyXdrabKbyRI
Y51xiLSTBDTodVgMMaJTBM9L1Ei5Z7Lq/2OIrqw21d3YRDJ77g4BU4iS5NH3RKtT7p3h3mOj4MVg
qn0OSjXX3UwUkAIN4npEwT1PRP4RbzR9TWam0Twqs6iClupnQzGOdJjwxB/7xNNaE2x+22geDEH/
DU2k0SwDpEELeDcEq5O8HYaNJgsQ/2DZLo2tS4beFMugCmVgs84Sjpvlh+rW+6vv03wu77P4futf
edUdeLwWz9VT8ur732/v/wB3P44Wbg6kBQAAAC10RVh0U29mdHdhcmUAYnkuYmxvb2RkeS5jcnlw
dG8uaW1hZ2UuUE5HMjRFbmNvZGVyqAZ/7gAAAABJRU5ErkJggg==
}
set imgdata(boxongoal) {
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAACy0lEQVRo3sWZvW7bMBDHObWZmqKR
KAcGmjiI69RorEqWfYEQoFq7d+/SvY+QpXseoY+ixXsfoUMfIQ9wHSgpTnj8kklGt9Ew/z+Rx9Px
jrHh4Xlyl7RJm7Qcw1jSJu3Jr3c/Xl+y5w/Pw8kqUKo9+en3pz9Pg9npI8LD8bfh7cVQhue4wGVw
u8BJh8BzxhhjWcuR4yleRRAXdtWtRNIO759FlBcImdiKnKX3HDnOosovcYnnYg3umfB++f1LrLHA
mrAKgRgttCOlNP+i3wSx/xQjYIUNYTd4S4xWmhEg5xeuyMSxo5dp5QUAFLNPzQBLhIMBQDk3CVBa
ILgAALGqWoCa+AuMBpDn2mJtAmiMCLYAhTTPJ2xsAEwIdgBAHOzKFkCPYANAyTcuADoEMwAt7wig
RjABqOSdASg3AiOAbvOcASoyLugA9O47AqAhED4rAUwHeBQAhbAlAcwhbCRAYxWgV2TY8QRgRlCF
HW8ADW41COqw4xFA7WK6sOMVoCG/bvqw4xngOcKcSGbBkCEcCLCPoJcPBtBgZSUfEOAGcwv5oAC3
Vhl0QIC1JD/HWbwVqCT5y25DoviAfO5ne/4Q/BTo5YPHASoY58rTEO1boPpSegbQpRv0l9IrADjn
A+ATACwyomvL0DQCACxzwjJMTijLXyuz4tJ/VkylG7p7Qen3XlCQ2Y7+ZlT6uxmpki33uyGMAVDn
emNux+AKIE+xPrA+AC4AYSokYAsQrka0sgHwWSWjTkQdt05YEq4cuVJaulVKQ9SKN2MBQlfLe4C/
HLli8X0B0AhduV40LD5Ii7/BDea4IazANTGaG0ZWZMMi3bHkjiPH9y/Xsjk6E02rRVT5vmn16iNj
3Sa8RNsu3T1pXE7wIgrEvO8aPgw95JOhdZsFbNsKmwzN26F1yxhjb78kf6I2r/+9+Sp10I/O0t8i
KoS1dJf+ZMe96n+qpZFsvgDj+QAAAC10RVh0U29mdHdhcmUAYnkuYmxvb2RkeS5jcnlwdG8uaW1h
Z2UuUE5HMjRFbmNvZGVyqAZ/7gAAAABJRU5ErkJggg==
}
set imgdata(box) {
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAQAAAAAYLlVAAACvklEQVRo3sWZW07jMBSGs4PRPFaC
OFGFeBlRiqhGFaqAKpoEGoGRIp4isYRZQpfAEmYpWcIsgSWwhH8enKYdfHwLtonfXNX/F9vn5FyS
ZHjyWbplHetYlyHMYB3r0m36MmHJxyefhZOlUfLZgXz68v/Pp8HGyR7h/fhxeHsxleMMS6yCjwtM
e4R+F8Tmn+AqgrgYV/1OsG54/zyivEDIxa7PkvQ1Q4bzqPIrrHCGDBnS1/4A5Pev0KBEQ4wanJgt
tTOVtP5ydwji/ClGjg1aYjzhmZjdaGY4ub64iokwO3qbCi8AXLH6qRlgBf5pAK5cmwSoLBBcAGT5
tR6gIf7CRwPIaz2gMQG0RgRbAHk3b9DaAJgQ7AA4YdgbWwA9gg0AJd+6AOgQzAC0vCOAGsEEoJJ3
BmhRkgh6AN3hOQNsSL+gA9Bf3xEAlDH9UgKYDHgUAIXwSAKYXdhIgNbKQRek2/EEYEZQuR1vAC0e
NAhqt+MRQH3FdG7HK0BLft30bsczwEeEBeYGt+Md4BBBLx8MoEVtJR8Q4AmFhXxQgGcixFxbRole
AO4l+QXm8XagluQv+wOJcgdku58f3IfgVqCXD+4HKGdcKK0h2rdA9aX0DKALN+gvpVcA7hwPcJ8A
3CIiurVI7kcCcMuYsAoTE8ryt8qouPIfFVPhhi4vqPzmBRUZ7egzo8pfZqQKttxzQz4GQB3rjcmO
uSuAvMT9J+sD3AUgTIWE2wL4qhGVpGtqYlbJKIto4tYJKUOOXCmt3CqlIWrF9ViA0NXyHoC9ZcgU
m+8LgEboy/WiYfFTSjNq1ChQE6PEHTFbGGbWqoZFus2Q4cfXtWwmTDStllHld02rCfv6tt2+cTnF
RRSIxU7+fegh71u3ecC2rRjToXk7tG6TJEmOrtnfqM3rt6NrqYM+Yekf4RVCd87T39+/7VT/AZaV
3OsTnXjsAAAALXRFWHRTb2Z0d2FyZQBieS5ibG9vZGR5LmNyeXB0by5pbWFnZS5QTkcyNEVuY29k
ZXKoBn/uAAAAAElFTkSuQmCC
}
set imgdata(player) {
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1
OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv
IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS
ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD
cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0
YW5jZUlEPSJ4bXAuaWlkOjJCQzQyNTY5RTI1NTExRTZCNUJFOEM2QkJDQzA1OUQ1IiB4bXBNTTpE
b2N1bWVudElEPSJ4bXAuZGlkOjJCQzcyN0ZCRTI1NTExRTZCNUJFOEM2QkJDQzA1OUQ1Ij4gPHht
cE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MkJDNDI1NjdFMjU1MTFF
NkI1QkU4QzZCQkNDMDU5RDUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MkJDNDI1NjhFMjU1
MTFFNkI1QkU4QzZCQkNDMDU5RDUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94
OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6SouJPAAAGb0lEQVR42u1ba08cVRjmH/gT/GrV
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
}
set imgdata(floor) {
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1
OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv
IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS
ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD
cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0
YW5jZUlEPSJ4bXAuaWlkOjJCRThGOUE2RTI1NTExRTZCNUJFOEM2QkJDQzA1OUQ1IiB4bXBNTTpE
b2N1bWVudElEPSJ4bXAuZGlkOjJCRThGOUE3RTI1NTExRTZCNUJFOEM2QkJDQzA1OUQ1Ij4gPHht
cE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MkJFOEY5QTRFMjU1MTFF
NkI1QkU4QzZCQkNDMDU5RDUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MkJFOEY5QTVFMjU1
MTFFNkI1QkU4QzZCQkNDMDU5RDUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94
OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4wOW0fAAAE4UlEQVRo3rVa2XbbQAjlp2MnttOm
y2NtWfKapenpnxZ5YoJnYYBRz6F9yLEkLgOXbeDu1ybI6nD6+f43lW8vv+/WXfjNfLN9PJynkoft
jr6+6PfKp5a7Iz2FAvhvttmillntg3x/fScMq/1pKgCz6zsRienBxbBnANadrP3nObg+VjTkcAgv
RBgOo8w3/QcAjfZB0McmPAT0xvC2+25wPE6HAErtg9xvh0kiAT2efMB3pOEA0fo2AGMwfJitb3ce
ciHHS1CBxXBAlWwAUIgEHvpdu/a+VwUdnp7fPAAoEkzcF2mPxsPPfzk9B59EQZ2UL1ntjoG+8PGm
E7CGIIVd+DAJIkEmVHIR/obIF8F7AMyu7MEw9Pqo/Xp+LeWZEYN4Dqg9sSe9DfBhvfaLnAdfeKkX
7EcZN7J9fA6XgC750kX72HYIG+Zd36i9nI/wfORShQThleKBe04kEEJKfvWPtz9IFIL2nE8IBid7
dDyTjTg9LK9Ri//j35EJgmD4fQAIoAXtU7+3ivKcOcWhuugzcr2ExoKIldLwIu1HBx0OAp3LEmjb
yhDVRAHcwx6PZ7T3jVMSZyV0yT1E6V0mglZmG4gZat0hv1J+kQ3AC3qNCMHGnef2kUquhGqkyzky
ImYfBjx5h+1jAFkM1US7Kpx7iBk8oiCcwiMMLdrHAFIMFLVyYZjJCcm5ERsGn8QkilJiZ32VBXK9
UXXBqMELlUUpK3MMkptZakSQHUNTrHMA1W8LOdXXoEG19JXfuGRQNf5WrGq8Uw/QtK0lIiLbVwtJ
JQalCbQAKFVlCzVKAlbtS77k6y1B2f5xLfHvc1ZfuIcUEQX7ZgWgp5fwDW62Fu2zNpoYQErwpiSt
HTCyVOBwRVCOINtHCRq2wMJkGgBVtvYdt8ZY1kkH+Eo03zxQWRSaPBMcrj/hiLdUmesxQKL9oKmK
p3WhbGuhDGhwN1mTUFClpFVwNFRtHzXXjXnH1FQIY6IYQMnveTmN74oOeiomnYtTDxkDpPM6mdHQ
Wvx7jvLLwRlCWwIlvpd5hvytsZpIjxTbtKfnN5SxzWe65a25P4G7LqcSAH/swxD1k9gr86EODa5v
QuJ64PjFAB70U06h3nYsbCLGK01c+JK3OBtt6SrIiiYMqe0rC9IyBmivEYgDNGUMnm0UtdXRsowh
BuDwZv3KcZVMJTTayxigvUTLjFVyzJ2m+eq0tLRsLwLwlWhZIufMjapnyHrdmZZDpQEwWLdd+tGi
e9CrWVQXY8Baos29u4/qxqkkChpVY1DunfIt0WVJapWwC6wAUGJYep3HtLPJXtaoA6iOddu1d8Qx
/+hssx3BrDsQlqel7W+15TdhiOofzQrn8Ximv4OwYsi2FLL2mEloDaqMELRlFQPXMFpGQrRkLqjV
hwVtOqurZnENTc27XsDAdUtXqZD9nVXkAlbTspTu7XG/zy6CQbMqrNhPvChh2Gcmt/d4fJbyBsgs
W6dzdfJWjjzGywqH02j420grcW4TAGvpYd2NmwGYXMh3bc6Noe5CpiBu6eU1MZ0VKYitFNS416hy
6811m+FAmSdPo9a6oH0WhPhNe2KuIU/DI4CF8eLMVIP1Uk4sWYe3o7yXgLTKxWOi0VJ6gWc13Uw3
LUmWtUt/n49cbtWMxVzEwVFK5/fW/+v1e+W1htT3/gHO9EIyge+NWAAAAABJRU5ErkJggg==
}
set imgdata(goal) {
iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAIAAAAlC+aJAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
bWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdp
bj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6
eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1
OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJo
dHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlw
dGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAv
IiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RS
ZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpD
cmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0
YW5jZUlEPSJ4bXAuaWlkOjJCRkVFQTNFRTI1NTExRTZCNUJFOEM2QkJDQzA1OUQ1IiB4bXBNTTpE
b2N1bWVudElEPSJ4bXAuZGlkOjJCRkVFQTNGRTI1NTExRTZCNUJFOEM2QkJDQzA1OUQ1Ij4gPHht
cE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MkJGRUVBM0NFMjU1MTFF
NkI1QkU4QzZCQkNDMDU5RDUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MkJGRUVBM0RFMjU1
MTFFNkI1QkU4QzZCQkNDMDU5RDUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94
OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6L30xAAAAFYUlEQVRo3s1a224jNwzVtxbFAkWL
olsgmcRxNnHcXBatPbbja2zHm2Tb7+yZ0ObKunA4mrF3ASYvHkk8FEUeUjIn//RJ2pPZX88vvnSe
1ie9nL7J+oPLybwpOR888uqt4Vg56uJxyqMgBn+n/QG0DGpPcrN8Zgzt8awpAKe7OYGk0sDWaGwB
6OWy9t/2IWmxqCFHE5oQMBKMkvWHWwAa7UngYw1uAryRZjvLRwnDeRNMTN27L2/3r19JPn/9Tyma
tfWz3X15hdxuCh/+NF34GwjrBwDcvbzp1zgoAEe6qw1PcpYPW6MJtDUx7a/mT3/cPfx6fQP56SRT
isb19bPR6lADymwxrDcciK4XKxfA7eaVvsMY/TJ6ALTvaTNDpa1lZ08Uvj7NFi6A+5fC3XE+0taQ
AfCxS54cM0C9znIbD88GIxfAw9u/+OKXy6vGASBP0apX82Xy5FCsONkvb5wEMJvBAWcAtEf2GHwE
h+MPWrvg7QiishBbOePSpgcFDk05AcvZme7j/WdbH9Lw29K93GT5UABgrxHTXs5HCBcyVWEBPPrS
xgCRABCVoHgkAED8Oh8+Ctqz4DOGwW5DbEWTK9lGNjXyASAYQJABtwDYT4IAoP3pLmsmi73PmmRP
W4psjf8+AMYGY5n245Sjkg8AJ4S1Lxx0NHGYjF4obMsStJQAAGIIB2EIHOIdYfQZi+0hSu+StXd4
cgUAhAGRJBiFaO1SQq8RPmyy8+wPGasAEIZYGNXQ2joYLqfz8MfvR1kLgGmWPaCU67Yj+05nBltE
klnO7WCQta8LgE+tIBzp93KCt28Xu2hBPokkColFZzmMVgAAF6xU4L0f92hWtjFIbrZfH9cCgPUq
ASitzTnixcR32loASks+jn12lijFkEUyY7DrUReAEIjY9kGnT8AQNEEDAIJEjZNAVe1jvhRz1wYA
OFrCTpnFL5KbFE4IjnXNKgCQwwutYZutjvY+p9IEDF9MpQDvumx1zwnwESsVJLiiUbYgg+SsqR4j
OySISTMASqN12nZrjKXv8koASilaWj9QSQoreaZJcP0GW7wxZq7HYDztRxpW3KwLBUsL5YE2yUVW
IyGohNIqYrQptT0X1xre0khGs5cuNZOR/d6m05jL2eimImkmdj1kDIaqYQ0vZ2vZ6ykZaJ106djR
BRCL93KcYX+rySb8LUWZdr1YQYoy39ItbM3xzNjjfTKnoQDYkDQMTj2JWrm72rgN00hjCysS+HQA
dtSCG1S+5NqPeLGOS+dpXd4bTQZgW7ESBt/2QsPrsABsFqChMdh659TK2h8DgO0M8tFve12JUu2P
AsBvq4Qit5/mS7ulRwIQDOR25IbqgWDdy+3Loe8GoF1W9yQ0eo8KIEu9+yi9cToGAOW9U7gker8k
/Z4ALlKdp9KdzaEA1Ndef46DAE77A+xhcc1qX576AIIkp7Tkr4TB4T8aAJfTOf9q7CuGYHfaoeOy
9mCpdAcKUZ4Q2FLG4AOwfzX2JXOstVi8bRmOoZPfq9sLLKHt0oSpLB8KGFQACAP9/HN2zgN+63SV
Nb7AqDUlS+zd3p8Pf7MyUEwCULxWeX+c9Xv3tvHHHnbhkjw5FIN6UDIKgF47IcUc5LnNsO5zGyhG
r1WiAG5Wm4M+eCIMNR88OT5mnNvm68WSvsPB+tBqNwuAMFSdE2pAme0zwH3zu4eYtrizXP+Yj/5u
N4EYZRztmQzfrJ5/HADd9YYiuP9kygivLKKdptq9IMRc/T2xw1zsNFwAaFV8ONNUYz2WE2PWsctR
u5YwPsvFNnFryX/A026up+tTErmLuMdievmWzDlFqpPS7XfrB31+L/cPBd/7HwDmw8MEUb41AAAA
AElFTkSuQmCC
}
# load the tiles
# load the player tile separately
image create photo tile_player -data $imgdata(player)
# floor is coded as 0
image create photo tile_0 -data $imgdata(floor)
# goal is coded as 1
image create photo tile_1 -data $imgdata(goal)
# player on the floor is coded as 2
image create photo tile_2
tile_2 copy tile_0
tile_2 copy tile_player
# player on the goal is coded as 3
image create photo tile_3
tile_3 copy tile_1
tile_3 copy tile_player
# box is coded as 4
image create photo tile_box -data $imgdata(box)
image create photo tile_4
tile_4 copy tile_0
tile_4 copy tile_box
# box on goal is coded as 5
image create photo tile_goalbox -data $imgdata(boxongoal)
image create photo tile_5
tile_5 copy tile_1
tile_5 copy tile_goalbox
# wall is coded as 8
image create photo tile_8 -data $imgdata(wall)
# create the UI and canvas
canvas .c
grid .c -column 0 -row 0
grid rowconfigure . 0 -weight 1
grid columnconfigure . 0 -weight 1
wm title . "BOXcl"
# define the help message
set helpmsg {Welcome to BOXcl!
Controls:
Move: WASD or arrow keys
Undo: u
Restart: r
Open a levelset: Ctrl+O
Next level in the set: Ctrl+N
Previous level in the set: Ctrl+P
Quit: Ctrl+Q
This help: h or F1
You can also pass the levelset as the command line parameter to the boxcl.tcl script.
Created by Luxferre in 2024
Released into public domain
}
# entry point
set levelsetfile ""
if {$argc > 0} { # get the level set file name
set levelsetfile [lindex $argv 0]
} else { # open the file dialog
set levelsetfile [openlevel]
}
set sublevel 0
if {$argc > 1} { # get the optional level number
set sublevel [expr {int([lindex $argv 1]) - 1}]
if {$sublevel < 0} {
puts "Invalid level number!"
exit 1
}
}
if {$levelsetfile eq ""} {
tk_messageBox -type ok -title "Missing levelset" -icon error -message "Please open a levelset file to start the game!"
exit 1
}
set levels [loadlevels $levelsetfile]
set levelcount [llength $levels]
startlevel [lindex $levels $sublevel]
# bind keys to move logic
bind . <Key> {
switch "%K" {
r {startlevel [lindex $levels $sublevel]}
u -
BackSpace {renderundo}
w -
Up {rendermove 0}
a -
Left {rendermove 1}
s -
Down {rendermove 2}
d -
Right {rendermove 3}
h -
F1 {
tk_messageBox -type ok -icon question -title "BOXcl help" -message $helpmsg
}
}
}
bind . <Control-n> {nextlevel 0}
bind . <Control-p> {prevlevel}
bind . <Control-o> {
set levelsetfile [openlevel]
if {$levelsetfile ne ""} {
set sublevel 0
set levels [loadlevels $levelsetfile]
set levelcount [llength $levels]
startlevel [lindex $levels $sublevel]
}
}
bind . <Control-q> {exit}
+501
View File
@@ -0,0 +1,501 @@
Title: Easy 5 Boxes
Description: Puzzles made only with 5 boxes, with situations that we find in the daily life
of the sokoban. My intention is only to contribute.
Author: Jorge Gloria
Email: jhogloria@hotmail.com
####
### # #
#.###$ #
# $ $ #
# ..$ .#
# #+$ #
#### ##
####
Title: #01
#######
# # #
# # .##
# $$ #
##$* * #
# @# ##
# .. #
#######
Title: #02
#######
# . ##
# .$$* #
## $@#
# * ####
# #
#.## #
########
Title: #03
########
#. # #
# #$ #
#.$@*#.#
# #$$ #
# # ##
# .##
######
Title: #04
####
## ####
#. . $@#
#$.#$###
# $ $ #
# .. #
# ###
######
Title: #05
######
## #
# $ # #
## * # #
# ..$.#
# . $$ #
#### @##
####
Title: #06
#####
# . #
#$*@###
# $$ #
#..$ #
# . #
#######
Title: #07
#######
# .. #
# #$$ #
# $ .#
# . *$#
# # @#
#######
Title: #08
#####
## @ ##
#.$*$ #
# $.#
##$. #
# . #
######
Title: #09
#######
#. #
# $$ #
#...$##
# $* #
##@ ##
####
Title: #10
#######
# $ .#
#+*$# #
## #
# $* #
# .##
######
Title: #11
#######
# .$ .#
# $##
# $ #
#$#$# #
#. @..#
#######
Title: #12
#######
# . .#
# $$ #
###$ #
# *$#
# .@. #
#######
Title: #13
######
# ###
# .#$ #
# $ #
##.#$ ##
## #@##
# .$$#
# #
#.. #
######
Title: #14
####
# ####
##$... #
# # $###
# $## $. #
# @#
## $.####
######
Title: #15
##########
#. . #
# $#$#$# #
## . # #
### $ . ##
#@$. ##
########
Title: #16
#####
# #
####$# ###
# $ #
#..*# * #
#. @$ ###
# # ##
#######
Title: #17
######
#.#. ###
#.# #
# . # #
# #$ #
## $##
##$ #
##@$$##
#. #
######
Title: #18
#####
# #
##### $ #
## $ #
# *$ $ ##
#..@## #
#..######
####
Title: #19
#######
# #@ ####
# $$$ #
# .$ #
# ### *##
#### # ..#
##. #
####
Title: #20
#####
# ######
# ...*@$ #
# $$. $# #
### #
#### ##
####
Title: #21
#####
### #
# #
# $$###
## . #
#$. ##
# .$ #
# *# #
##. @#
#####
Title: #22
#####
###### #
# $ $ #
# ..*# ##
# #*. $ #
# #@ #
##########
Title: #23
#####
# #
#.# #
#. ###
#.# $ #
#.*$ #
# $ #
###@$##
# #
####
Title: #24
###
#####@#
# # $####
# $ #
# ### $ #
# # $ ###
#. .$ #
#...# #
########
Title: #25
####
# ####
# $ #
## #$ #
# $ #@.#
# $ *.#
# ##..#
########
Title: #26
########
# # #
# $ #
# ##$ #
# .*. ##
# $@* #
####. #
####
Title: #27
####
# @#####
##$$ #
# $*.. #
# #$. #
# ## . #
#########
Title: #28
#####
# . #
##$*@#
# ..$##
## #. #
# $$ #
# ##
#######
Title: #29
#####
### #
# $ #
# @$ ##
# $$####
## . $ #
# ....#
#######
Title: #30
########
# # #
#$ $$ ##
# $ #
#..#$# @#
#... ####
######
Title: #31
#####
# @###
# $ #
# $$ #
### $ #
#...$##
##. #
#. ##
####
Title: #32
#######
# $ + #
## .*. ##
# $#*$ #
# #
## #####
####
Title: #33
####
# ###
# ##
# $$$@#
## #$#
# .*.#
# .#.#
# ###
####
Title: #34
####
# ##
# #####
# $ $ #
## **+.#
# . $ #
########
Title: #35
#########
# @# #
#.**.. #
# ## ##
# $$$ #
### #
######
Title: #36
#########
#. * $ #
#...# #
#$$ ##
# # $ #
# # @##
#######
Title: #37
####
# #
### ##
#@$ $ #
# $ #
##.## #
#..* #
# . $ #
#######
Title: #38
########
#. # #
#.# # #
## . $ #
# $$ $*#
# . ## @#
#########
Title: #39
####
# @#
######$$#
# $ #
# ..$$ .#
#..## #
#########
Title: #40
#####
#@ #
# $$##
## . ##
# ** #
# $ #
### ..#
# #
#####
Title: #41
####
# ###
# $@#
# *..#
##$.#.#
# $ $ #
# ##
# ###
####
Title: #42
########
# * #
# #$# #
#+$ ###
##$. . #
# * #
########
Title: #43
####
##@ ##
### *$.##
# $ $. #
# .# #
# * #
#########
Title: #44
#######
#. $.#
# $ #
# # #
#$ $#$#
#+. .#
#######
Title: #45
####
# #
###### .#
#.#@ #$.#
# $$$..#
# $ #
# # ###
#######
Title: #46
#####
## #
# .$.#
# .###
###$ $ ##
# $$. #
# # .@#
#########
Title: #47
#######
#. ###
## ##$ .#
# $ #
# ##$ #
###### .#
# $*#
# ##@.#
#########
Title: #48
#########
# ## #
# $ #
# #### #
# $## . #
#.$ ... #
# $$## ##
### @#
#######
Title: #49
####
#@ #
####$*#
### $ #
# $ $ #
# ## #
#.# ... #
#########
Title: #50
+430
View File
@@ -0,0 +1,430 @@
Title: Micro Cosmos
Description: The 17 first levels were published on Visual Sokoban in 1999. During the year
2000, some web sites accepted to publish the 20 first levels. Finally, I stopped
at 40 levels. This set contains 5 levels "3boxes", 26 levels "4boxes", 6 levels
"5boxes" and 3 levels "6boxes".
Author: Aymeric du Peloux
Email: aymeric.du-peloux@gadz.org
Website: http://membres.lycos.fr/nabokos
#### ####
# ### #
# $ * $ #
# + #
### .$###
# . #
#####
Title: MICROCOSMOS 01
#################
# # # # # #
#.$ # #.$ #
# #.$ .$ # #
# @# # # # #
#################
Title: MICROCOSMOS 02
####
#### #
# $ ##
# #$# #
# $ #
#.### #
#.#### #
#. @ #
########
Title: MICROCOSMOS 03
####
####### .#
# $ $ $$ #
# @ ...#
### ####
#####
Title: MICROCOSMOS 04
####
##### #
# $ $ #
#.# #. #
# $@$ ##
##.# #.##
# * * #
# # #
#########
Title: MICROCOSMOS 05
#####
# #
# # ##
## * ##
# $*$ #
# * # #
## . +#
#######
Title: MICROCOSMOS 06
#####
# #
# #$##
## @ #
# .#$ #
# . ##
# .#$#
## #
#####
Title: MICROCOSMOS 07
####
### ###
# . #
# $ $ #
##.#+#.#
# $ $ #
### ##
####
Title: MICROCOSMOS 08
####
##### #
# $ $#
# .#. #
## ### ##
# .#. #
#$ @ $ #
# #####
####
Title: MICROCOSMOS 09
#####
## #
# #.##
# $$. #
## @ #
# #. #
# $ ##
# ###
# #
# #
# #
####
Title: MICROCOSMOS 10
#####
#+ ###
##*# $ #
# * #
## * # ##
# * #
# ####
#####
Title: MICROCOSMOS 11
######
# ##
# * #
# $*$ #
## * ##
# * #
# . #
##+##
###
Title: MICROCOSMOS 12
#####
## ###
# ...* #
# #@$# #
# $ #
### #$##
# #
#####
Title: MICROCOSMOS 13
#####
# #
#.#$##
# #
#.#$ #
# ##
#.#$#
## #
# .#$#
# @ #
# ###
####
Title: MICROCOSMOS 14
####
### #
# ##
# # ###
## . . .#
##$##.#$##
# $ @ $ #
# ## #
##########
Title: MICROCOSMOS 15
####
# #####
# $ #
#$# # #
## + ##
# #.#$#
# $. #
### . ##
#####
Title: MICROCOSMOS 16
#### ####
# ### #
# $ $ #
# $#.## #
## . ##
# .@.#$ #
## # #
# ####
#####
Title: MICROCOSMOS 17
#######
## # #
# * * #
## # #
# *#+ ##
# $#
##### #
####
Title: MICROCOSMOS 18
#######
# # #
#$ + $#
# .#. #
##$.#.$##
# $ . $ #
# # #
#########
Title: MICROCOSMOS 19
#####
##### ##
# #$# #
# $.@# #
## ##.. #
# #. ###
# $ $ #
# #####
####
Title: MICROCOSMOS 20
#####
# ###
###*# $ #
# $ @ # #
# # .. #
# . #$###
##$. #
# ###
####
Title: MICROCOSMOS 21
####
##### #
# $ #
## #.##$#
# # @. #
# .$ # ##
## ##.# #
# $ #
# ######
####
Title: MICROCOSMOS 22
#####
# ###
#.#$ #
# @$* #
# $ #
##.#.##
# #
#####
Title: MICROCOSMOS 23
#####
##### #
# $ . # #
# # $$ #
## ## # ##
# $.$. #
# ## ##
# .@.##
#######
Title: MICROCOSMOS 24
####
#### #
#.. #
### $@# ##
# $ #.. #
# $ $ #
#### ####
####
Title: MICROCOSMOS 25
########
# # #
# $. #
###$## #
# $.## ##
## .* #
# #$# #
# .@ #####
## #
#####
Title: MICROCOSMOS 26
#####
# ###
## #$ @#
# . $ #
#...#$##
# # $ #
# # #
## ###
#####
Title: MICROCOSMOS 27
####
## #
## . #
#### $ #
# $ $.@##
# . ##
#######
Title: MICROCOSMOS 28
####
### #
## @$ #
# .$ #
# .* ##
# .$ #
## ##
####
Title: MICROCOSMOS 29
######
# .#
# . @#
# # ###
# # $ ##
# *. ##
#### $$ ##
## #
## #
#####
Title: MICROCOSMOS 30
#####
### #
# *# ##
# # * #
# * # #
## #+ #
# $##
### #
####
Title: MICROCOSMOS 31
#####
# #
###*# ##
# * #
# # # #
# * + #
## #$##
## #
#####
Title: MICROCOSMOS 32
####
###.@###
# #
# *..# #
## #$$ #
# ##
##$# #
# #
#####
Title: MICROCOSMOS 33
#########
# ## #
## * # #
# .$#*@ #
# * ##
#########
Title: MICROCOSMOS 34
########
# * #
# +*** #
## $ #
## ##
## #
####
Title: MICROCOSMOS 35
####
# #
##.@#
# .$#####
# $$ $ #
# .. #
#### ###
####
Title: MICROCOSMOS 36
####
###### #
# $ $ #
# # .# ##
# . #.@ #
##$# * #
# #####
#####
Title: MICROCOSMOS 37
#####
## ###
# #
#*#*#* #
# #@$ ##
## # #.#
# #
# # #
########
Title: MICROCOSMOS 38
#####
### ##
# $$.. #
# .@# #
## # #
# $* ##
### #
####
Title: MICROCOSMOS 39
#####
### ##
# $# #
# .@.$##
##.# # #
# $ #
## ####
####
Title: MICROCOSMOS 40
+439
View File
@@ -0,0 +1,439 @@
Title: Nabo Cosmos
Description: This set was published progressively on the site of Paul Voyer, Gerald Holler
and Frantisek Pokorny. I wanted this set more difficult than Microcosmos, but
still with small levels. And why Nabokosmos ? Read backwards "Som(e)sokoban";-)
This set contains 2 levels "3boxes", 8 levels "4boxes", 21 levels "5boxes", 7
levels "6boxes" and 2 levels "7boxes".
Author: Aymeric du Peloux
Email: aymeric.du-peloux@gadz.org
Website: http://membres.lycos.fr/nabokos
#####
# ##
## * .##
# $$* #
# * . #
## @ ###
#####
Title: NABOKOSMOS 01
####
### ###
# *$ #
# # # #
# ** #
### #@#
# ** #
# # #
# *. #
# ###
####
Title: NABOKOSMOS 02
######
# #
# ##$###
# . * #
## * +#
# $ #
# #*###
# #
#####
Title: NABOKOSMOS 03
#########
# .@.$. #
# # $ #
# ##$####
# $ ##
### . ##
### #
## #
#####
Title: NABOKOSMOS 04
####
### #
# #
### # #
# *$ **##
# # +# #
# # #
## ###
######
Title: NABOKOSMOS 05
######
### #
# *##.#
# #. .#
# $ $ #
##$#$#@#
# .#
#######
Title: NABOKOSMOS 06
####
# ###
# *$ #
# # #
## ** #
# #@#
# ** #
# # #
## *. #
# ###
####
Title: NABOKOSMOS 07
####
### #
# .* ##
# # #
#@** #
# # #
# $* ##
### #
####
Title: NABOKOSMOS 08
####
### ####
# $ #
# . *# #
###.@#$##
# . *# #
# $ #
###### #
####
Title: NABOKOSMOS 09
####
# ######
# #
## # #.$ #
# * ## ##
# ** # @#
### * #
#### #
####
Title: NABOKOSMOS 10
#####
#### #
# #
# ##.##
## #@ #
#..$ #
## #$###
# $ #
# # #
# ###
#####
Title: NABOKOSMOS 11
#####
### #
# # ##
# **+ #
## * $*##
# # # #
# #
### ###
####
Title: NABOKOSMOS 12
#### ####
# #### #
# #
# #### #
##@##. $##
# #.$* #
# ##
# # ##
#######
Title: NABOKOSMOS 13
#######
## # ##
# .$*$. #
# # #
## * ##
#@ * #
#######
Title: NABOKOSMOS 14
#######
## # ##
# **$. #
# # #
## * ##
# * @#
#######
Title: NABOKOSMOS 15
####
# #
#. ##
#$@ #
## * #
# * #
# * #
## * #
# ##
####
Title: NABOKOSMOS 16
######
# @ ##
## # #
# .*.*.#
# $ $ #
#####$ #
# #
####
Title: NABOKOSMOS 17
#######
## @ ##
# ### #
# # . # #
# #$. $ #
# $ ###
###$. #
# . #
#####
Title: NABOKOSMOS 18
#####
#+ .###
# #
## $ #
###$####
## $ #
# . * #
# # #
########
Title: NABOKOSMOS 19
#####
# #
##*# #####
# * $ * #
# . @ #
### #*###
## #
#####
Title: NABOKOSMOS 20
#####
## #
## #.##
# @ $ #
# * * ###
##*#*# #
# #
## #####
####
Title: NABOKOSMOS 21
#####
# #####
# # $ ##
#.$.$..@ #
#### #$ #
# ###
#####
Title: NABOKOSMOS 22
####
### @##
## * ##
# ##* #
# * #
## #$# #
# . #
# #####
####
Title: NABOKOSMOS 23
#####
# ####
# $ #
## ##* ##
# #.. #
# $$ #
# #@.###
#######
Title: NABOKOSMOS 24
##### ####
# # # #
# $###@ #
## $ $ #
# ....$ #
## # ##
#######
Title: NABOKOSMOS 25
#####
##### #
# #
# ..# ##
##$# * #
# +#* #
#$ $ ##
# ####
####
Title: NABOKOSMOS 26
#######
# # ###
#$ $ #
# .#** #
## #@ # ##
# ..#. #
# $ $ #
###### #
####
Title: NABOKOSMOS 27
####
# #####
# #
# * * #
##$# # ##
# . *#* #
# #
####@ ###
####
Title: NABOKOSMOS 28
####
# @##
## . ###
# $$$. #
#..$.# #
# $ $ #
## . ##
######
Title: NABOKOSMOS 29
#######
# #
# .$. #
##$. $##
# * #
# $.$##
##@. #
#####
Title: NABOKOSMOS 30
#####
# ##
##* ..##
# # #
# * #
# * # ##
## $$#
### @#
####
Title: NABOKOSMOS 31
#######
## # #
## $$ #
# #.# #
# .+. ##
# #.#$##
## $ $ #
#### #
#####
Title: NABOKOSMOS 32
#####
# ###
# #
## #. ###
#@***$* #
# #
# # ###
#######
Title: NABOKOSMOS 33
####
## ###
## .. #
# * #
# $$ ###
## *.#
# $ #
# * #
# @##
####
Title: NABOKOSMOS 34
#####
### #
## #@##
# . *$. #
# # $ #
# #$#$###
# .. #
#######
Title: NABOKOSMOS 35
####
#### #
# . * #
#@# * #
# * ##
##$** #
# #
### ##
####
Title: NABOKOSMOS 36
####
# ####
# * ##
## # $.##
# #$.# #
# $ $@ #
# #..# #
##########
Title: NABOKOSMOS 37
#####
# #
### . ##
# *$* ##
# # * * #
# * @#
### ####
####
Title: NABOKOSMOS 38
####
# #
#* #
### ###
# .* #
# #$ # #
# @** #
## ###
# ##
####
Title: NABOKOSMOS 39
#####
### #
## #
# *** ##
# *@ #
# .*$##
## #
## #
####
Title: NABOKOSMOS 40
+487
View File
@@ -0,0 +1,487 @@
Title: Novoban
Description: This collection of 50 levels is intended for beginners. The difficulty of the
levels is increasing. The collection ends with some medium levels. I submitted
these problems to my 10 and 14 year old nephews who completed all in one day
(which is not bad at all for complete beginners). However, if you are an expert,
solving the whole collection in less than 45 minutes is quite a challenge.
Author: François Marques
Email: sokoban@online.fr
Website: http://sokoban.online.fr
####
# ###
# $@#
# *. #
## #
#####
Title: Be ban 10
####
# #
# ###
# $ #
##*#.#
# @ #
# #
# ###
####
Title: Be ban 9
####
# #
# #
# @###
# $$ #
#. .#
######
Title: Be ban 7
#####
# #
#.#$##
# @ #
#. $ #
### #
####
Title: Be ban 1
####
### #
#.$$.#
# # #
# @ #
### #
####
Title: Be ban 5
####
### #
# #
# .###
### #@.#
# $$ #
# $ #
#. ###
####
Title: Try ban 5
#####
##...##
# $$$.#
# $+$ #
#.$$$ #
##.. #
######
Title: Surrounded
######
## #
# $## ##
# #
## .@.#
#$# ###
# #
#####
Title: Be ban 3
####
## ####
# #
# ..#$ #
### $ #
###@ #
####
Title: The gun
#####
# #
##### # ##
# # $ #
# $ # #
# .. # #
###@ #####
# #
####
Title: Be ban 2
#####
# ###
###@$. #
# *# #
# $. ##
##### #
####
Title: Try ban 11
####
# ####
# . #
# @$$ #
## ###
#. #
# #
####
Title: Be ban 14
#####
## .#
# $#.#
# ##
## # #
#$ @ #
# ##
#####
Title: Be Ban 04
#####
# #
#### #
#.* ##
# $# #
#@ # #
#######
Title: The dog
####
#.@#
# ###
# $ #
# $. #
# ###
####
Title: Be ban 6
####
# #
# #
#### ####
# # $@ #
# $$.#
### ### #
## .#####
# #
#. #
#####
Title: Try ban 7
#
###
## @ ##
# . * . #
# $.$*$.$ #
# ## ## #
# #
###########
Title: The house
#######
# .#
# ###.#
## # #
# # $ #
# @ $##
# # #
#######
Title: Be ban 11
####
### ####
# #@.#
# $$.#
# ## $.#
##### #
#####
Title: Try ban 6
#####
# @ ###
# # #
##$.*# #
# $.* #
# # ###
# #
######
Title: For ban 21
##
# #
#$@#
#.$##
##.$ ##
# .# ##
# #
##### #
#####
Title: The finger
####
# ###
# @ #
#. #$##
##.$ #
# $.# #
# # #
# ##
### #
####
Title: Try ban 1
#######
## # ###
# $ # $ #
# .@. #
##$ # $###
# . . #
#######
Title: For ban 9
####
# #####
# .*. #
# $ $ @#
# ####
#####
Title: Try ban 17
#######
#. . .#
# # #
## $ #
# $$##
# @#
#####
Title: Try ban 19
####
# ##
## ##
# @$$ #
# # # #
#.. #
#######
Title: Be ban 8
####
# .#
### ##
# $$ #
# #
##$# ##
#.@.#
#####
Title: Try ban 20
#####
# #
###$# ##
# $@$ #
# # #
#... ###
######
Title: Try ban 21
######
# #
# .$#####
##*+$ #
# .$# #
## #####
####
Title: For ban 4
#######
## . #
# $*$# #
# #@ #
# . ###
######
Title: Try ban 22
#######
##....@##
# $ #$ #
# $ $ #
# ## #
#########
Title: For ban 8
####
#### @#
# $$ #
# . $ #
##.. ##
#####
Title: Try ban 10
########
# .@. #
# $ $ #
##*#*###
# #
# #
# ####
####
Title: For ban 35
#######
# . #
# $..#
###$*###
# $@ #
# #
########
Title: For ban 18
####
### #
# ##
# # ..#
# $$$@#
### # #
# .#
#####
Title: Try ban 14
#####
### #
# $$$@#
#... ##
# #
######
Title: Try ban 16
#####
## #
# @ #
## $ ##
# $* #
# #. #
# .##
#####
Title: Try ban 18
####
# #
###$ ##
# $ #
#@#*. ##
# *. #
### #
######
Title: For ban 26
#####
###@ #
#. $ .#
# $ ##
### ###
## $ #
# #
#. ###
#####
Title: Try ban 8
####
# ##
#@. #
#..$##
# $$ #
# #
######
Title: Try ban 15
####
# ###
### . #
#@$$$ #
# #. #
###. ##
#####
Title: Try ban 23
####
# #
# ####
# ..* #
## $$@ #
# ####
# #
#####
Title: Try ban 28
#####
# ###
# .$ ###
## .# $ #
# .# $@#
##. $ #
# ####
####
Title: For ban 10
####
# #####
# @ ##
# .*.$* #
## #$ #
## ###
#####
Title: The plane
####
##### #
# ..$##
# $@# $ #
##$.. #
# ## #
########
Title: For ban 6
#####
# #
# #$##
##..@ #
# *.$ #
# # $##
# #
######
Title: For ban 17
###
#.#####
#... #
# # # ###
# $$ @#
### $$ #
### #
#####
Title: For ban 27
########
# ## .#
## $ #
# $#$ .#
# #@ ##
#. ## #
########
Title: Try ban 4
#####
# #
## ###
# $$$$ #
# .... #
## @ ###
#####
Title: For ban 37
########
#.. @..#
# $$$ #
#### ####
# #
# $ #
# ######
####
Title: For ban 5
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff