Board logo

标题: 奥运倒计时,请大家帮助完善!!! [打印本页]

作者: bat-zw     时间: 2008-4-16 21:14    标题: 奥运倒计时,请大家帮助完善!!!

在此声明我不是在刻意标榜,而是以一个自豪的中国人身份写下了这段代码:
-----------------------------------
在此严重感谢zh159兄多次测试并指出bug。
-----------------------------------
于2008年4月18日再次更新,加入毫秒倒计时。
@echo off&color ac&mode con cols=50 lines=10
title 奥运倒计时--made by zw19750516(cn-dos)
echo.&echo.&echo.
echo     我们每一个中国人都在期盼这一自豪时刻的到来!
echo.
for /l %%i in (1,1,100) do call,set cls=%%cls%%
goto one
:two
set n=2&set var=08-07&goto begin
:one
set n=1&set var=%date:~5,-4%
:begin
set month=%var:~1,1%&set number=29
set /a month-=1
for /l %%i in (1,1,%month%) do call :lp %%i
set /a number+=100%var:~3,2%%%100
set str=%str% %number%
if not %n% equ 2 goto two
for /f "tokens=1,2" %%i in ("%str%") do set /a day=%%j-%%i
set /a hm=100-1000%time:~9,2%%%1000,m=60-100%time:~6,2%%%100,f=60-100%time:~3,2%%%100,s=43-%time:~,2%
if %hm% equ 100 set /a hm-=100,m+=1
if %m% equ 60 set /a m-=60,f+=1
if %f% equ 60 set /a f-=60,h+=1
if %s% geq 24 set /a s-=24,day+=1
set /p=    离北京奥运开幕还有%day%天%s%小时%f%分%m%秒%hm%毫秒<nul
set /p=%cls%<nul
set n=0&set number=0
goto begin
:lp
for %%i in (1,3,5,7,8,10) do if %%i equ %1 set /a number+=31
for %%i in (4,6,9,11) do if %%i equ %1 set /a number+=30
[ Last edited by zw19750516 on 2008-4-19 at 09:13 PM ]
作者: zh159     时间: 2008-4-16 21:23
出现有的bug
1、60秒(现在离北京奥运开幕还有113天23小时43分60秒)
2、无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。(大概是在52、51秒的时候)

颜色改为4c可能好些

[ Last edited by zh159 on 2008-4-16 at 09:26 PM ]
作者: bat-zw     时间: 2008-4-16 21:26
ls说的问题解决了。
作者: zh159     时间: 2008-4-16 21:32
60秒还没解决
新的问题:
不能显示52、51秒,53秒在3秒后直接跳到50秒

PS:还剩129天???
作者: bat-zw     时间: 2008-4-16 21:37


  Quote:
Originally posted by zh159 at 2008-4-16 21:32:
60秒还没解决
新的问题:
不能显示52、51秒,53秒在3秒后直接跳到50秒

PS:还剩129天???

谢谢楼上60秒60分是我大意了,己解决,但53、52、51的问题不知从何入手!!!

[ Last edited by zw19750516 on 2008-4-16 at 09:49 PM ]
作者: afeichai     时间: 2008-4-16 21:52
颜色用0c更换了。那个颜色太刺眼啦
其他的都正常
作者: afeichai     时间: 2008-4-16 21:54
晕,还是上面的仔细,果真有53、52、51的问题
作者: zh159     时间: 2008-4-16 22:05
53、52、51的问题是你不能直接拿08,09进行计算,set/a会认为是8进制而计算错误(会提示“无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。”,只是闪的太快,不容易发现),所以01-09最好先去掉前面的0
作者: bat-zw     时间: 2008-4-16 22:17    标题: 再次感谢:

再次感谢兄弟,其实我也往这方面想了,因其它的个位数都没问题,就没细想了,现在问题解决了,但代码长了好多。
作者: 26933062     时间: 2008-4-17 00:15
当小时为 0 点时,代码无法正确运行,
另:使用cls 给人一种很不舒服的跳动感,建议用退格键来完成。
作者: 26933062     时间: 2008-4-17 02:05
粗略作了一个,不知道计算方面有没有错误。
:
@echo off&color ac&mode con cols=50 lines=10
for /l %%a in (1 1 100) do call set "t=%%t%%"
for /f "tokens=1-3 delims=./- " %%a in ("%date%") do (
  set /a sy=%%a,sm=100%%b%%100,sd=100%%c%%100
)
for /l %%i in (%sm% 1 8) do call :loop %%i
set /a mt-=sd
for /f "tokens=1-3 delims=.: " %%a in ("%time%") do (
  set /a ss=20-100%%a%%100-1,ff=60-100%%b%%100,mm=60-100%%c%%100
)
echo.&echo.
echo     我们每个中国人都在期盼这一自豪时刻的到来!
echo.&echo.
set var=%time:~7,1%
:lis
if %mm% equ 0 set /a ff-=1,mm=59
if %ff% equ 0 set /a ss-=1,ff=59
if %ss% lss 0 set /a ss=%ss:~-1%,mt-=1
if %ss% equ 0 set /a ss=23,mt-=1
set /p=  现在离北京奥运开幕还有%mt%天%ss%小时%ff%分%mm:~-2%秒%time:~9%毫秒<nul
set /p=%t%<nul
set num=%time:~7,1%
if %var% neq %num% (set/a mm-=1&set var=%time:~7,1%)
goto lis
:loop
for /f "tokens=%~1" %%a in ("31 29 31 30 31 30 31 8") do set /a mt+=%%a
goto :eof

作者: bat-zw     时间: 2008-4-17 09:31    标题: 测试成功:

真的是离兄弟的差距太远,学习了!!!
作者: bat-zw     时间: 2008-4-17 09:58    标题: 排版还有点问题:

稍做修改:
@echo off&color ac&mode con cols=50 lines=10
title 奥运倒计时
for /l %%a in (1 1 100) do call set "t=%%t%%"
for /f "tokens=1-3 delims=./- " %%a in ("%date%") do (
  set /a sy=%%a,sm=100%%b%%100,sd=100%%c%%100
)
for /l %%i in (%sm% 1 8) do call :loop %%i
set /a mt-=sd
for /f "tokens=1-3 delims=.: " %%a in ("%time%") do (
  set /a ss=20-100%%a%%100-1,ff=60-100%%b%%100,mm=60-100%%c%%100
)
echo.&echo.
echo     我们每个中国人都在期盼着这一自豪时刻的到来!
echo.&echo.&echo.
set var=%time:~7,1%
:lis
if %mm% equ 0 set /a ff-=1,mm=59
if %ff% equ 0 set /a ss-=1,ff=59
if %ss% lss 0 set /a ss=%ss:~-1%,mt-=1
if %ss% equ 0 set /a ss=23,mt-=1
set /p=   离北京奥运开幕还有%mt%天%ss%小时%ff%分%mm:~-2%秒%time:~9%毫秒<nul
set /p=%t%<nul
set num=%time:~7,1%
if %var% neq %num% (set/a mm-=1&set var=%time:~7,1%)
goto lis
:loop
for /f "tokens=%~1" %%a in ("31 29 31 30 31 30 31 8") do set /a mt+=%%a
goto :eof

作者: qzwqzw     时间: 2008-4-18 09:30
代码有点偷懒
最末尾的100分之一秒是在正计时
而非倒计时

当然
想精确的计算100分之一秒剩余稍微有些困难
因为这段时间内能进行的计算是有限的
如果代码性能太低
等计算出剩余值都指不定过了多少个100分之一秒

另外这也与代码的优化执行策略有关
比如以下这段代码
@echo off
set count=0
set b=0
:loop
set last=%b%
set b=1%time:~9,2%
set /a r=200-b
set /p=%r% <nul
set /a count+=1
if %count% lss 1000 goto loop
pause

作者: 26933062     时间: 2008-4-18 10:22
有道理,好像这样可以显示毫秒的倒计时,不过也看不出来。呵呵。。
:
@echo off
set n=101
for /l %%a in (1 1 100) do (
   set /a n-=1
   call set _%%a=%%n%%
)
:loop
set b=%time:~9%
call set /p=%%_%b%%%<nul
set /p=<nul
set /a count+=1
if %count% lss 1000 goto loop
pause
[ Last edited by 26933062 on 2008-4-18 at 10:25 AM ]
作者: bat-zw     时间: 2008-4-18 15:26
我觉得没必要这么麻烦,但还是佩服你们的精神。
作者: terse     时间: 2008-4-18 19:07
刚才我这里试一下  发现时间显示有问题  也改一个
@echo off&color bc&mode con cols=50 lines=10
for /l %%a in (1 1 100) do call set "t=%%t%%"
echo.&echo.
echo     我们每个中国人都在期盼这一自豪时刻的到来!
echo.&echo.
:at
set/a p2=10%date:~5,2%%%100,p3=10%date:~8,2%%%100
for /f "tokens=%p2%" %%i in ("0 31 60 91 121 152 182 213") do set/a n=221-(%%i+p3)
set atime=%time: =%
for /f "tokens=1-4 delims=:." %%i in ("%atime%") do set/a t1=10%%i%%100,t2=100%%j%%100,t3=10%%k%%100,t4=10%%l%%100
if %t4% gtr 0 set/a t4=100-t4,t3+=1
if %t3% gtr 0 set/a t3=60-t3,t2+=1
if %t2% gtr 0 set/a t2=60-t2,t1+=1
if %t1% gtr 20 (set/a t1=24+20-t1,n-=1) else set/a t1=20-t1
set/p=%t%   现在离北京奥运开幕还有 %n%天%t1%小时%t2%分%t3%秒%t4%<nul
goto at