[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理实现文曲星上猜数字游戏

代码做得相当粗糙,如果按规则输入便没问题,但是一但不按规则输出问题就多了,比如要是输入空值是,常常会退出或是运行不下去了,要么也会提示输入相同数字.另外若是输入相同的数字时,有时也会出现运行不下去的情况.希望帮忙多精简一下.

@ECHO off
cls
color 4a
ECHO                        猜数字游戏
ECHO ==========================================================
echo .     规则:系统随机生成4个不同的数字,然后进行猜解.   
echo .     若猜对1个数字,并且位置也正确,刚显示A
echo .      若猜对1个数字,但是位置不正确,刚显示B
echo .     例如,系统给出数字为6 8 2 4,若猜测为 6 2 1 4,则结果显示为2A1B.
echo .     另外若设置第一个数字为9999,刚显示答案,希望大家喜欢这个游戏^^_^^
pause
:loop
set /a a=%random%%%10
rem 设置第一个数字

rem 设置第二个数字
:b
set  /a b=%random%%%10
if %b%==%a% (goto b) else (goto c1)

rem 设置第三个数字
:c1
set /a c=%random%%%10
if %c%==%a%  (goto c1) else (goto c2)
:c2
if %c%==%b% (goto c1) else (goto d1)

rem 设置第四个数字
:d1
set /a d=%random%%%10
if %d%==%a%  (goto d1) else (goto d2)
:d2
if %d%==%b% (goto d1) else (goto d3)
:d3
if %d%==%c% (goto d1) else (goto next1)
:next1
echo 随机四位数已生成^^_^^请进行猜解

set k=1
:reset
:inputx1
set /p x1=请输入第一个数字:
rem x1的要求
rem 暗码 可得答案
if %x1%==9999 (goto anma) else (goto checkx1_00)
:checkx1_00
if %x1%==0 (goto rightx1) else (goto checkx1_0)
:checkx1_0
if %x1%==1 (goto rightx1) else (goto checkx1_1)
:checkx1_1
if %x1%==2 (goto rightx1) else (goto checkx1_2)
:checkx1_2
if %x1%==3 (goto rightx1) else (goto checkx1_3)
:checkx1_3
if %x1%==4 (goto rightx1) else (goto checkx1_4)
:checkx1_4
if %x1%==5 (goto rightx1) else (goto checkx1_5)
:checkx1_5
if %x1%==6 (goto rightx1) else (goto checkx1_6)
:checkx1_6
if %x1%==7 (goto rightx1) else (goto checkx1_7)
:checkx1_7
if %x1%==8 (goto rightx1) else (goto checkx1_8)
:checkx1_8
if %x1%==9 (goto rightx1) else (goto wrongx1)
:wrongx1
echo 数值输入错误,请重新输入 & goto inputx1

:rightx1
:inputx2
set /p x2=请输入第二个数字:
rem x2的要求
if %x2%==0 (goto rightx2) else (goto checkx2_0)
:checkx2_0
if %x2%==1 (goto rightx2) else (goto checkx2_1)
:checkx2_1
if %x2%==2 (goto rightx2) else (goto checkx2_2)
:checkx2_2
if %x2%==3 (goto rightx2) else (goto checkx2_3)
:checkx2_3
if %x2%==4 (goto rightx2) else (goto checkx2_4)
:checkx2_4
if %x2%==5 (goto rightx2) else (goto checkx2_5)
:checkx2_5
if %x2%==6 (goto rightx2) else (goto checkx2_6)
:checkx2_6
if %x2%==7 (goto rightx2) else (goto checkx2_7)
:checkx2_7
if %x2%==8 (goto rightx2) else (goto checkx2_8)
:checkx2_8
if %x2%==9 (goto rightx2) else (goto wrongx2)
:wrongx2
echo 数值输入错误,请重新输入 & goto inputx2

:rightx2
:inputx3
set /p x3=请输入第三个数字:
rem x2的要求
if %x3%==0 (goto rightx3) else (goto checkx3_0)
:checkx3_0
if %x3%==1 (goto rightx3) else (goto checkx3_1)
:checkx3_1
if %x3%==2 (goto rightx3) else (goto checkx3_2)
:checkx3_2
if %x3%==3 (goto rightx3) else (goto checkx3_3)
:checkx3_3
if %x3%==4 (goto rightx3) else (goto checkx3_4)
:checkx3_4
if %x3%==5 (goto rightx3) else (goto checkx3_5)
:checkx3_5
if %x3%==6 (goto rightx3) else (goto checkx3_6)
:checkx3_6
if %x3%==7 (goto rightx3) else (goto checkx3_7)
:checkx3_7
if %x3%==8 (goto rightx3) else (goto checkx3_8)
:checkx3_8
if %x3%==9 (goto rightx3) else (goto x3nul)
:x3nul
if %x3%=="" (goto wrongx3) else (goto rightx3)
:wrongx3
echo 数值输入错误,请重新输入 & goto inputx3

:rightx3
:inputx4
set /p x4=请输入第四个数字:
rem x4的要求
if %x4%==0 (goto inputright) else (goto checkx4_0)
:checkx4_0
if %x4%==1 (goto inputright) else (goto checkx4_1)
:checkx4_1
if %x4%==2 (goto inputright) else (goto checkx4_2)
:checkx4_2
if %x4%==3 (goto inputright) else (goto checkx4_3)
:checkx4_3
if %x4%==4 (goto inputright) else (goto checkx4_4)
:checkx4_4
if %x4%==5 (goto inputright) else (goto checkx4_5)
:checkx4_5
if %x4%==6 (goto inputright) else (goto checkx4_6)
:checkx4_6
if %x4%==7 (goto inputright) else (goto checkx4_7)
:checkx4_7
if %x4%==8 (goto inputright) else (goto checkx4_8)
:checkx4_8
if %x4%==9 (goto inputright) else (goto wrongx4)
:wrongx4
echo 数值输入错误,请重新输入 & goto inputx4


:inputright
rem 设置第二个数字
:x2
if %x2%==%x1% (goto x2) else (goto x3)

rem 设置第三个数字
:x3
if %x3%==%x1%  (goto error) else (goto x3_x2)
:x3_x2
if %x3%==%x2% (goto error) else (goto x4)

rem 设置第四个数字
:x4
if %x4%==%x1%  (goto error) else (goto x4_x2)
:x4_x2
if %x4%==%x2% (goto error) else (goto x4_x3)
:x4_x3
if %x4%==%x3% (goto error) else (goto next2)
:error
echo 输入数字有重复,请重新设置
goto reset
:next2
echo 你输入的数字是:%x1% %x2% %x3% %x4%
pause>nul

;rem 数据处理
set m=0
set n=0
if %x1%==%a% (set /a m+=1) else (goto checkx1_b)
:checkx1_b
if %x1%==%b% (set /a n+=1) else (goto checkx1_c)
:checkx1_c
if %x1%==%c% (set /a n+=1) else (goto checkx1_d)
:checkx1_d
if %x1%==%d% (set /a n+=1) else (goto check_x2)

:check_x2
if %x2%==%a% (set /a n+=1) else (goto checkx2_b)
:checkx2_b
if %x2%==%b% (set /a m+=1) else (goto checkx2_c)
:checkx2_c
if %x2%==%c% (set /a n+=1) else (goto checkx2_d)
:checkx2_d
if %x2%==%d% (set /a n+=1) else (goto check_x3)

:check_x3
if %x3%==%a% (set /a n+=1) else (goto checkx3_b)
:checkx3_b
if %x3%==%b% (set /a n+=1) else (goto checkx3_c)
:checkx3_c
if %x3%==%c% (set /a m+=1) else (goto checkx3_d)
:checkx3_d
if %x3%==%d% (set /a n+=1) else (goto check_x4)

:check_x4
if %x4%==%a% (set /a n+=1) else (goto checkx4_b)
:checkx4_b
if %x4%==%b% (set /a n+=1) else (goto checkx4_c)
:checkx4_c
if %x4%==%c% (set /a n+=1) else (goto checkx4_d)
:checkx4_d
if %x4%==%d% (set /a m+=1) else (goto result)
:result
if %m%==4 (goto allright) else (goto comeon)
:allright
echo 恭喜你猜对了^^_^^ 再来一把吧! 这是第%K%进行猜解
pause>nul
goto loop
:comeon
echo 你的成绩是:%m%A%n%B 要继续加油噢^^_^^ 这是第%k%次进行猜解
set /a k+=1
goto reset

rem 显示答案
:anma
echo 答案为:%a% %b% %c% %d%
goto reset

也发一个

刚写的,楼主可以借鉴下代码中众多的判断语句:
  1. @echo off&color 1f&mode con cols=55 lines=30
  2. setlocal enabledelayedexpansion
  3. title 猜数字游戏 - by zw19750516
  4. set var=A
  5. :begin
  6. set /a a=%random%%%10
  7. for %%a in (%var%) do if %%a equ %a% goto begin
  8. set var=%var% %a%
  9. if "%var:~8%" equ "" goto begin
  10. set var=%var:~2%&set m=0
  11. :again
  12. set /a n=0,v=0,ws=0,s=0,t=10-m
  13. if %t% equ 0 goto end
  14. cls&echo.
  15. echo    请注意你总共只有10次机会,现在还剩下%t%次机会
  16. echo    请输入四个(0-9)内的不相同的整数,中间请用空
  17. echo    格格开,如:1 2 3 4,请不要在数字前加0。
  18. if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
  19. set codes=A
  20. echo.&set /p code=   请在此输入:
  21. echo %code: =%|findstr "[^0-9]"&&goto wrong
  22. for %%a in (%code%) do (
  23.     for %%i in (!codes!) do if %%i equ %%a goto wrong
  24.     set codes=!codes! %%a
  25.     set /a n+=1
  26. )
  27. if %n% neq 4 goto wrong
  28. set codes=%codes:~2%
  29. for %%i in (%codes%) do (
  30.     set str=%%i
  31.     if "!str:~,1!" equ "0" if "!str:~1!" neq "" goto wrong
  32.     if !str! gtr 9 goto wrong
  33. )
  34. for %%a in (%var%) do (
  35.     set /a v+=1,x=0
  36.     for %%i in (%codes%) do (
  37.         set /a x+=1
  38.         if %%a equ %%i (
  39.            if !v! equ !x! (
  40.               set /a ws+=1
  41.               ) else (
  42.               set /a s+=1
  43.            )
  44.         )
  45.     )
  46. )
  47. set /a m+=1
  48. if "%var%" equ "%codes%" goto suc
  49. set _%m%=  %codes%中位置数值均正确的有%ws%个,仅数值正确的有%s%个&goto again
  50. :wrong
  51. cls
  52. echo.&echo     所输入的非合法十进制整数,或数值不合要求,
  53. echo.&echo     或有重复数,或输入数值个数是4个。
  54. ping /n 2 127.1>nul&goto again
  55. :suc
  56. if %m% equ 1 cls&echo.&echo   不会吧,1次就搞定了,你是不是神仙下凡啊?&goto select
  57. if %m% leq 3 cls&echo.&echo   你真是聪明绝顶啊,只用%m%次就猜中了。&goto select
  58. if %m% leq 5 cls&echo.&echo   看来你还是很厉害,用了%m%次就猜中了。&goto select
  59. if %m% leq 9 cls&echo.&echo   呵呵,猜了%m%次,勉强过关了。&goto select
  60. if %m% equ 10 cls&echo.&echo   你太精明了,硬是把机会给用完成功过关。
  61. :select
  62. ping /n 3 127.1>nul
  63. cls&echo.&set select=&set /p select=  是否再来一次(是就输入y/Y,其它任意键退出):
  64. if /i "%select%" equ "y" (goto begin) else (goto exit)
  65. :end
  66. cls&echo.&echo   对不起你已经用完了所有的机会了。正确答案是%var%&goto select
  67. :exit
  68. ping /n 3 127.1>nul
复制代码

[ 本帖最后由 zw19750516 于 2008-6-18 09:58 编辑 ]
***共同提高***

TOP

修改一下:

  1. @echo off&color 1f&mode con cols=55 lines=30
  2. setlocal enabledelayedexpansion
  3. title 猜数字游戏 by zw19750516
  4. echo.&echo.
  5. echo.&echo               ***** 游戏规则 *****
  6. echo.&echo    程序会自动生成一组四个互不相同的0-9内的整数,
  7. echo.&echo    请你根据猜测和判断,每次输入一组四个互不相同
  8. echo.&echo    0-9内的整数,中间请用空格格开,如:1 2 3 4,
  9. echo.&echo    程序会将你每次输入的数组与其生成的数组进行比
  10. echo.&echo    较,并将比较的结果输出屏幕上以帮助你进一步的
  11. echo.&echo    判断,直到你所输入的数组与其生成的数组的数值
  12. echo.&echo    和次序完全相同,或你已用完了所有的猜测机会。
  13. echo.&echo    如果你已经看懂了规则,请按任意键开始本次游戏。
  14. set var=A&pause>nul
  15. :begin
  16. set /a a=%random%%%10
  17. for %%a in (%var%) do if %%a equ %a% goto begin
  18. set var=%var% %a%
  19. if "%var:~8%" equ "" goto begin
  20. set var=%var:~2%&set m=0
  21. :again
  22. set /a n=0,v=0,ws=0,s=0,t=10-m
  23. if %t% equ 0 goto end
  24. cls&echo.&echo    请注意你总共只有10次机会,现在还剩下%t%次机会
  25. if "%m%" neq "0" for /l %%i in (1,1,%m%) do echo.&echo !_%%i!
  26. set codes=A
  27. echo.&set /p code=   请在此输入:
  28. echo %code: =%|findstr "[^0-9]"&&goto wrong
  29. for %%a in (%code%) do (
  30.     for %%i in (!codes!) do if %%i equ %%a goto wrong
  31.     set codes=!codes! %%a
  32.     set /a n+=1
  33. )
  34. if %n% neq 4 goto wrong
  35. set codes=%codes:~2%
  36. for %%i in (%codes%) do (
  37.     set str=%%i
  38.     if "!str:~1!" neq "" goto wrong
  39. )
  40. for %%a in (%var%) do (
  41.     set /a v+=1,x=0
  42.     for %%i in (%codes%) do (
  43.         set /a x+=1
  44.         if %%a equ %%i if !x! equ !v! (
  45.            set /a ws+=1,s+=1
  46.            ) else (
  47.            set /a s+=1
  48.         )
  49.     )
  50. )
  51. set /a m+=1
  52. if "%var%" equ "%codes%" goto suc
  53. set _%m%=  %codes%中数值正确的有%s%个,其中位置数值都正确的有%ws%个&goto again
  54. :wrong
  55. cls
  56. echo.&echo     所输入的非合法十进制整数,或数值不合要求,
  57. echo.&echo     或有重复数,或输入的数值个数不是4个。
  58. ping /n 2 127.1>nul&goto again
  59. :suc
  60. if %m% equ 1 cls&echo.&echo   不会吧,1次就搞定了,你是不是神仙下凡啊?&goto select
  61. if %m% leq 3 cls&echo.&echo   你真是聪明绝顶啊,只用%m%次就猜中了。&goto select
  62. if %m% leq 5 cls&echo.&echo   看来你还是很厉害,用了%m%次就猜中了。&goto select
  63. if %m% leq 9 cls&echo.&echo   呵呵,猜了%m%次,勉强过关了。&goto select
  64. if %m% equ 10 cls&echo.&echo   你太精明了,硬是把机会给用完成功过关。
  65. :select
  66. ping /n 3 127.1>nul
  67. cls&echo.&set select=&set /p select=  是否再来一次(是就输入y/Y,其它任意键退出):
  68. if /i "%select%" equ "y" (goto begin) else (goto exit)
  69. :end
  70. cls&echo.&echo   对不起你已经用完了所有的机会了。正确答案是%var%&goto select
  71. :exit
  72. ping /n 3 127.1>nul
复制代码

[ 本帖最后由 zw19750516 于 2008-6-19 01:08 编辑 ]
***共同提高***

TOP

返回列表