Записване на решенията

Решенията се записват във файл с данни за играча. Този файл има разширение .sokoinfo.

Главната причина поради която се записват е за да не се налага да играем ниво което вече сме решавали. В интернет има много нива (аз лично знам за повече от 10000) и има много колекции от нива, някой от тях съдържащи нива от други колекции.

С тази си възможност (да записва решенията) YSokoban предоставя информация дали текущото ниво е било решавано и ако да, то даже пази решението и неговите броячи (брой ходове, бутания, ...) се показват в долния десен ъгъл на прозореца на програмата. Ако има записани повече от едно решения, то тогава в долния десен ъгъл може да се види списък с тях и да се избере конкретно решение (за преиграване например).

YSokoban има собствена вътрешна база данни за да пази решенията на нивата. Ако заредите ниво, което вече сте решавали (независимо дали е с друга ориентация), то YSokoban ще го разпознае и ще видите, в долния десен ъгъл, дали и как сте го били решили.

Задаване на броя на записваните решения

В този диалог (активиран от менюто) може да зададете максималния брой решения за различните категории, които ще се пазят за дадено ниво. Всяка категория е свързана с един от броячите.

Нормализирани нива

YSokoban разпознава нивата дори те да са завъртени, отразени, ... което и да е от 8-те ендакви състояния които може да получите с трансформация. Нещо повече, в някой случаи нивото се разпознава дори да има добавени/премахнати стени или пък ако работника е на някое друго място. Всъщност YSokoban сравнява нормализираните нива, не оригиналните.

Когато записва решенията YSokoban записва и нивото към което са тези решения в нормализиран вид. Нормализирано ниво е ниво, което може да е леко променено спрямо оригиналното, но без това да води до съществена промяна. Има няколко правила които се прилагат при нормализиране на нивата.

Всички недостъпни клетки се заместват със стени

Ако някой клетки са недостъпни, то те се заместват със стени, защото на практика не са съществена част от нивото. Там работника и без това никога не може да стъпи.

Две нива които се различават само по това, че едното има стени на мястото на недостъпните клетки, а другото няма, са на практика еднакви. Например в следното ниво всички клетки отбелязани със знак '-' са недостъпни и затова се заменят със стени в нормализираната си форма:

###----             #######
#  ##--             #  ####
#  $.##             #  $.##
# ###--    --->     # #####
# #-#--             # #####
# #####             # #####
#   @ #             #   @ #
#######             #######

Тунелите без изход се премахват

Тунелите (коридори от една клетка), които са запушени в единия си край се заменят със стени, защото практически са неизползваеми. Работника няма смисъл да влиза вътре, а ако е там, единственото което може да направи е да излезе (в такъв случай работника се изважда насилствено навън в нормализираната версия). Например:

#######             #######
#  ####             #  ####
#  $.##             #@ $.##
#-#####             #######
#-#####    --->     #######
#-#####             #######
#---@-#             #######
#######             #######

Сандъци които не могат да бъдат поместени и се считат за стени

Например:

######              ######
# $. #              # $. #
# ** #    --->      # ## #
# ** #              # ## #
#  @ #              #  @ #
######              ######

Нормализирано ниво

Прилагайки тези правила върху някое ниво, понякога довеждат до друго, еквивалентно на първото, но напълно възможно да е трудно разпознаваемо. Но това че човек не може да го разпознае лесно не е важно, важното е че YSokoban, може да го разпознае и да предупреди за това, че вече е било решавано, като дори може да адаптира решението, така че да пасва на нормализираното ниво. Същия подход се използва и от програмата SokoDUP (помощна програма която може да преглежда голям набор от нива и да казва кои се повтарят).

Тривиални нива

Тривиални се считат нива, които се решават, като се прилагат само форсирани движения на работника (защото е в задънен тунел). Защото има един единствен начин за работника да се движи и ако нивото бива решено при тези движения, то се счита за тривиално.

Такива нива ще бъдат отбелязани в долния десен ъгъл с надписа "тривиално".

YSokoban не запазва решения за такива нива.

Например следното ниво е тривиално:

##### форсирано #####  правило #####
#@$.# --------> ##@*#  ------> ##@##
#####           #####  номер 3 #####

В този пример работника се придвижва надясно (защото е задънен тунел) и избутва сандъка при това форсирано движение. Сандъка попада на мястото си и се превръща в стена защото от това място не може да бъде поместен изобщо. Така получаваме самотен работник зазидан в стаята. Така че това е тривиално ниво, което всъщност от пръв поглед е такова.

Това е втори пример за тривиално ниво, което не изглежда такова на пръв поглед (макар че очевдино е лесно):

  ###         ###         ###         ###         ###         ###         ###         ###
###.##      ###.##      ###.##      ###.##      ###*##      ######      ######      ######
#.$$.#      #.$$*#      #.$$##      #.$$##      #.$@##      #.$@##      #*@###      ##@###
##.$$# ---> ##.$@# ---> ##.$@# ---> ##*@## ---> ###### ---> ###### ---> ###### ---> ######
 ###@#       #####       #####      #####       #####        #####       #####       #####
   ###         ###         ###      ###         ###            ###         ###         ###

Created with Ywiki