Ненормальное программирование

индекс
285,91

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

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
+63
11 декабря 2009, 21:54
22

комментарии (51)

–7
Tagrim #
судоку вообще-то 9х9…
+4
nsinreal #
А это что? 16х16? Вы просто видите индикатор загрузки.
+14
lostuser #
Индикатор загрузки в батнике)) Браво!
0
nsinreal #
Вообще, его и в сапер нужно было добавить, но… Там действительно, большое время ожидания
+1
nsinreal #
Добавил в пост скрин самой игры.
НЛО прилетело и опубликовало эту надпись здесь
+4
nsinreal #
А этот текст еще кто-то читает? (искренне недоумевая)
Немного подправил. Вот представьте, что replma1 — replmap9 содержат такие числа:
9 8 6 7 3 5 4 2 1
Тогда в карте буква «a» будет заменена на число 9, «b» — на 8, «c» — на 6 и т.д.
0
imps #
а куда же простите делось число 7? :)
кстати вы уже нашли девушку :)
(или у вас она давно есть) =)
+1
nsinreal #
Смотрите внимательней: число 7 никуда не делось
+1
imps #
точно, тяжело думать так поздно, да ещё и в пятницу :)
НЛО прилетело и опубликовало эту надпись здесь
+1
nsinreal #
Спасибо, заменил.
НЛО прилетело и опубликовало эту надпись здесь
+4
diss #
маньяк
давайте уже на PoSh'е
и при проигрыше случайным образом меняется пароль :)
0
naryl #
> Возможность воспроизведения программы практически на любом компьютере

Всего лишь на ~90%. А вот GRUB Invaders гарантированно заведётся на 100% десктопов. ^___^
–3
naryl #
Недостаточно маньячно? GRUB работает не везде? Windows© захватил мир и стоит на 100% десктопов? Не могу понять причину минуса.
0
nsinreal #
М.б. проблема в том, что:
1) Сложно найти ссылку на скачивание готового примера (я не нашел) да и на сурсы.
2) Нету описания.
3) Windows таки работает на 90% компьютеров. А GRUB на скольки?
–3
naryl #
1. Вы что, первый раз на freshmeat? :D Справа ссылка Website: www.erikyyy.de/invaders/
2. На website'е, хоть и в две строчки. :)
3. Ну да, установка судоку на батниках всё-же проще, чем установка GRUB, но и то и другое в сто раз проще, чем установка Windows или, скажем Linux. И GRUB без проблем грузит любую ОС, включая Windows'ы.
+1
nsinreal #
И что интересного в GRUB Invaders с точки зрения Ненормального программирования? Я увидел код на высокоуровненном языке программирования, который не имеет особых ограничений. Что-то особенное?
0
naryl #
А то, что в GRUB — не ОС (пока ещё) и в нём отсутствует libc вам ни о чём не говорит? :) Посмотрите, например, на реализацию malloc в memory.c
+2
nsinreal #
С точки зрения многих линуксоидов, Windows — не ОС. Язык чрезвычайно ограничен, большая часть кода — издевательство над переменными.
Еще аргументы?
+1
Ronin #
Привет маньякам! Сапер есть, судоку есть… Что дальше планируешь? ;)
+1
nsinreal #
М.б. морской бой или пэкман. Также можно сделать habrawars на батниках, но у меня слишком мало опыта в создании именно движков.
+1
NecroProger #
Может, Вам попробовать пописать на Brainfuck'е? ;)
(http://ru.wikipedia.org/wiki/Brainfuck
Линк не кликабельный, т. к. маленькая карма.)
0
naryl #
Brainfuck — непрактично. Лучше Befunge ;)
+1
naryl #
И в очередной раз спасибо хабраюзерам, которые заставляют других тратить время на гугление и/или копирование ссылок.

esolangs.org/wiki/Befunge
+2
naething #
Недавно писал сетевой морской бой на bash. Могу опубликовать, если интересно.
0
nsinreal #
С радостью прочитаю, но если это действительно на баше, а не на sed.
0
naething #
Полностью на баше, из внешних программ используются только netcat для передачи данных по сети, stty для настройки терминала и clear для очистки экрана. Постараюсь сегодня-завтра опубликовать.
0
nsinreal #
Хорошо-хорошо, ждем от вас статью в ближайшее время.
0
nsinreal #
Также охота сделать что-то типа Master Of Orion (звездный симулятор). Но… нету времени. А на понимание написанного кода уходит больше чем на написание нового.
+5
JadeSpirit #
Отлично. Ждём World of Warcraft на батниках.
+1
nsinreal #
Поможете в разработке?
+1
JadeSpirit #
Могу оказать моральную и информационную поддержку )
+5
somniator #
Вы сумасшедший.
+7
nsinreal #
Спасибо за комплимент.
+3
Klint #
Это просто вынос мозга, вы — настоящий фрик (в хорошем смысле). Для меня это четвертое измерение, но все таки возникает вопрос: с чем связан ваш выбор алгоритма проверки, почему бы просто не сверять с той таблицей из которой вы убрали «несколько десятков цифр»?
+2
nsinreal #
Если убрать слишком много чисел (40, как сейчас, бывает много), то судоку имеет больше одного решения. А использовать метод удаления с проверкой на кол-во решений — слишком ресурсоемко.
0
grep0 #
Ну напишите наконец брейнфак на кмд и успокойтесь.
+2
nsinreal #
Вам жалко что-ли?
+1
SegaZero #
ждем кроссворды, раздевание девушки с ИИ и танчики на cmd:)
+2
Qiwichupa #
да, танчики было бы крутейше!
+2
greedykid #
Спасибо за идею, попробую реализовать на asm+bat ;)
НЛО прилетело и опубликовало эту надпись здесь
+1
uplinkz1 #
Вы безумен. =D
В хорошем смысле.
+1
DeadFine #
Вы сумасшедший!

Ждём пинбол на bat?
НЛО прилетело и опубликовало эту надпись здесь
0
TuKTeeK #
А почему таблица из плюсов минусов и слешей. ASCII как бы символы имеет нужные. Правда кодирование усложняется тогда.
0
nsinreal #
Будут проблемы с сохранением батника в различных редакторах.
0
oxilor #
Можно уже делать сборник игр на батниках. На хабре еще были крестики нолики, если не ошибаюсь…
0
nsinreal #
Крестики-нолики были по сети. 3х3

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.