muffe релиз


Слово muffe — как оказалось с немецкого это муфта. Но придумывалось как исковерканное слово move и coffee.

В игре присутствуют отличия от оригинальной игры 2048.
Так как алгоритм разрабатывал вслепую. Тыкал и смотрел что выходит. Пытался повторить это в командной строке cmd batch-файлом.

1. не меняется цвет ячеек. Понял как это сделать. Но еще не реализовал эту возможность.
Можно с помощью FINDSTR или сторонней DOS утилиты.
2. отсутствует анимация.

Поправил графическое отображение. Оказывается в FAR можно добавлять символы псевдографики. А то я до этого набирал текст, в Блокноте

Поправил синтаксис. Использовал кое, что из батника созданного AAbrosov
Теперь управляющие батники стали в 4 раза короче.

Перемещение и сложение выделил в отдельные файлы, которые вызываю при помощи CALL.
На каждое направление свой отдельный файл.
WASD — выбираем направление, стрелочки так и не получилось заставить.
X — выход из игры в любой момент, если только не зависла. Тогда можно просто закрыть окно cmd.
R — начать заново, в любой момент.

Сам не программист, и наверно допустил много глупостей. Но главное что работает. На все это потратил уже 4 недели. Вдумчиво рассматривал исходный код странички coffee2048.com, мало чего понял. За то упорно изучал командную строку и создание батников. Мне еще на первом компе 386 нравилось писать autoexec.bat и config.sys для запуска игр. Иногда этот процесс был интересней самой игры. Еще вдохновился шуткой от Microsoft на 1 апреля. MS-DOS для Windows Phone там понравилась камера и танцы с бубном, что бы запустить игру «камень-ножницы-бумага». Cortana прикольно помогает.

Были проблемы с dynamic variable. сначала нужно было понять, что это такое и с чем это едят, а потом найти как это можно использовать в cmd. Еще были проблемы с IF. Как оказалось туда можно вставлять только дно действие. Пришлось использовать GOTO. Не получилось использовать цикл FOR. Вышел из ситуации с помощью IF и GOTO.

Для управление в игре использовал команду CHOICE. Пока искал как отдавать команды игре, наткнулся на игру змейку тоже в батнике. Там управление передавалось через SET /P но я так и не понял как вводить буквы и не нажимать после этого ВВОД. Остановился на CHOICE. Хотя мне не нравится то что эта команда пищит, иногда очень громко, если нажата клавиша которая не обозначена в «choice /C wasdxr /N >nul».

содержимое батника muffe9.bat
@echo off
title muffe (Game 2048 for Command prompt)
if not exist muffe_BestSc.txt echo 0>muffe_BestSc.txt
(set /p BestSc=)<muffe_BestSc.txt
set BestSc=%BestSc: =%
:Begin1
cls

SETLOCAL ENABLEDELAYEDEXPANSION

set "echo2=echo ЪДДДДїЪДДДДїЪДДДДїЪДДДДї"
set "echo3=echo АДДДДЩАДДДДЩАДДДДЩАДДДДЩ"
set contor=0


:::::::::::::::::::::::::::::::::::::::::::::::::

set contentR11=0
set contentR12=0
set contentR13=0
set contentR14=0

set contentR21=0
set contentR22=0
set contentR23=0
set contentR24=0

set contentR31=0
set contentR32=0
set contentR33=0
set contentR34=0

set contentR41=0
set contentR42=0
set contentR43=0
set contentR44=0

:::::::::::::::::::::::::::::::::::::::::::::::::

set /a "X=%RANDOM% * 100 / 32768 + 1"
if [%X%] LEQ [90] set cell=2
if [%X%] GEQ [91] set cell=4

:::::::::::::::::::::::::::::::::::::::::::::::::

set /a "X=%RANDOM% * 4 / 32768 + 1"
set /a "Y=%RANDOM% * 4 / 32768 + 1"
set contentR%Y%%X%=%cell%
set "content%Y%%X%=   %cell%"

set exitC=0

:::::::::::::::::::::::::::::::::::::::::::::::::

if [%contentR11%] == [0] (set "content11=    ")
if [%contentR12%] == [0] (set "content12=    ")
if [%contentR13%] == [0] (set "content13=    ")
if [%contentR14%] == [0] (set "content14=    ")

if [%contentR21%] == [0] (set "content21=    ")
if [%contentR22%] == [0] (set "content22=    ")
if [%contentR23%] == [0] (set "content23=    ")
if [%contentR24%] == [0] (set "content24=    ")

if [%contentR31%] == [0] (set "content31=    ")
if [%contentR32%] == [0] (set "content32=    ")
if [%contentR33%] == [0] (set "content33=    ")
if [%contentR34%] == [0] (set "content34=    ")

if [%contentR41%] == [0] (set "content41=    ")
if [%contentR42%] == [0] (set "content42=    ")
if [%contentR43%] == [0] (set "content43=    ")
if [%contentR44%] == [0] (set "content44=    ")

set version=1

:Direction


::::::::::::::::::::::::::::::::::::::::

set exitC=0

:Rand
set /a "exitC+=1"
if [%exitC%] == [60] (goto Exit1)

set /a "X=%RANDOM% * 100 / 32768 + 1"
if [%X%] LEQ [90] set cell=2
if [%X%] GEQ [91] set cell=4

set /a "X=%RANDOM% * 4 / 32768 + 1"
set /a "Y=%RANDOM% * 4 / 32768 + 1"
set name=contentR%Y%%X%

if [!%name%!] == [0] (set %name%=%cell%
) else (goto Rand)
set "content%Y%%X%=   %cell%"
if [%version%] == [0] goto Anulare


::::::::::::::::::::::::::::::::::::::::

if %contor% GTR %BestSc% set BestSc=%contor%

:Cls1
cls

%echo2%
echo і%content11%іі%content12%іі%content13%іі%content14%і    Score = %contor%
%echo3%
%echo2%
echo і%content21%іі%content22%іі%content23%іі%content24%і
%echo3%
%echo2%
echo і%content31%іі%content32%іі%content33%іі%content34%і
%echo3%
%echo2%
echo і%content41%іі%content42%іі%content43%іі%content44%і    BestS = %BestSc%
%echo3%
echo(
echo WASD or X or R

choice /C wasdxr /N >nul

if errorlevel 6 (goto Begin1)
if errorlevel 5 (goto Exit1)
if errorlevel 4 (goto D4)
if errorlevel 3 (goto S3)
if errorlevel 2 (goto Aa2)
if errorlevel 1 (goto W1)
if errorlevel 0 (goto Direction)

:::::::::::::::::::::::::::::::::::::::::

:D4
call muffe_D4.bat
goto Direction

:S3
call muffe_S3.bat
goto Direction

:Aa2
call muffe_Aa2.bat
goto Direction

:W1
call muffe_W1.bat
goto Direction

:::::::::::::::::::::::::::::::::::::::::

:Anulare
set contentR%Y%%X%=0
set "content%Y%%X%=    "
goto Cls1


:Exit1
echo %BestSc% >muffe_BestSc.txt





содержимое управляющих батников:

muffe_Aa2.bat
:Aa2
set version=0

call :ToZero

if [%contentR11%] == [%contentR12%] (call :Sum1000 contentR11 contentR12 content11 content12)
if [%contentR12%] == [%contentR13%] (call :Sum1000 contentR12 contentR13 content12 content13)
if [%contentR13%] == [%contentR14%] (call :Sum1000 contentR13 contentR14 content13 content14)

if [%contentR21%] == [%contentR22%] (call :Sum1000 contentR21 contentR22 content21 content22)
if [%contentR22%] == [%contentR23%] (call :Sum1000 contentR22 contentR23 content22 content23)
if [%contentR23%] == [%contentR24%] (call :Sum1000 contentR23 contentR24 content23 content24)

if [%contentR31%] == [%contentR32%] (call :Sum1000 contentR31 contentR32 content31 content32)
if [%contentR32%] == [%contentR33%] (call :Sum1000 contentR32 contentR33 content32 content33)
if [%contentR33%] == [%contentR34%] (call :Sum1000 contentR33 contentR34 content33 content34)

if [%contentR41%] == [%contentR42%] (call :Sum1000 contentR41 contentR42 content41 content42)
if [%contentR42%] == [%contentR43%] (call :Sum1000 contentR42 contentR43 content42 content43)
if [%contentR43%] == [%contentR44%] (call :Sum1000 contentR43 contentR44 content43 content44)

call :ToZero

exit /B

:ToZero

set rrnn=1
:PPNN
if [%contentR11%] == [0] (call :Zero1000 contentR11 contentR12 content11 content12)
if [%contentR12%] == [0] (call :Zero1000 contentR12 contentR13 content12 content13)
if [%contentR13%] == [0] (call :Zero1000 contentR13 contentR14 content13 content14)

if [%contentR21%] == [0] (call :Zero1000 contentR21 contentR22 content21 content22)
if [%contentR22%] == [0] (call :Zero1000 contentR22 contentR23 content22 content23)
if [%contentR23%] == [0] (call :Zero1000 contentR23 contentR24 content23 content24)

if [%contentR31%] == [0] (call :Zero1000 contentR31 contentR32 content31 content32)
if [%contentR32%] == [0] (call :Zero1000 contentR32 contentR33 content32 content33)
if [%contentR33%] == [0] (call :Zero1000 contentR33 contentR34 content33 content34)

if [%contentR41%] == [0] (call :Zero1000 contentR41 contentR42 content41 content42)
if [%contentR42%] == [0] (call :Zero1000 contentR42 contentR43 content42 content43)
if [%contentR43%] == [0] (call :Zero1000 contentR43 contentR44 content43 content44)
set /a "rrnn+=1"
if [%rrnn%] LEQ [3] (goto PPNN)
exit /B

:Sum1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %1=%PP%
set %3=%PP%
set /a contor+=%PP%
IF %PP% LSS 1000 set "%3= %PP%"
IF %PP% LSS 100 set "%3=  %PP%"
IF %PP% LSS 10 set "%3=   %PP%"
set "%4=    "
set %2=0
set version=1
exit /B

:Zero1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %3=!%4!
set %1=!%2!
set "%4=    "
set %2=0
set version=1
exit /B



muffe_D4.bat
:D4
set version=0

call :ToZero

if [%contentR14%] == [%contentR13%] (call :Sum1000 contentR14 contentR13 content14 content13)
if [%contentR13%] == [%contentR12%] (call :Sum1000 contentR13 contentR12 content13 content12)
if [%contentR12%] == [%contentR11%] (call :Sum1000 contentR12 contentR11 content12 content11)

if [%contentR24%] == [%contentR23%] (call :Sum1000 contentR24 contentR23 content24 content23)
if [%contentR23%] == [%contentR22%] (call :Sum1000 contentR23 contentR22 content23 content22)
if [%contentR22%] == [%contentR21%] (call :Sum1000 contentR22 contentR21 content22 content21)

if [%contentR34%] == [%contentR33%] (call :Sum1000 contentR34 contentR33 content34 content33)
if [%contentR33%] == [%contentR32%] (call :Sum1000 contentR33 contentR32 content33 content32)
if [%contentR32%] == [%contentR31%] (call :Sum1000 contentR32 contentR31 content32 content31)

if [%contentR44%] == [%contentR43%] (call :Sum1000 contentR44 contentR43 content44 content43)
if [%contentR43%] == [%contentR42%] (call :Sum1000 contentR43 contentR42 content43 content42)
if [%contentR42%] == [%contentR41%] (call :Sum1000 contentR42 contentR41 content42 content41)

call :ToZero

exit /B

:ToZero

set rrnn=1
:PPNN
if [%contentR14%] == [0] (call :Zero1000 contentR14 contentR13 content14 content13)
if [%contentR13%] == [0] (call :Zero1000 contentR13 contentR12 content13 content12)
if [%contentR12%] == [0] (call :Zero1000 contentR12 contentR11 content12 content11)

if [%contentR24%] == [0] (call :Zero1000 contentR24 contentR23 content24 content23)
if [%contentR23%] == [0] (call :Zero1000 contentR23 contentR22 content23 content22)
if [%contentR22%] == [0] (call :Zero1000 contentR22 contentR21 content22 content21)

if [%contentR34%] == [0] (call :Zero1000 contentR34 contentR33 content34 content33)
if [%contentR33%] == [0] (call :Zero1000 contentR33 contentR32 content33 content32)
if [%contentR32%] == [0] (call :Zero1000 contentR32 contentR31 content32 content31)

if [%contentR44%] == [0] (call :Zero1000 contentR44 contentR43 content44 content43)
if [%contentR43%] == [0] (call :Zero1000 contentR43 contentR42 content43 content42)
if [%contentR42%] == [0] (call :Zero1000 contentR42 contentR41 content42 content41)
set /a "rrnn+=1"
if [%rrnn%] LEQ [3] (goto PPNN)
exit /B

:Sum1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %1=%PP%
set %3=%PP%
set /a contor+=%PP%
IF %PP% LSS 1000 set "%3= %PP%"
IF %PP% LSS 100 set "%3=  %PP%"
IF %PP% LSS 10 set "%3=   %PP%"
set "%4=    "
set %2=0
set version=1
exit /B

:Zero1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %3=!%4!
set %1=!%2!
set "%4=    "
set %2=0
set version=1
exit /B



muffe_S3.bat
:S3
set version=0

call :ToZero

if [%contentR41%] == [%contentR31%] (call :Sum1000 contentR41 contentR31 content41 content31)
if [%contentR31%] == [%contentR21%] (call :Sum1000 contentR31 contentR21 content31 content21)
if [%contentR21%] == [%contentR11%] (call :Sum1000 contentR21 contentR11 content21 content11)

if [%contentR42%] == [%contentR32%] (call :Sum1000 contentR42 contentR32 content42 content32)
if [%contentR32%] == [%contentR22%] (call :Sum1000 contentR32 contentR22 content32 content22)
if [%contentR22%] == [%contentR12%] (call :Sum1000 contentR22 contentR12 content22 content12)

if [%contentR43%] == [%contentR33%] (call :Sum1000 contentR43 contentR33 content43 content33)
if [%contentR33%] == [%contentR23%] (call :Sum1000 contentR33 contentR23 content33 content23)
if [%contentR23%] == [%contentR13%] (call :Sum1000 contentR23 contentR13 content23 content13)

if [%contentR44%] == [%contentR34%] (call :Sum1000 contentR44 contentR34 content44 content34)
if [%contentR34%] == [%contentR24%] (call :Sum1000 contentR34 contentR24 content34 content24)
if [%contentR24%] == [%contentR14%] (call :Sum1000 contentR24 contentR14 content24 content14)

call :ToZero

exit /B

:ToZero

set rrnn=1
:PPNN
if [%contentR41%] == [0] (call :Zero1000 contentR41 contentR31 content41 content31)
if [%contentR31%] == [0] (call :Zero1000 contentR31 contentR21 content31 content21)
if [%contentR21%] == [0] (call :Zero1000 contentR21 contentR11 content21 content11)

if [%contentR42%] == [0] (call :Zero1000 contentR42 contentR32 content42 content32)
if [%contentR32%] == [0] (call :Zero1000 contentR32 contentR22 content32 content22)
if [%contentR22%] == [0] (call :Zero1000 contentR22 contentR12 content22 content12)

if [%contentR43%] == [0] (call :Zero1000 contentR43 contentR33 content43 content33)
if [%contentR33%] == [0] (call :Zero1000 contentR33 contentR23 content33 content23)
if [%contentR23%] == [0] (call :Zero1000 contentR23 contentR13 content23 content13)

if [%contentR44%] == [0] (call :Zero1000 contentR44 contentR34 content44 content34)
if [%contentR34%] == [0] (call :Zero1000 contentR34 contentR24 content34 content24)
if [%contentR24%] == [0] (call :Zero1000 contentR24 contentR14 content24 content14)
set /a "rrnn+=1"
if [%rrnn%] LEQ [3] (goto PPNN)
exit /B

:Sum1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %1=%PP%
set %3=%PP%
set /a contor+=%PP%
IF %PP% LSS 1000 set "%3= %PP%"
IF %PP% LSS 100 set "%3=  %PP%"
IF %PP% LSS 10 set "%3=   %PP%"
set "%4=    "
set %2=0
set version=1
exit /B

:Zero1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %3=!%4!
set %1=!%2!
set "%4=    "
set %2=0
set version=1
exit /B



muffe_W1.bat
:W1
set version=0

call :ToZero

if [%contentR11%] == [%contentR21%] (call :Sum1000 contentR11 contentR21 content11 content21)
if [%contentR21%] == [%contentR31%] (call :Sum1000 contentR21 contentR31 content21 content31)
if [%contentR31%] == [%contentR41%] (call :Sum1000 contentR31 contentR41 content31 content41)

if [%contentR12%] == [%contentR22%] (call :Sum1000 contentR12 contentR22 content12 content22)
if [%contentR22%] == [%contentR32%] (call :Sum1000 contentR22 contentR32 content22 content32)
if [%contentR32%] == [%contentR42%] (call :Sum1000 contentR32 contentR42 content32 content42)

if [%contentR13%] == [%contentR23%] (call :Sum1000 contentR13 contentR23 content13 content23)
if [%contentR23%] == [%contentR33%] (call :Sum1000 contentR23 contentR33 content23 content33)
if [%contentR33%] == [%contentR43%] (call :Sum1000 contentR33 contentR43 content33 content43)

if [%contentR14%] == [%contentR24%] (call :Sum1000 contentR14 contentR24 content14 content24)
if [%contentR24%] == [%contentR34%] (call :Sum1000 contentR24 contentR34 content24 content34)
if [%contentR34%] == [%contentR44%] (call :Sum1000 contentR34 contentR44 content34 content44)

call :ToZero

exit /B

:ToZero

set rrnn=1
:PPNN
if [%contentR11%] == [0] (call :Zero1000 contentR11 contentR21 content11 content21)
if [%contentR21%] == [0] (call :Zero1000 contentR21 contentR31 content21 content31)
if [%contentR31%] == [0] (call :Zero1000 contentR31 contentR41 content31 content41)

if [%contentR12%] == [0] (call :Zero1000 contentR12 contentR22 content12 content22)
if [%contentR22%] == [0] (call :Zero1000 contentR22 contentR32 content22 content32)
if [%contentR32%] == [0] (call :Zero1000 contentR32 contentR42 content32 content42)

if [%contentR13%] == [0] (call :Zero1000 contentR13 contentR23 content13 content23)
if [%contentR23%] == [0] (call :Zero1000 contentR23 contentR33 content23 content33)
if [%contentR33%] == [0] (call :Zero1000 contentR33 contentR43 content33 content43)

if [%contentR14%] == [0] (call :Zero1000 contentR14 contentR24 content14 content24)
if [%contentR24%] == [0] (call :Zero1000 contentR24 contentR34 content24 content34)
if [%contentR34%] == [0] (call :Zero1000 contentR34 contentR44 content34 content44)
set /a "rrnn+=1"
if [%rrnn%] LEQ [3] (goto PPNN)
exit /B

:Sum1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %1=%PP%
set %3=%PP%
set /a contor+=%PP%
IF %PP% LSS 1000 set "%3= %PP%"
IF %PP% LSS 100 set "%3=  %PP%"
IF %PP% LSS 10 set "%3=   %PP%"
set "%4=    "
set %2=0
set version=1
exit /B

:Zero1000

set /a "PP=!%1!+!%2!"
if [%PP%] == [0] (exit /B)
set %3=!%4!
set %1=!%2!
set "%4=    "
set %2=0
set version=1
exit /B



лучший счет
muffe_BestSc.txt
0



скачать архив yadi.sk/d/Glgq4y1igcvoa
кое что позаимствовано у AAbrosov

старые версии
скачать архив yadi.sk/d/s7cmQlLXgKbng

добавил проверку изменений, теперь 2 не появляются если не было смещения и/или сложения
не очень элегантно вышло, но работает. нужно будет доработать и использовать переключатель
скачать архив 2 yadi.sk/d/fZXAQi9ngLGDE

скачать архив 3 yadi.sk/d/-YxSIUXpgQf2n

Комментарии (22)


  1. berezuev
    29.04.2015 10:41
    +2

    Копировать 5 исходников вручную — это жесть, так что вот архив для тех, кому интересно поиграть: berezuev.ru/tmp/muffe.zip
    Надеюсь, автор перезальет и выложит в посте.


    1. zigrus Автор
      29.04.2015 12:48

      спасибо, добавил ссылку


  1. Imp5
    29.04.2015 10:46
    +3

    Выглядит, как откомпилированный код с развёрнутыми циклами :)


  1. Darthman
    29.04.2015 11:19

    Увы в семерке это выглядит так:

    скрин


    1. zigrus Автор
      29.04.2015 12:48

      я тоже на семерке все это делал, скрин вы видите в статье
      скорее всего у вас стоит

       echo on 
      , а нужно
       echo off 

      проверьте первую строчку батника


  1. Haoose
    29.04.2015 15:00

    Баг:
    image
    Вот из такого положения нельзя сдвинуть внизv или влево<. Но у вас можно. Появляются новые двойки.


    1. Vinatorul
      29.04.2015 15:08

      Автор писал про это

      2-ки появляются после каждого нажатия кнопки, даже если не произошло смещение и/или сложение.


      1. Haoose
        29.04.2015 15:10

        Но в оригинале не так.


        1. Vinatorul
          29.04.2015 15:14

          Да, zigrus и пишет, что некоторые вещи ещё не реализованы, в частности то, о чём вы говорите.


    1. zigrus Автор
      29.04.2015 15:36

      хотелось бы получить дельный совет как это можно поправить


      1. gwer
        29.04.2015 17:22

        Когда только эта штука появилась, забавы ради тоже потратил вечер на написание консольной версии. И эту проблему не решал (то есть работает как и у вас). В целом, много общего в результатах, разве что я уместился в 40 строк (в 30 не вышло, но, полагаю, можно постараться), ибо Python.

        Лечить проблему можно, например, сравнивая состояние поля до движения и после. Если они одинаковы, значит движение не происходит, значит так нельзя. Это самый банальный способ.


        1. zigrus Автор
          29.04.2015 17:26

          я тоже об этом думал. придется добавить еще 16 переменных и 16 проверок IF
          думал что как то проще можно


          1. gwer
            29.04.2015 17:57

            Ну это вариант в лоб. Можно (и нужно) сделать умнее. Например, вести флаг изменения состояния поля, который изначально в false и устанавливается в true при любом изменении состояния. По этому флагу и определять, изменилось что-нибудь или нет. Это следующий по простоте и очевидности вариант. Возможны и другие, но нужно смотреть, не окажутся ли они более сложными и менее логичными.

            У меня, к слову, ячейки могли двигаться только в одну сторону (предположим, вниз, это неважно). Но поле имело функция поворота на 90 градусов в одну сторону (не на экране, в памяти). Соответственно, направление движения определяло лишь число поворотов поля до движения и после него. А в коде движения я рассматривал уже исключительно одну ситуацию с движением в одну сторону.


            1. zigrus Автор
              04.05.2015 11:22

              добавил флаг изменений
              счет, лучший счет, появление четверок


    1. zigrus Автор
      29.04.2015 20:06

      баг поправил.


  1. ivvi
    29.04.2015 17:11

    Всё работает (win7), спасибо )


  1. AAbrosov
    29.04.2015 20:29

    ну вообще если не требовать совместимости с досом,
    то
    if условие (
    команда1
    команда2
    команда3
    )
    должно работать


    1. zigrus Автор
      04.05.2015 11:23

      такая конструкция у меня работала через раз.


      1. AAbrosov
        06.05.2015 13:40
        +1

        Вы меня, конечно, извините, но ваш код ужасен.
        Чтобы это не было пустыми словами, сделал свой вариант 2048 cmd и выложил на GitHub.
        Там, возможно, не реализовано всё что нужно, да и сам язык батников, конечно, ущербный по определению,
        но всё-таки надо же как-то использовать возможности языка, на котором пишете.
        Не может правильно написанная команда работать через раз.


        1. zigrus Автор
          06.05.2015 18:20

          ссылку дайте


  1. AAbrosov
    06.05.2015 20:21
    +1

    1. zigrus Автор
      07.05.2015 10:27

      спасибо, вот что значит когда человек умеет программировать.
      все что вы написали про мой код это правда.