Pull to refresh

Свои судоку на своих батниках

Reading time2 min
Views5.2K
image
С предыдущего хабратопика я понял, что хабражителям очень понравился сапер на своих батниках и поэтому рискнул написать еще одну игру, а именно — Судоку. И опять же, на своих батниках.
Как и Minesweeper, Sudoku for cmd.exe имеет ряд следующих преимуществ:
  • Оригинальное лого
  • Двухцветный текстовой графический интерфейс (фон — чёрный, текст — серый)
  • Возможность воспроизведения программы практически на любом компьютере
В общем, это Судоку для настоящих мужчин. И скачать эту замечательную игру вы можете прямо сейчас, воспользовавшись этими ссылками: Plain Text | Google Docs

image
Вообще, игра Судоку одна из сложнейших в реализации. Проблема заключается в генерации нормальной таблицы. Итак, у нас есть поле 9x9=81 клеток. В каждую клетку можно вписать одну из девяти цифр. Чрезвычайно много вариаций, чтобы решить перебором. Вместо этого используются готовые таблицы. Объясню суть.
Можно создать несколько таблиц, в которых вместо цифр используются буквы (латинский квадрат :-)). Всего букв девять — abcdefghi. Букву 'a' можно заменить на 9, 8, 7 и т.д. В результате мы можем с одной таблицы получить 9!=362880 вариаций. Неплохо? А вот и сам код, который мешает цифры:

REM Загадочный алгоритм, обеспечивающий 9!=362880 вариаций таблицы судоку.
for /L %%i in (1,1,9) do set replmap%%i=%%i
set replcounter=0
:replcycle
set temp1=%random:~-1%
if %temp1% == 0 goto replcycle
set temp2=%random:~-1%
if %temp2% == 0 goto replcycle
set /a replcounter+=1
call set temp=%%replmap%temp1%%%
call set replmap%temp1%=%%replmap%temp2%%%
call set replmap%temp2%=%temp%
set "temp="
if %replcounter% LSS 504 goto replcycle
REM END CYCLE :replcycle

Краткая суть алгоритма: в переменные replmap1 — replmap9 заносятся цифры от 1 до 9 в рандомном порядке. После проделываем замену букв на числа, содержащиеся в этих переменных. К примеру, в replma1 будет число 5. Тогда буква 'a' будет заменена на число '5'. Переменная map содержит выбранную в рандомном порядке карту.
call :replacestr map a %replmap1%
call :replacestr map b %replmap2%
call :replacestr map c %replmap3%
call :replacestr map d %replmap4%
call :replacestr map e %replmap5%
call :replacestr map f %replmap6%
call :replacestr map g %replmap7%
call :replacestr map h %replmap8%
call :replacestr map i %replmap9%

REM ... Много интересного и не очень кода ... 

:replacestr
REM Функция замены строки.
call set temp=%%%1%%
call set temp=%%temp:%2=%3%%
set %1=%temp%
goto:eof


После мы должны убрать несколько десятков цифр с таблицы, что не составляет особой проблемы. Также не является проблемой UI, который был нагло украден с Сапера и немного доработан. Также была сворована функция подсчета времени.

Второй проблемой в реализации Судоку была заключительная проверка: победил ли пользователь? Можно было тупо посчитать кол-во двоек, троек и прочих чисел в каждой строке, столбце, квадрате, но это слишком скучно. Было решено просто сосчитать сумму и произведение чисел. Простой, элегантный метод, который превратился черт знает что. Кстати, определить точное местонахождение ошибки таким методом можно только с точностью до строки/столбца/квадрата и только при полном заполнении последнего.

Повторяю, что скачать Судоку вы сможете здесь: Plain Text |  Google Docs
Tags:
Hubs:
Total votes 103: ↑83 and ↓20+63
Comments51

Articles