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

    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
    Share post

    Similar posts

    Comments 51

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

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

                            esolangs.org/wiki/Befunge
                          +2
                          Недавно писал сетевой морской бой на bash. Могу опубликовать, если интересно.
                            0
                            С радостью прочитаю, но если это действительно на баше, а не на sed.
                              0
                              Полностью на баше, из внешних программ используются только netcat для передачи данных по сети, stty для настройки терминала и clear для очистки экрана. Постараюсь сегодня-завтра опубликовать.
                                0
                                Хорошо-хорошо, ждем от вас статью в ближайшее время.
                          0
                          Также охота сделать что-то типа Master Of Orion (звездный симулятор). Но… нету времени. А на понимание написанного кода уходит больше чем на написание нового.
                          +5
                          Отлично. Ждём World of Warcraft на батниках.
                            +1
                            Поможете в разработке?
                              +1
                              Могу оказать моральную и информационную поддержку )
                            +5
                            Вы сумасшедший.
                              +7
                              Спасибо за комплимент.
                              +3
                              Это просто вынос мозга, вы — настоящий фрик (в хорошем смысле). Для меня это четвертое измерение, но все таки возникает вопрос: с чем связан ваш выбор алгоритма проверки, почему бы просто не сверять с той таблицей из которой вы убрали «несколько десятков цифр»?
                                +2
                                Если убрать слишком много чисел (40, как сейчас, бывает много), то судоку имеет больше одного решения. А использовать метод удаления с проверкой на кол-во решений — слишком ресурсоемко.
                                0
                                Ну напишите наконец брейнфак на кмд и успокойтесь.
                                  +2
                                  Вам жалко что-ли?
                                  +1
                                  ждем кроссворды, раздевание девушки с ИИ и танчики на cmd:)
                                    +2
                                    да, танчики было бы крутейше!
                                      +2
                                      Спасибо за идею, попробую реализовать на asm+bat ;)
                                  • UFO just landed and posted this here
                                    • UFO just landed and posted this here
                                        +1
                                        Вы сумасшедший!

                                        Ждём пинбол на bat?
                                        • UFO just landed and posted this here
                                            0
                                            А почему таблица из плюсов минусов и слешей. ASCII как бы символы имеет нужные. Правда кодирование усложняется тогда.
                                              0
                                              Будут проблемы с сохранением батника в различных редакторах.
                                              0
                                              Можно уже делать сборник игр на батниках. На хабре еще были крестики нолики, если не ошибаюсь…
                                                0
                                                Крестики-нолики были по сети. 3х3

                                              Only users with full accounts can post comments. Log in, please.