我一直在编写一个 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 文件,其中包含:
- 测试值
- 如果 geq 为测试值则要打印的字符
- x 和 y 坐标
- 计算出的距中心的平方距离
- 程序表示要使用的结果字符。
如果滚动浏览该文件,您可以看到结果是计算值大于测试值的实例,即使计算值并非如此。
我尝试过各种各样的东西:使用 lss 而不是 geq (和翻转值),查找并调整 set/a 命令,查找并调整 if,以不同的顺序“绘制”(如果您绘制所有 Ms,然后在顶部绘制较小的圆圈,而不是从 .s 开始并将环放在上面,您会在相同的一般区域中得到非常相似的错误)。
很确定在这一点上我要么在代码中愚蠢地做了一些明显的事情,要么如果数字比较不够可靠以至于无法工作?但这似乎不可能。这一定是代码错误。
最佳答案
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
关于batch-file - Windows 10 命令。使用IF GEQ进行比较,得到不好的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53808417/