赢得10 CMD。使用IF GEQ进行比较,结果不佳

时间:2018-12-17 02:47:58

标签: batch-file math cmd windows-10

我一直在编写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的圆。基本上是正确的,但是顶部和左侧的Ms和^ s多余的锯齿不应该存在。

数学公式应该正确。只是A^2+B^2=C^2

为了弄清楚这一点,我随口吐出了一个具有以下内容的mathcheck.csv文件:

  1. 测试值
  2. 如果等于测试值,则要打印的字符
  3. x和y坐标
  4. 计算出的距中心距离的平方
  5. 程序说要使用的结果字符。

如果滚动浏览该文件,则可以看到实例,即使结果不是,计算结果仍大于计算值。

我尝试了各种方法:使用lss代替geq(并翻转值),查找并调整set / a命令,查找并调整if,以不同顺序“绘制”(如果您绘制所有女士,然后在顶部绘制较小的圆圈,而不是从.s开头并放在圆环上,这样您将在同一常规区域中得到非常相似的错误。

在这一点上,我很确定我是否已经在代码中弄清楚了一些东西,或者如果数字的比较不够可靠,则该代码无法正常工作?但这似乎不可能。它必须是代码错误。

1 个答案:

答案 0 :(得分:2)

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