中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [分享]数字九宫格游戏[8月29日更新]
作者:
标题: [分享]数字九宫格游戏[8月29日更新] 上一主题 | 下一主题
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『楼 主』:  [分享]数字九宫格游戏[8月29日更新]

闲时让大家活跃一下大脑,希望大家喜欢...
@echo off
title 数字九宫格游戏 Code By cn-dos moniuming
color 1e
Setlocal Enabledelayedexpansion
for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
:begin
echo.&echo 1~6为难度选择,3为默认的难度
set "input=3"
echo.&set /p input=请输入:
echo.
if %input% gtr 6 (echo.&echo 选择错误&goto :begin)
for /l %%i in (1 1 9) do (set "str%%i=%bat%")
for /l %%a in (9 -1 1) do (call :loop1 %%a)
echo.&echo 选择 0 偷看答案(默认,哈哈),其它任意字符打开新的游戏
:again
set "in=0"
echo.&set /p in=请选择:
echo.
if /i "%in%"=="0" (
   for /l %%l in (9 -1 1) do (echo !ming%%l!)
)
goto :begin
:loop1
set "dfc=1"
if "%n%"=="9" (
   for /l %%k in (1 1 9) do (set "%%k=")
   set "ming%1=!var!"
   call :loop3
   set "n=0"&echo !var!&set "var="
   for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
   goto :eof
)
set /a "n+=1"
for /l %%f in (1 1 9) do (
   if not defined string%%f (set "string%%f=!str%%f!")
)
:loop2
set /a "ttl+=1"
if "%ttl%"=="30" (
   set "ttl=0"&set "var="&set "n=0"
   for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
   goto :loop1
)
set /a "mdl=%random%%%%1+1"
for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
   if defined %%d goto :loop2
   set "ttl=0"
   set "var=!var! %%d"
   set "%%d=dos"
   set "str%n%=!str%n%:%%d=!"
)
goto :loop1
:loop3
set /a "num1=%random%%%9+1"
for /f "tokens=%num1%" %%g in ("%var%") do (
   if defined %%g goto :loop3
   set "var=!var:%%g=_!"
   set "%%g=god"
)
if "%dfc%"=="%input%" (
   for /l %%h in (1 1 9) do (set "%%h=")
   goto :eof
) else (
   set /a "dfc+=1"&goto :loop3
)
2楼已经更新为输入改变字符

9楼已经更新,提高了效率

13楼已经更新,真正的九宫格游戏

14楼已经更新,正式版的九宫格游戏,增加了新功能

[ Last edited by moniuming on 2008-8-29 at 07:14 PM ]

   此帖被 +8 点积分        点击查看详情   
评分人:【 523066680 分数: +8  时间:2008-8-14 20:16


2008-8-11 15:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 2 楼』:  

已经更新为实现输入更改数字,更直观!!!
@echo off&Setlocal Enabledelayedexpansion
title 数字九宫格游戏 Code By cn-dos moniuming
color 1e
echo.&echo   欢迎使用本绿色免安装版九宫格数字游戏, 在进入游戏前请详细阅读此说明
echo.&echo   进入游戏会出现以下的画面,第一行和第一列分别为横坐标和纵坐标,仅作参考
echo.&echo   游戏规则为: 用数字替换各个符号, 使每行和每列都出现 1~9 这 9 个数字
echo.&echo   玩法: 比如下图中要把 4 填在第 9 行第 1 列的位置,输入 491 然后回车即可
echo.&echo   由于本程序存在一些漏洞,所以请严格按要求填写,否则错误的输入将可能无法更改
echo.&echo   请按任意键进入游戏, 祝你玩得愉快...... ^^_^^
echo.
echo        1 2 3 4 5 6 7 8 9
echo.
echo.   1   6 7 + 1 2 3 _ 8 4
echo.   2   1 9 6 4 _ 2 8 - +
echo.   3   8 4 - 9 5 + _ 6 7
echo.   4   3 8 _ 5 4 - + 9 2
echo.   5   + 2 - 7 3 8 _ 1 6
echo.   6   - _ 9 8 6 4 2 3 +
echo.   7   2 3 7 - + _ 1 4 9
echo.   8   5 _ 3 2 1 - 4 7 +
echo.   9   _ 1 8 3 9 7 - 2 5
pause>nul&cls
set "cod= +-_/\#"&set "st=    1 2 3 4 5 6 7 8 9"
for /l %%i in (1 1 9) do (set "bat=!bat! %%i")
:begin
echo.&echo 1~6为难度选择,3为默认的难度
set "input=3"&set "num=0"
echo.&set /p input=请输入:
cls
if %input% gtr 6 (echo.&echo 选择错误&goto :begin)
if %input% lss 1 (echo.&echo 选择错误&goto :begin)
echo %st%&echo.
for /l %%i in (1 1 9) do (set "str%%i=%bat%")
for /l %%a in (9 -1 1) do (call :loop1 %%a)
set "num3=0"
:more_
echo.&echo 请按照"替换数字,行,列"(不包括引号)的顺序连续输入数字
echo 或者ans显示答案(默认),new开启新游戏,out退出本游戏
echo.&set "ent=ans"&set /p ent=请输入:
if /i "%ent%"=="out" (
   cls&for /l %%a in (1 1 9) do echo.
   echo                            谢谢使用本游戏,再见......
   ping -n 4 127.1>nul&exit
)
if /i "%ent%"=="ans" (
   for /l %%l in (9 -1 1) do (echo    !ming%%l!)
   goto :begin
)
if /i "%ent%"=="new" goto :begin
set "ma=%ent:~,1%"&set "mb=%ent:~1,1%"&set "mc=%ent:~2,1%"
for /f "tokens=%mc%" %%a in ("!min%mb%!") do (
   set "min%mb%=!min%mb%:%%a=%ma%!"
)
cls
echo %st%&echo.
for /l %%a in (1 1 9) do (echo %%a  !min%%a!)
goto :more_
:loop1
set "dfc=1"
if "%n%"=="9" (
   for /l %%k in (1 1 9) do (set "%%k=")
   set "ming%1=!var!"
   call :loop3
   set /a "num+=1"
   set "n=0"&echo !num!  !var!&set "var="&set "num2=0"
   for /l %%c in (1 1 9) do (set "%%c="&set "string%%c=")
   goto :eof
)
set /a "n+=1"
for /l %%f in (1 1 9) do (if not defined string%%f (set "string%%f=!str%%f!"))
:loop2
set /a "ttl+=1"
if "%ttl%"=="30" (
   set "ttl=0"&set "var="&set "n=0"
   for /l %%e in (1 1 9) do (set "%%e="&set "str%%e=!string%%e!")
   goto :loop1
)
set /a "mdl=%random%%%%1+1"
for /f "tokens=%mdl%" %%d in ("!str%n%!") do (
   if defined %%d goto :loop2
   set "ttl=0"
   set "var=!var! %%d"
   set "%%d=dos"
   set "str%n%=!str%n%:%%d=!"
)
goto :loop1
:loop3
set /a "num1=%random%%%9+1"
for /f "tokens=%num1%" %%g in ("%var%") do (
   if defined %%g goto :loop3
   set /a "num2+=1"
   call call set "var=%%%%var:%%g=%%cod:~!num2!,1%%%%%%"
   set "%%g=god"
)
if "%dfc%"=="%input%" (
   set /a "num3+=1"
   set "min!num3!=!var!"
   for /l %%h in (1 1 9) do (set "%%h=")
   goto :eof
) else (
   set /a "dfc+=1"&goto :loop3
)
[ Last edited by moniuming on 2008-8-15 at 12:17 PM ]

   此帖被 +23 点积分         点击查看详情   
评分人:【 huahua0919 分数: +15  时间:2008-8-15 14:39
评分人:【 523066680 分数: +8  时间:2008-8-16 10:44


2008-8-15 12:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wgx1688
初级用户





积分 60
发帖 34
注册 2007-4-24
状态 离线
『第 3 楼』:  

捅一下~玩一下~爽~

2008-8-15 14:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 4 楼』:  

其实这个游戏的BUG在于:当一行出现2个同样的数字时,无法更改其中的一个,这样就会出错
当一行中已经输入某个数字,而这个数字是错误的(当然不是重复的),可以把已经输入的数字用字母代替,然后再把它替换,比如:
某行中: 5 2 6 7 _ 1 + - 4 第9位的4应该在第8位,如果先把第8位更改为4,再想把第9位的4更改为其它的数字就无法实现了,正确的做法为先把第9位的4用字母代替,再把第8位改为4即可.(5 2 6 7 _ 1 + - 4==>5 2 6 7 _ 1 + - a==>5 2 6 7 _ 1 + 4 a)

2008-8-15 14:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
huahua0919
银牌会员




积分 1608
发帖 780
注册 2007-10-7
状态 离线
『第 5 楼』:  

佩服你的精神。

2008-8-15 14:39
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 6 楼』:  

哈 我想到一个游戏模式
--确认/返回上一步
能不能用暂时储存,然后让用户有返回的余地
可能做起来会很麻烦吧 只是问问  如果能实现的话 很不错

我没敢面对你的代码。但
我愿意通过写模型的方式,为完善这个游戏尽一份绵薄之力

然后,如果时间允许,我也愿意为游戏结束后的庆祝特效尽一份力
希望大家一起帮忙协助完善这方面。可别只是我一个人做哈 这也是对自己的锻炼

[ Last edited by 523066680 on 2008-8-17 at 06:05 PM ]



综合型编程论坛

我的作品索引
  
2008-8-16 10:47
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 7 楼』:  

写了一个可返回的模型,希望能帮上忙,代码还是比较臃肿的
@echo off
setlocal enabledelayedexpansion
:action
set hang=123_56789
cls &echo %hang%
set /p write="请输入一个数,使其完整:"
if "%write%"=="" goto :action
cls
echo,!hang:_=%write%!

:b
set /p choice="确认这个结果y\返回上一步n:"
if "%choice%"=="y" goto :end
if "%choice%"=="n" (goto :action) else (goto :b)

:end
set end=!hang:_=%write%!
cls
echo %end%
pause




综合型编程论坛

我的作品索引
  
2008-8-17 18:01
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 8 楼』:  



  Quote:
Originally posted by 523066680 at 2008-8-17 18:01:
写了一个可返回的模型,希望能帮上忙,代码还是比较臃肿的
[code]
@echo off
setlocal enabledelayedexpansion
:action
set hang=123_56789
cls &echo %hang%
set /p writ ...

其实看这句就知道返回是不可能的了
set end=!hang:_=%write%!
假设"_"符号有两个,那么,这一行中将会出现两个相同的数字,想单独更改其中一个已经不可能,也就是说,如果输入错误(在同一行中出现两个相同的数字),那么错误的输入将无法更改...

2008-8-17 23:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 9 楼』:  

借鉴523066680的代码(下面链接的31楼),做如下的更新,只提高了效率,未做功能上的改变
http://www.cn-dos.net/forum/view ... id=F6pbks#pid292901
在此非常感谢523066680精彩的代码
@echo off
Setlocal Enabledelayedexpansion
title 数字九宫格游戏
color 1e
echo.&echo   欢迎使用本绿色免安装版九宫格数字游戏, 在进入游戏前请详细阅读此说明
echo.&echo   进入游戏会出现以下的画面,第一行和第一列分别为横坐标和纵坐标,仅作参考
echo.&echo   游戏规则为: 用数字替换各个符号, 使每行和每列都出现 1~9 这 9 个数字
echo.&echo   玩法: 比如下图中要把 4 填在第 9 行第 1 列的位置,输入 491 然后回车即可
echo.&echo   由于本程序存在一些漏洞,所以请严格按要求填写,否则错误的输入将可能无法更改
echo.&echo   请按任意键进入游戏, 祝你玩得愉快...... ^^_^^
echo.
echo        1 2 3 4 5 6 7 8 9
echo.
echo.   1   6 7 + 1 2 3 _ 8 4
echo.   2   1 9 6 4 _ 2 8 - +
echo.   3   8 4 - 9 5 + _ 6 7
echo.   4   3 8 _ 5 4 - + 9 2
echo.   5   + 2 - 7 3 8 _ 1 6
echo.   6   - _ 9 8 6 4 2 3 +
echo.   7   2 3 7 - + _ 1 4 9
echo.   8   5 _ 3 2 1 - 4 7 +
echo.   9   _ 1 8 3 9 7 - 2 5
pause>nul&cls
set "cod= +-_/\#"&set "st=    1 2 3 4 5 6 7 8 9"
:start_
set /a "str=123456789","n=0","a=0","b=0","c=0","line=1","input=3","dfc=1","num3=0"
echo.&echo 1~6为难度选择,3为默认的难度
echo.&set /p input=请输入:
cls
if %input% gtr 6 (echo.&echo 选择错误&goto :begin)
if %input% lss 1 (echo.&echo 选择错误&goto :begin)
:begin
set /a "n+=1"
set "h%n%=%str%"
set "str=%str:~1%%str:~,1%"
if %n% lss 9 goto :begin
for /l %%a in (0,1,9) do (
   set "Ex%%a="
   set "Ex2%%a="
   set "hang%%a="
)
:a
set /a "a+=1"
:a-1
set /a "n=%random%%%9"
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 :a-1)
set "Ex%n%=ex"
if %a% lss 9 goto :a
:b
set /a "b+=1"
:b-1
set /a "n=%random%%%9+1"
if not defined Ex2%n% (set h%b%=!hang%n%!) else (goto :b-1)
set "Ex2%n%=ex"
if %b% lss 9 goto :b
:c
set /a "c+=1"
:c-1
set /a "n1=%random%%%9+1"
set /a "n2=%random%%%9+1"
if %n1% equ %n2% goto :c-1
for /l %%a in (1,1,9) do (
   set "h%%a=!h%%a:%n1%=n!"
   set "h%%a=!h%%a:%n2%=%n1%!"
   set "h%%a=!h%%a:n=%n2%!"
)
if %c% lss 3 goto :c
for /l %%a in (1,1,9) do (call set hi%%a=%%h%%a%%)
:loop1
set /a "num1=%random%%%9+1"
if defined %num1% goto :loop1
set "%num1%=god"
for /f "tokens=%num1%" %%g in ("!hi%line%!") do (
   set /a "num2+=1"
   call call set "hi%line%=%%%%hi%line%:%%g=%%cod:~!num2!,1%%%%%%"
)
if %dfc% lss %input% (set /a "dfc+=1"&goto :loop1)
for /l %%a in (1 1 9) do (set "%%a=")
Rem set "num2=0"
set /a "num3+=1","num2=0"
if %num3% lss 9 (set /a "line+=1"&set "dfc=1"&goto :loop1)
echo %st%&echo.
for /l %%a in (1 1 9) do (call echo %%a  %%hi%%a%%)
:more_
echo.&echo 请按照"替换数字,行,列"(不包括引号)的顺序连续输入数字
echo 或者ans显示答案(默认),new开启新游戏,out退出本游戏
echo.&set "ent=ans"&set /p ent=请输入:
if /i "%ent%"=="out" (
   cls&for /l %%a in (1 1 9) do echo.
   echo                            谢谢使用本游戏,再见......
   ping -n 4 127.1>nul&exit
)
if /i "%ent%"=="ans" (
   for /l %%l in (1 1 9) do (echo    !h%%l!)
   goto :start_
)
if /i "%ent%"=="new" goto :start_
set "ma=%ent:~,1%"&set "mb=%ent:~1,1%"&set "mc=%ent:~2,1%"
for /f "tokens=%mc%" %%a in ("!hi%mb%!") do (
   set "hi%mb%=!hi%mb%:%%a=%ma%!"
)
cls
echo %st%&echo.
for /l %%a in (1 1 9) do (echo %%a  !hi%%a!)
goto :more_
[ Last edited by moniuming on 2008-8-18 at 02:07 AM ]

2008-8-18 01:37
查看资料  发短消息 网志   编辑帖子  回复  引用回复
flyinspace
银牌会员





积分 1206
发帖 517
注册 2007-3-25
状态 离线
『第 10 楼』:  

提示:

Call :数独游戏原始模型生成

call :按表生成随机空格,并生成空格列表。

call :游戏表


假设

set "Table_00=123456789"
set "Table_01=123456789"
……
set "Table_09=123456789"

上面为实际答案。

下面就是 :

set "nTable_00=12_4_6789"
……
set "nTable_09=1_3__6__9"

如此,用户接受输入列表
自动生成。
set "ITable_00_[这里是可变值,表示空格位置]=-"

生成序列:

假设用户修改第三行,第4列数字。
用户输入:34

程序判断:if "%ITable_02_3%"=="" (
                        echo "该数字所在位置为非空格"
                        goto :EOF
                       )
:reInput
               set /p "ITable_02_3=请输入您要输入的值:"
               call :验证输入是否正确,不正确直接返回:input
               goto :EOF

[ Last edited by flyinspace on 2008-8-18 at 01:52 AM ]



知,不觉多。不知,乃求知
2008-8-18 01:38
查看资料  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 11 楼』:  

学到了一样东西 原来可以多重call啊 学习了!



综合型编程论坛

我的作品索引
  
2008-8-18 08:28
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
hearo
新手上路





积分 2
发帖 1
注册 2008-8-19
状态 离线
『第 12 楼』:  

楼上都是高手啊!1俺一大菜鸟什么都看不懂啊!!

2008-8-19 23:39
查看资料  发短消息 网志  OICQ (295067198)  编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 13 楼』:  

看了这个帖子才知道真正的九宫格游戏原来是这样的,已经更新,谢谢 flyinspace.

http://www.cn-dos.net/forum/view ... 2306&sid=5zTDSe

由于要避免死循环的出现,代码臃肿,效率较低...
@echo off
title 数额九宫格游戏 Code By CN-DOS Moniuming
Setlocal Enabledelayedexpansion
color 1e
echo.&echo   欢迎使用本绿色免安装版九宫格数字游戏, 在进入游戏前请详细阅读此说明
echo.&echo   进入游戏会出现以下的画面,第一行和第一列分别为横坐标和纵坐标,仅作参考
echo.&echo   游戏规则为: 用数字替换各个符号, 使每行和每列都出现 1~9 这 9 个数字,
echo.&echo       并且每个 3^*3 的区域里也要包含 1~9 这 9 个数字.
echo.&echo   玩法: 比如下图中要把 7 填在第 1 行第 1 列的位置,输入 711 然后回车即可
echo.&echo   由于本程序存在一些漏洞,所以请严格按要求填写,否则错误的输入将可能无法更改
echo.&echo   请按任意键进入游戏, 祝你玩得愉快...... ^^_^^
echo.&echo        1 2 3 4 5 6 7 8 9
echo.
echo.   1   / 3 _ 2 8 6 1 + -
echo.   2   1 2 9 / - 3 _ + 8
echo.   3   _ / - + 4 9 3 2 7
echo.   4   5 _ 3 - 9 / + 7 1
echo.   5   - 9 _ 7 + 1 5 / 4
echo.   6   4 - 7 3 5 2 + / _
echo.   7   _ 8 1 - 3 5 / 6 +
echo.   8   6 + 5 / 2 - 4 1 _
echo.   9   3 4 2 6 + _ 9 / -
pause>nul&cls
set "cod= +-_/\#"&set "st=    1 2 3 4 5 6 7 8 9"
for /l %%a in (1 1 9) do (set "bat=!bat! %%a")
:again
set "input=4"
echo.&echo 1~6为难度选择,4为默认的难度
echo.&set /p input=请输入:
cls
if %input% gtr 6 (echo.&echo 选择错误&goto :again)
if %input% lss 1 (echo.&echo 选择错误&goto :again)
for /l %%i in (1 1 9) do echo.
echo                              正在生成游戏,请稍候...
:lp1
for /l %%a in (1 1 3) do (set "str%%a=%bat%")
set /a "a=1","ran=9","lie=1","hng=1","dfc=1","line=1","num2=0","num3=0"
:lp2
if not defined rand set "rand=%ran%"
if "%hng%"=="10" (
   for /l %%i in (1 1 9) do (set "mo%%i=!moniuming%%i!")
   call :lp3
   set /a "ttl=0","tot=0","b=0","hang=0"
   set "rand="&set "var="
   for /l %%a in (1 1 9) do (set "%%a="&set "moniuming%%a=")
   for /l %%a in (1 1 8) do (
      for /l %%b in (1 1 9) do (set str%%a%%b=)
   )
   goto :again
)
if "%lie%"=="10" (
   for /l %%i in (1 1 3) do (set "moniuming%hng%=!moniuming%hng%!!va%%i!")
   for /l %%i in (1 1 9) do (set "%%i=")
   set /a "hang+=1","hng+=1","ran-=3","lie=1","b=0","ttl=0","v=0","a=1","tot=0"
   set "rand="
   if "!hang!"=="3" (
      for /l %%a in (1 1 3) do (set "str%%a=%bat%")
      set "ran=9"&set "hang=0"
   )
   for /l %%i in (1 1 3) do (set "string%%i=!str%%i!")
   goto :lp2
)
if "%tot%"=="10" (
   set /a "ttl=0","tot=0","b=0","hang=0"
   set "rand="&set "var="
   for /l %%a in (1 1 9) do (set "%%a="&set "moniuming%%a=")
   for /l %%a in (1 1 8) do (
      for /l %%b in (1 1 9) do (set str%%a%%b=)
   )
   goto :lp1
)
set /a "ttl+=1"
if "%ttl%"=="40" (
   for /l %%i in (1 1 3) do (set "str%%i=!string%%i!")
   for /l %%i in (1 1 9) do (set "%%i="&set "str!hng!%%i=")
   set /a "ran=%rand%","lie=1","ttl=0","a=1","b=0","v=0","tot+=1"
   set "var="
   goto :lp2
)
set /a "m=%random%%%%ran%+1"
for /f "tokens=%m%" %%a in ("!str%a%!") do (
   if defined %%a goto :lp2
   for /l %%i in (1 1 %hng%) do (if "%%a"=="!str%%i%lie%!" goto :lp2)
   set "%%a=god"&set "str%a%=!str%a%:%%a=!"&set "str!hng!!lie!=%%a"&set "var=!var! %%a"
)
set /a "ran-=1","b+=1","lie+=1","ttl=0"
if %b% lss 3 goto :lp2
set /a "v+=1","a+=1","ran+=3","b=0"
set "va%v%=%var%"&set "var="
goto :lp2
:lp3
set /a "num1=%random%%%9+1"
if defined %num1% goto :lp3
set "%num1%=god"
for /f "tokens=%num1%" %%g in ("!mo%line%!") do (
   set /a "num2+=1"
   call call set "mo%line%=%%%%mo%line%:%%g=%%cod:~!num2!,1%%%%%%"
)
if %dfc% lss %input% (set /a "dfc+=1"&goto :lp3)
for /l %%a in (1 1 9) do (set "%%a=")
set /a "num3+=1","num2=0"
if %num3% lss 9 (set /a "line+=1"&set "dfc=1"&goto :lp3)
cls&echo %st%&echo.
for /l %%a in (1 1 9) do (call echo %%a  %%mo%%a%%)
:lp4
echo.&echo 请按照"替换数字,行,列"(不包括引号)的顺序连续输入数字
echo 或者ans显示答案(默认),new开启新游戏,out退出本游戏
echo.&set "ent=ans"&set /p ent=请输入:
if /i "%ent%"=="out" (
   cls&for /l %%a in (1 1 9) do echo.
   echo                            谢谢使用本游戏,再见......
   ping -n 4 127.1>nul&exit
)
if /i "%ent%"=="ans" (
   for /l %%l in (1 1 9) do (echo    !moniuming%%l!)
   goto :eof
)
if /i "%ent%"=="new" goto :eof
set "ma=%ent:~,1%"&set "mb=%ent:~1,1%"&set "mc=%ent:~2,1%"
for /f "tokens=%mc%" %%a in ("!mo%mb%!") do (
   set "mo%mb%=!mo%mb%:%%a=%ma%!"
)
cls
echo %st%&echo.
for /l %%a in (1 1 9) do (echo %%a  !mo%%a!)
goto :lp4


2008-8-21 15:11
查看资料  发短消息 网志   编辑帖子  回复  引用回复
moniuming
银牌会员

永远的菜鸟



积分 1335
发帖 574
注册 2007-11-27
来自 广西
状态 离线
『第 14 楼』:  

这个代码的核心部分用的是terse的代码,只作了一些小小的优化,避免了一些重复的返回,提高了一点儿效率
这应该是最后的更新了,增加了以下功能:
1.在一行和一列中不允许重复,如果输入错误请用任一字母过渡
2.对结果进行验证,如果正确会有一个无聊的小动画

欢迎大家测试
@echo off
Setlocal Enabledelayedexpansion
rem 核心代码terse  游戏moniuming
color 3e&title 数字九宫格游戏
echo.&echo   欢迎使用本绿色免安装版九宫格数字游戏, 在进入游戏前请详细阅读此说明,
echo.&echo   进入游戏会出现以下的画面,第一行和第一列分别为横坐标和纵坐标,仅作参考,
echo.&echo   游戏规则为: 用数字替换各个符号, 使每行和每列都出现 1~9 这 9 个数字,
echo.&echo       并且 9 个 3^*3 的区域里也要包含 1~9 这 9 个数字. (左图^=^=^>右图)
echo.&echo   玩法: 比如下图中要把 4 填在第 3 行第 1 列的位置,输入 431 然后回车即可.
echo.&echo   请按任意键进入游戏, 祝你玩得愉快...... ^^_^^
echo.&echo        1 2 3 4 5 6 7 8 9
echo.
echo.   1   6 8 7 _ / 1 - + 2               6 8 7 4 9 1 5 3 2
echo.   2   9 3 - 5 8 _ / + 7               9 3 1 5 8 2 4 6 7
echo.   3   / 5 _ 3 + 7 1 8 -               4 5 2 3 6 7 1 8 9
echo.   4   / 6 4 - 1 + _ 9 8               5 6 4 2 1 3 7 9 8
echo.   5   2 9 8 7 5 + / _ -               2 9 8 7 5 6 3 1 4
echo.   6   7 - _ 9 4 + 2 5 /               7 1 3 9 4 8 2 5 6
echo.   7   _ 4 9 6 + 5 / - 1               3 4 9 6 7 5 8 2 1
echo.   8   - _ 5 8 / + 6 4 3               1 7 5 8 2 9 6 4 3
echo.   9   _ / 6 - 3 4 9 + 5               8 2 6 1 3 4 9 7 5
pause>nul&cls
set "cod= +-_/\#"&set "st=   1 2 3 4 5 6 7 8 9"&set "color_=12345689abcde"
set "kong=               "
set "echo_=好 极 了, 完 全 正 确, 恭 喜 你, 继 续 努 力 喔        "
for /l %%a in (1 1 80) do (set "tui=!tui!")
:again
color 3e&set "input=4"
for /l %%a in (1 1 9) do (
   for /l %%b in (1 1 9) do (set "_%%a%%b="&set "%%a%%b=")
)
echo.&echo 1~6为难度选择,4为默认的难度
echo.&set /p input=请输入:
cls
if %input% gtr 6 (echo.&echo 选择错误&goto :again)
if %input% lss 1 (echo.&echo 选择错误&goto :again)
for /l %%i in (1 1 9) do echo.
echo                              正在生成游戏,请稍候...
:st
for /l %%i in (1 1 9) do (set "mor%%i="&set "%%i=")
for /l %%i in (1 1 9) do call:lp %%i
for /l %%a in (1 1 9) do (set "moniuming%%a=!mor%%a!")
:lp3
set /a "num1=%random%%%9+1"
if defined %num1% goto :lp3
set "%num1%=god"
for /f "tokens=%num1%" %%g in ("!mor%line%!") do (
   set /a "num2+=1","_%line%%num1%=god"
   call set "%line%%num1%=%%cod:~!num2!,1%%"
   call call set "mor%line%=%%%%mor%line%:%%g=%%cod:~!num2!,1%%%%%%"
)
if %dfc% lss %input% (set /a "dfc+=1"&goto :lp3)
for /l %%a in (1 1 9) do (set "%%a=")
set /a "num3+=1","num2=0"
if %num3% lss 9 (set /a "line+=1"&set "dfc=1"&goto :lp3)
cls&echo %st%&echo.
for /l %%a in (1 1 9) do (call echo %%a  %%mor%%a%%)
:lp4
echo.&echo 请按照"替换数字,行,列"(不包括引号)的顺序连续输入数字
echo 或者ans显示答案(默认),new开启新游戏,out退出本游戏
:lp5
color 3e&echo.&set "ent=ans"&set /p ent=请输入:
if /i "%ent%"=="out" (
   cls
   for /l %%a in (1 1 9) do echo.
   echo                            谢谢使用本游戏,再见......
   ping -n 4 127.1>nul&exit
)
if /i "%ent%"=="ans" (
   for /l %%l in (1 1 9) do (echo    !moniuming%%l!)
   goto :again
)
if /i "%ent%"=="new" cls&goto :again
set "ma=%ent:~,1%"&set "mb=%ent:~1,1%"&set "mc=%ent:~2,1%"
if not defined _%mb%%mc% (
   color fc&echo.&echo 第%mb%行第%mc%列为非替换位置
   ping -n 3 127.1>nul&goto :lp5
)
for %%a in (!mor%mb%!) do (
   if "%%a"=="%ma%" (
      color fc&echo.&echo 第 %mb% 行已经存在 "%ma%"
      ping -n 3 127.1>nul&goto :lp5
   )
)
for /l %%a in (1 1 9) do (
   if "%ma%"=="!%%a%mc%!" (
      color fc&echo.&echo 第 %mc% 列已经存在 "%ma%"
      ping -n 3 127.1>nul&goto :lp5
   )
)
for /f "tokens=%mc%" %%a in ("!mor%mb%!") do (
   set "mor%mb%=!mor%mb%:%%a=%ma%!"&set "%mb%%mc%=%ma%"
)
cls
echo %st%&echo.
for /l %%a in (1 1 9) do (echo %%a  !mor%%a!)
for /l %%a in (1 1 9) do (if "!mor%%a!"=="!moniuming%%a!" (set /a right+=1))
if "%right%"=="9" (
   call :lp6
   set "right=0"&goto :again
)
set "right=0"
goto :lp4
: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/a lie=1,hx=1,hy=%1-1,lx=1,ly=3,a=%1%%3,dfc=1,line=1,num2=0,num3=0
if %1 geq 4 (
   if %1 leq 6 (set/a hx=4) else (set hx=7)
)
:lp0
if %lie% geq 4 (
   if %lie% leq 6 (set/a lx=4,ly=6) else (set/a lx=7,ly=9)
)
for %%a in (!var!) do (
   for /l %%i in (1 1 %1) do (
      if %%a equ !%%i%lie%! (set var=!var:%%a=!&goto lp0)
   )
   if %a% neq 1 (
      for /l %%j in (%hx% 1 %hy%) do (
         for /l %%k in (%lx% 1 %ly%) do (
            if %%a equ !%%j%%k! set "var=!var:%%a=!"&goto lp0
         )
      )
   )
   set "%1!lie!=%%a"
   if !lie! lss 9 (set/a lie+=1&set "str=!str:%%a=!"&set "var=!str!"&goto lp0)
)
set "str="&set "lie="
if "!%19!"=="" set/a ttl+=1&if !ttl! gtr 40 (set "ttl="&goto st) else goto lp
for /l %%i in (1 1 9) do (set "mor%1=!mor%1!!%1%%i! ")
set "ttl="&goto :eof
:lp6
echo.
for /l %%a in (1 1 40) do (
   set "show=!echo_:~0,%%a!"
   set /a "col1=!random!%%13","col2=!random!%%13"
   if not "!col1!"=="!col2!" call color %%color_:~!col1!,1%%%%color_:~!col2!,1%%
   set /p=!tui!!kong!!show!<nul
   ping -n 1 127.1>nul
)
echo.
[ Last edited by moniuming on 2008-8-30 at 12:28 AM ]

2008-8-29 19:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: