中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-29 12:38
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已解决][难题]模拟输出数字九宫格 查看 3,701 回复 35
16 发表于 2008-08-10 17:16 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
先抛个砖 成功率太低 那位继续

@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 1 9) do call:lp %%i
pause&goto :eof
:lp
set/a var=!random!%%9+1
if defined .!var! (goto lp)else set/a n+=1&set str=!var! !str!&set .!var!=a
if !n! lss 9 goto lp
for /l %%i in (1 1 9) do set .%%i=
set var=%str%&set n=1
:lp0
for %%a in (!var!) do (
if defined .%%a set var=!var:%%a=!&goto lp0
for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
set %1!n!=%%a&set .%%a=ok
if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
)
set str=&set n=
for /l %%i in (1 1 9) do set .%%i=
for /l %%i in (9 -1 1) do if "!%1%%i!"=="" set str=&set n=&goto lp
for /l %%i in (1 1 9) do set .%%i=&set/p=!%1%%i! <nul
echo.


[ Last edited by terse on 2008-8-10 at 05:23 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +8 2008-08-10 19:13
简单!简单!再简单!
17 发表于 2008-08-10 20:23 ·  中国 浙江 杭州 电信
初级用户
★★
积分 192
发帖 72
注册 2005-07-31 21:10
20年会员
UID 41234
状态 离线
先生成一个规则的矩阵,然后交替进行行列交换,应该可以达到随机效果
18 发表于 2008-08-10 20:32 ·  中国 浙江 杭州 电信
初级用户
★★
积分 192
发帖 72
注册 2005-07-31 21:10
20年会员
UID 41234
状态 离线
感觉很像之前d一个老大出的乱序产生0-99数字的二维版,相关的算法应该都可以借鉴
19 发表于 2008-08-10 22:20 ·  中国 广东 广州 天河区 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
问:对角斜线中的数字是否能出现相同数字
20 发表于 2008-08-11 10:19 ·  中国 广东 广州 天河区 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
弄了一个7*7的……改成9*9 的弄到一半就就停了……

@echo off
setlocal enabledelayedexpansion
set a=0
for %%a in (1 2 3 4 5 6 7) do (set n%%a=%%a)
set /a n0=1,n8=2,n9=3
:a
set /a a+=1,b=0
md TheTest\hang%a%
:b
set /a b+=1
if not exist TheTest\Lie%b% (md TheTest\Lie%b%)
:b-1
set num=!n%random:~1,1%!
if exist TheTest\Hang%a%\!num! (goto :b-1)
if exist TheTest\Lie%b%\!num! (goto :b-1)
md TheTest\Hang%a%\!num!
md TheTest\Lie%b%\!num!
set h%a%=!num! !h%a%!
if %b% equ 7 (goto :b-end) else (goto :b)
:b-end
if %a% equ 7 (goto :end) else (goto :a)
:end
for /l %%a in (1,1,9) do echo,!h%%a!
pause>nul


--------------……这代码不好……

[ Last edited by 523066680 on 2008-8-16 at 05:56 PM ]
21 发表于 2008-08-11 13:16 ·  中国 浙江 杭州 电信
初级用户
★★
积分 192
发帖 72
注册 2005-07-31 21:10
20年会员
UID 41234
状态 离线
想太简单了,撤回17-18楼,
看各位老大解题
22 为我欢呼吧,哈哈... 发表于 2008-08-11 13:50 ·  中国 广东 广州 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
努力想啊想的,终于给我弄出来了,头发白了不少^_^,最主要是在出现死循环的时候如何重置.
乘着奥运的热风,让我满足一下一点点虚荣心吧.


  1. @echo off
  2. title 数字九宫格 Code By cn-dos moniuming
  3. Setlocal Enabledelayedexpansion
  4. for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
  5. :begin
  6. echo.
  7. for /l %%i in (1 1 9) do (set "str%%i=%bat%")
  8. for /l %%a in (9 -1 1) do (call :loop1 %%a)
  9. echo.&pause&goto :begin
  10. :loop1
  11. if "%n%"=="9" (
  12. set "n=0"&echo %var%&set "var="
  13. for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
  14. goto :eof
  15. )
  16. set /a "n+=1"
  17. for /l %%f in (1 1 9) do (
  18. if not defined string%%f (set "string%%f=!str%%f!")
  19. )
  20. :loop2
  21. set /a "ttl+=1"
  22. if "%ttl%"=="30" (
  23. set "ttl=0"&set "var="&set "n=0"
  24. for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
  25. goto :loop1
  26. )
  27. set /a "mdl=%random%%%%1+1"
  28. for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
  29. if defined %%d goto :loop2
  30. set "ttl=0"
  31. set "var=!var! %%d"
  32. set "%%d=dos"
  33. set "str%n%=!str%n%:%%d=!"
  34. )
  35. goto :loop1
moniuming发表于: 2008-08-11 13:31
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
523066680 +8 2008-08-11 14:05
pusofalse +9 2008-08-11 14:25
23 发表于 2008-08-11 14:06 ·  中国 广东 广州 天河区 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
哇 还是穷举的!强!
24 发表于 2008-08-11 14:20 ·  中国 广东 广州 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
Originally posted by 523066680 at 2008-8-11 14:06:
哇 还是穷举的!强!

这个可不是穷举的,呵呵,不过也差不多了,汗...
25 发表于 2008-08-11 14:26 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
18年会员
UID 115804
性别 男
状态 离线
穷举吧。。那个ttl=30
但依然精彩,学习了!
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
26 发表于 2008-08-11 14:30 ·  中国 广东 广州 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
Originally posted by pusofalse at 2008-8-11 14:26:
穷举吧。。那个ttl=30
但依然精彩,学习了!

ttl=30是指每一位数字的计算次数限制在30次以内,如果超过的话就重置
其实取值范围是在已经出现的数字以外取的,并不是穷举
27 发表于 2008-08-14 19:28 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
修正16楼的

@echo off&setlocal enabledelayedexpansion
for /l %%i in (1 1 9) do call:lp %%i
pause&exit
:lp
for /l %%i in (1 1 9) do set .!random!!random!!random!=%%i
for /f "tokens=1,2 delims==" %%i in ('set .') do set str=%%j !str!&set %%i=
for /l %%i in (1 1 9) do set %1%%i=
set var=%str%&set n=1
:lp0
for %%a in (!var!) do (
if defined .%%a set var=!var:%%a=!&goto lp0
for /l %%i in (1 1 %1) do if %%a equ !%%i%n%! set var=!var:%%a=!&goto lp0
set %1!n!=%%a&set .%%a=ok
if !n! lss 9 set/a n+=1&set var=!str:%%a=!&goto lp0
)
set str=&set n=
for /l %%i in (1 1 9) do set .%%i=
if "!%19!"=="" goto lp
for /l %%i in (1 1 9) do set .%%i=&set/p=!%1%%i! <nul
echo.
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +8 2008-08-15 11:53
简单!简单!再简单!
28 精彩!!! 发表于 2008-08-15 11:55 ·  中国 上海 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
好东西
学习了......
29 发表于 2008-08-16 18:07 ·  中国 广东 广州 天河区 电信
银牌会员
★★★★
SuperCleaner
积分 2,362
发帖 1,133
注册 2008-02-02 21:36
18年会员
UID 110072
性别 男
状态 离线
我觉得17楼的方法可行 而且效率很高 看代码
Originally posted by obsolete at 2008-8-10 08:23 PM:
先生成一个规则的矩阵,然后交替进行行列交换,应该可以达到随机效果


@echo off
setlocal enabledelayedexpansion
set h1=123456789
set h2=234567891
set h3=345678912
set h4=456789123
set h5=567891234
set h6=678912345
set h7=789123456
set h8=891234567
set h9=912345678
:a
set /a a=0,b=0
:b
set /a a+=1
:b1
set n=%random:~-1%
if %n% equ 9 set n=8
if not defined Ex%n% (
for /l %%a in (1,1,9) do (call,set hang%%a=!hang%%a! %%h%%a:~!n!,1%%)
) else (goto :b1)
set Ex%n%=ex
if %a% lss 9 goto :b
:c
set /a b+=1
:c1
set n=%random:~-1%
if %n% equ 0 set n=9
if not defined Ex2%n% (echo !hang%n%!) else (goto :c1)
set Ex2%n%=ex
if %b% lss 9 goto :c
pause
for /l %%a in (0,1,9) do (
set Ex%%a=
set Ex2%%a=
set hang%%a=
)
goto :a


[ Last edited by 523066680 on 2008-8-16 at 08:09 PM ]
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
moniuming +8 2008-08-17 13:38
30 精彩!!! 发表于 2008-08-17 13:43 ·  中国 广东 广州 电信
银牌会员
★★★
永远的菜鸟
积分 1,335
发帖 574
注册 2007-11-27 12:50
18年会员
UID 103929
性别 男
来自 广西
状态 离线
真高兴有那么精彩的代码,不过很可惜的是29楼的代码有规律可循,不能在九宫格游戏中运用,否则解题将不会有任何难度.
论坛跳转: