Выиграй 10 CMD.Используя IF GEQ для сравнения, получая плохие результаты - PullRequest
0 голосов
/ 17 декабря 2018

Я писал файл CMD BATCH, чтобы рисовать некоторые элементы на экране с помощью символов ascii.Я написал довольно простую настройку, чтобы сделать круги на экране, используя вариант формулы расстояния.НО результаты не совсем правильные.

В то время как он рисует круги (в основном), в верхней и левой части происходят странности.Чтобы попытаться отладить это, я выкладываю фактические результаты набора /A в .csv, и похоже, что математика выполняется правильно, и она получает правильный результат.НО, когда он использует число if !variable! geq, он не будет надежно оцениваться правильно (просто БОЛЬШЕ времени).

Вот урезанная версия кода, которая все еще имеет проблему:

SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF
CLS
MODE CON: COLS=100 LINES=102
COLOR 0A
IF EXIST OUTPUT.MAP DEL OUTPUT.MAP
IF EXIST MATHCHECK.CSV DEL MATHCHECK.CSV
SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWCHAR%%X%%Y=.
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 129600 SET DRAWCHAR%%X%%Y=^^
        ECHO 129600,^^^^,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR%%X%%Y!>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 ) 

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 144400 SET DRAWCHAR%%X%%Y=M
        ECHO 144400,M,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR%%X%%Y!>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 )          

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    SET DRAWLINE%%Y=-
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWLINE%%Y=!DRAWLINE%%Y!!DRAWCHAR%%X%%Y!
    )
    SET DRAWLINE%%Y=!DRAWLINE%%Y:~1,79!
    ECHO !DRAWLINE%%Y!>>OUTPUT.MAP
    CLS
    ECHO COMPILING OUTPUT...
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)    

CLS
ECHO +------------------------------------------------------------------------------+-------------------+
FOR /L %%D IN (2,1,79) DO (
    ECHO ^|!DRAWLINE%%D!^|!                   ^|
)
ECHO +------------------------------------------------------------------------------+-------------------+
PAUSE

Вот результаты, которые я получаю: https://drive.google.com/open?id=1Rwp2YCBwJCArkVunqBNXa3CDuJhTSVSm

Это должно выглядеть как квадрат Ms с кругом ^ s в нем, а затем кругом .s в этом.Это в основном верно, но лишних зазубрин M и ^ вверху и слева не должно быть.

Математическая формула ДОЛЖНА быть правильной.это просто A^2+B^2=C^2.

Чтобы понять это, я выкладываю файл mathcheck.csv, который имеет:

  1. Тестовое значение
  2. Символвыводить, если geq, тестовое значение
  3. Координаты x и y
  4. Расчетное квадратное расстояние от центра
  5. Результирующий символ, который программа использовала.

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

Я пробовал все виды вещей:использование lss вместо geq (и переключение значений), поиск и настройка команды set / a, поиск и настройка if, «рисование» в другом порядке (если вы рисуете все Ms, то рисуете меньшие круги сверху вместоначиная с .s и надевая кольца, вы получаете очень похожую ошибку в той же общей области).

В этот момент я почти уверен, что я либо придумал что-то очевидное в коде, ИЛИ, если сравнения чиселпросто не достаточно надежны, чтобы это работало?хотя это кажется невозможным.Это должно быть ошибка кода.

1 Ответ

0 голосов
/ 17 декабря 2018

Основная проблема с координатами XY состоит в том, что, если вы не разделите их, у вас может быть несколько значений, которые кажутся одним и тем же местоположением.Например, [638] является либо [6,38], либо [63,8].К сожалению, если вы не разделите их, пакет будет перезаписывать любые существующие значения.Использование стандартного синтаксиса массива !DRAWCHAR[%%X][%%Y]! решает эту проблему.

SETLOCAL ENABLEDELAYEDEXPANSION
@ECHO OFF
CLS
MODE CON: COLS=100 LINES=102
COLOR 0A
IF EXIST OUTPUT.MAP DEL OUTPUT.MAP
IF EXIST MATHCHECK.CSV DEL MATHCHECK.CSV
SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWCHAR[%%X][%%Y]=.
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 129600 SET DRAWCHAR[%%X][%%Y]=^^
        ECHO 129600,^^^^,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR[%%X][%%Y!]>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 ) 

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    FOR /L %%X IN (2,1,79) DO (
        SET /A "SQDISTANCE=((405-%%X*10)*(405-%%X*10))+((405-%%Y*10)*(405-%%Y*10))"
        IF !SQDISTANCE! GEQ 144400 SET DRAWCHAR[%%X][%%Y]=M
        ECHO 144400,M,%%X,%%Y,!SQDISTANCE!,!DRAWCHAR[%%X][%%Y]!>>MATHCHECK.CSV
    )
    CLS
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
 )          

SET STATUSLINE=-
FOR /L %%Y IN (2,1,79) DO (
    SET DRAWLINE[%%Y]=-
    FOR /L %%X IN (2,1,79) DO (
        SET DRAWLINE[%%Y]=!DRAWLINE[%%Y]!!DRAWCHAR[%%X][%%Y]!
    )
    SET DRAWLINE[%%Y]=!DRAWLINE[%%Y]:~1,79!
    ECHO !DRAWLINE[%%Y]!>>OUTPUT.MAP
    CLS
    ECHO COMPILING OUTPUT...
    ECHO !STATUSLINE!
    SET STATUSLINE=!STATUSLINE!-
)    

CLS
ECHO +------------------------------------------------------------------------------+-------------------+
FOR /L %%D IN (2,1,79) DO (
    ECHO ^|!DRAWLINE[%%D]!^|!                   ^|
)
ECHO +------------------------------------------------------------------------------+-------------------+
PAUSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...