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

[游戏娱乐] 俄罗斯方块游戏批处理

本游戏需要choice.exe三方工具

第一版,只有基本图标方块
  1. @echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 1.0
  2. if "%1" equ "para2" goto :para2
  3. set "d-v=for /l %%a in (0,1,#) do set/a one=0x!str:~%%a,1!,x=one/4+n,y=one%%4+m&(for %%b in ("r!x!.!y!") do if "!%%~b!" equ " " (set r!x!.!y!=■) else (set err=1))"
  4. ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v:#=图标点数%)
  5. ::变量使用:one  x  y
  6. set "d-e=set aec=!cr!!cr! ┌───────────┐!cr!&(for /l %%a in (2,1,#) do for %%b in ("│!ebuf:@=%%a!│  !ebu%%a!") do set aec=!aec! %%~b!cr!)&cls&echo;!aec! └───────────┘"
  7. ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
  8. set ebu4=第!guan!关
  9. set ebu6=总分:!fen!
  10. set cr=^
  11. ::各种图标定义
  12. set ga1=0156
  13. set ga2=1458
  14. ::■■
  15. ::  ■■
  16. set gb1=1245
  17. set gb2=0459
  18. ::  ■■
  19. ::■■
  20. set za1=4567
  21. set za2=159d
  22. ::■■■■
  23. set qa1=1598
  24. set qa2=0456
  25. set qa3=0148
  26. set qa4=0126
  27. ::■■
  28. ::  ■
  29. ::  ■
  30.   
  31. set qb1=0489
  32. set qb2=0124
  33. set qb3=0159
  34. set qb4=2456
  35. ::■■
  36. ::■
  37. ::■
  38. ::cdef
  39. ::89ab
  40. ::4567
  41. ::0123
  42. set ta1=0145
  43. ::■■
  44. ::■■
  45. set sa1=0125
  46. set sa2=1459
  47. set sa3=1456
  48. set sa4=0458
  49. ::  ■
  50. ::■■■
  51. echo 0 2 >%~n0.tmp
  52. start "aswd" %0 para2
  53. ::起动控制窗口
  54. set k3=k%%=mx,k+
  55. set k4=down
  56. set k1=m-
  57. set k2=m+
  58. set k5=t+
  59. ::按键定义
  60. setlocal enabledelayedexpansion
  61. for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
  62. for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2) do (
  63. for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
  64.   set _%%b=%%c
  65.   for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
  66. )
  67. )
  68. ::定义各种图型的可变型数,及单个图的随机号
  69. :restart
  70. for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
  71. set/a fen=0,guan=1
  72. ::初始化坐标空间18行,10列
  73. :loop
  74. set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
  75. set/a r=!random!%%nx+1
  76. set err=
  77. set ttr=!_ttr!
  78. set _ttr=!ran%r%!
  79. ::随机取一个图标,
  80. if not defined ttr goto :loop
  81. set mx=!_%ttr:~,2%!
  82. set k=%ttr:~2%
  83. set str=!%ttr%!
  84. set _str=!%_ttr%!
  85. setlocal enabledelayedexpansion
  86. for /l %%a in (0,1,3) do set/a one=0x!_str:~%%a,1!,x=one/4+8,y=one%%4&set kk!x!.!y!=■
  87. for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
  88. if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
  89. )
  90. endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
  91. ::对预备图标的处理
  92. :cont
  93. set/p var=<%~n0.tmp
  94. for /f "tokens=1,2" %%a in ("%var%") do (
  95. if %%a neq !test! (
  96.   if %%b geq 6 call :error %%b&del /q %~n0.tmp&exit
  97.   set bs=!str!&set/a bm=m,bk=k
  98.   set/a !k%%b!=1
  99.   if "%%b" equ "3" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
  100.   setlocal enabledelayedexpansion
  101.   (%d-v:#=3%)
  102.   rem 调用函数把图标点放置到总坐标空间
  103.   if defined err (
  104.    endlocal
  105.    set/a m=bm,k=bk
  106.    set str=!bs!
  107.   ) else (
  108.    (%d-e:#=18%)
  109.    rem 调用显示函数
  110.    endlocal
  111.   )
  112. )
  113. set test=%%a
  114. )
  115. set ti=1!time:~7,1!!time:~9,2!
  116. if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
  117. if !tn! gtr !down! (
  118. set/a bti=ti,n+=1
  119. setlocal enabledelayedexpansion
  120. (%d-v:#=3%)
  121. if defined err (
  122.   endlocal
  123.   goto :jmpout
  124. ) else (
  125.   (%d-e:#=18%)
  126.   endlocal
  127. )
  128. )
  129. for /l %%a in (1,1,25) do ver>nul
  130. goto :cont
  131. :jmpout
  132. set/a n-=1
  133. (%d-v:#=3%)
  134. set m=18
  135. for /l %%a in (18,-1,2) do for %%b in ("!ebuf:@=%%a!") do if "%%~b" neq "■■■■■■■■■■■" (set e!m!=%%~b&set/a m-=1)
  136. if !m! neq 1 (
  137. for /l %%a in (!m!,-1,2) do set "e%%a=           "
  138. for /l %%a in (18,-1,2) do (
  139.   for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
  140. )
  141. set/a "fen=fen+(m-1)*10,guan=fen/150+1"
  142. )
  143. if !n! leq 2 (
  144. echo 游戏结束!
  145. ping -n 3 127.1 >nul
  146. goto :restart
  147. )
  148. goto :loop
  149. :para2
  150. mode con: cols=30 lines=2
  151. echo a左 d右 w转 s加速 q退出
  152. :p_lp
  153. set/a n=n%%10+1
  154. choice /c adwsgq /n >nul
  155. >%~n0.tmp echo;%n% %errorlevel%
  156. if %errorlevel% geq 6 exit
  157. for /l %%a in (1,1,12) do ver>nul
  158. goto :p_lp
  159. :error
  160. if %1 equ 6 echo 谢谢使用,再见。。。
  161. if %1 gtr 6 echo 对不起!choice.exe 文件不存在,不能运行。。。
  162. ping -n 3 127.1 >nul
  163. goto :eof
复制代码
第二版,加入混合图标方块
  1. @echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 2.0
  2. if "%1" equ "para2" goto :para2
  3. set "d-v=for %%a in (!str!) do set/a one=0x%%a,x=one/4+n,y=one%%4+m&(for %%b in ("r!x!.!y!") do if "!%%~b!" equ " " (set r!x!.!y!=■) else (set err=1))"
  4. ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v%)
  5. ::变量使用:one  x  y
  6. set "d-e=set aec=!cr!!cr! ┌───────────┐!cr!&(for /l %%a in (2,1,#) do for %%b in ("│!ebuf:@=%%a!│  !ebu%%a!") do set aec=!aec! %%~b!cr!)&cls&echo;!aec! └───────────┘"
  7. ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
  8. set ebu4=第!guan!关
  9. set ebu6=总分:!fen!
  10. set cr=^
  11. ::各种图标定义
  12. set ga1=0 1 5 6
  13. set ga2=1 4 5 8
  14. ::■■
  15. ::  ■■
  16. set gb1=1 2 4 5
  17. set gb2=0 4 5 9
  18. ::  ■■
  19. ::■■
  20. set za1=4 5 6 7
  21. set za2=1 5 9 d
  22. ::■■■■
  23. set qa1=1 5 9 8
  24. set qa2=0 4 5 6
  25. set qa3=0 1 4 8
  26. set qa4=0 1 2 6
  27. ::■■
  28. ::  ■
  29. ::  ■
  30.   
  31. set qb1=0 4 8 9
  32. set qb2=0 1 2 4
  33. set qb3=0 1 5 9
  34. set qb4=2 4 5 6
  35. ::■■
  36. ::■
  37. ::■
  38. set ta1=0 1 4 5
  39. ::■■
  40. ::■■
  41. set sa1=0 1 2 5
  42. set sa2=1 4 5 9
  43. set sa3=1 4 5 6
  44. set sa4=0 4 5 8
  45. ::  ■
  46. ::■■■
  47. set tw1=0 1
  48. set tw2=0 4
  49. set on1=0
  50. set on2=0
  51. set sh1=1 4 5 6 9
  52. set sh2=1 4 5 6 9
  53. set ao1=0 1 2 4 6
  54. set ao2=0 1 4 8 9
  55. set ao3=0 4 5 6 2
  56. set ao4=0 1 5 8 9
  57. set tt1=0 1 2 5 9
  58. set tt2=0 4 8 5 6
  59. set tt3=1 5 8 9 a
  60. set tt4=2 4 5 6 a
  61. ::cdef
  62. ::89ab
  63. ::4567
  64. ::0123
  65. echo 0 2 >%~n0.tmp
  66. start "aswd" %0 para2
  67. ::起动控制窗口
  68. set k3=k%%=mx,k+
  69. set k4=down
  70. set k1=m-
  71. set k2=m+
  72. set k5=t+
  73. ::按键定义
  74. setlocal enabledelayedexpansion
  75. for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
  76. for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2 tw_2 on_2 sh_2 ao_4 tt_4) do (
  77. for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
  78.   set _%%b=%%c
  79.   for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
  80. )
  81. )
  82. ::定义各种图型的可变型数,及单个图的随机号
  83. :restart
  84. for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
  85. set/a fen=0,guan=1
  86. ::初始化坐标空间18行,10列
  87. :loop
  88. set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
  89. set/a r=!random!%%nx+1
  90. set err=
  91. set ttr=!_ttr!
  92. set _ttr=!ran%r%!
  93. ::随机取一个图标,
  94. if not defined ttr goto :loop
  95. set mx=!_%ttr:~,2%!
  96. set k=%ttr:~2%
  97. set str=!%ttr%!
  98. set _str=!%_ttr%!
  99. setlocal enabledelayedexpansion
  100. for %%a in (!_str!) do set/a one=0x%%a,x=one/4+8,y=one%%4&set kk!x!.!y!=■
  101. for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
  102. if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
  103. )
  104. endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
  105. ::对预备图标的处理
  106. :cont
  107. set/p var=<%~n0.tmp
  108. for /f "tokens=1,2" %%a in ("%var%") do (
  109. if %%a neq !test! (
  110.   if %%b geq 6 call :error %%b&del/q %~n0.tmp&exit
  111.   set bs=!str!&set/a bm=m,bk=k
  112.   set/a !k%%b!=1
  113.   if "%%b" equ "3" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
  114.   setlocal enabledelayedexpansion
  115.   (%d-v%)
  116.   rem 调用函数把图标点放置到总坐标空间
  117.   if defined err (
  118.    endlocal
  119.    set/a m=bm,k=bk
  120.    set str=!bs!
  121.   ) else (
  122.    (%d-e:#=18%)
  123.    rem 调用显示函数
  124.    endlocal
  125.   )
  126. )
  127. set test=%%a
  128. )
  129. set ti=1!time:~7,1!!time:~9,2!
  130. if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
  131. if !tn! gtr !down! (
  132. set/a bti=ti,n+=1
  133. setlocal enabledelayedexpansion
  134. (%d-v%)
  135. if defined err (
  136.   endlocal
  137.   goto :jmpout
  138. ) else (
  139.   (%d-e:#=18%)
  140.   endlocal
  141. )
  142. )
  143. goto :cont
  144. :jmpout
  145. set/a n-=1
  146. (%d-v%)
  147. set m=18
  148. for /l %%a in (18,-1,2) do for %%b in ("!ebuf:@=%%a!") do if "%%~b" neq "■■■■■■■■■■■" (set e!m!=%%~b&set/a m-=1)
  149. if !m! neq 1 (
  150. for /l %%a in (!m!,-1,2) do set "e%%a=           "
  151. for /l %%a in (18,-1,2) do (
  152.   for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
  153. )
  154. set/a "fen=fen+(m-1)*10,guan=fen/150+1"
  155. )
  156. if !n! leq 2 (
  157. echo 游戏结束!
  158. ping -n 3 127.1 >nul
  159. goto :restart
  160. )
  161. goto :loop
  162. :para2
  163. mode con: cols=30 lines=2
  164. echo a左 d右 w转 s加速 q退出
  165. :p_lp
  166. set/a n=n%%50+1
  167. choice /c adwsgq /n >nul
  168. >%~n0.tmp echo;%n% %errorlevel%
  169. if %errorlevel% geq 6 exit
  170. for /l %%a in (1,1,25) do ver>nul
  171. goto :p_lp
  172. :error
  173. if %1 equ 6 echo 谢谢使用,再见。。。
  174. if %1 gtr 6 echo 对不起!choice.exe 文件不存在,不能运行。。。
  175. ping -n 3 127.1 >nul
  176. goto :eof
复制代码
3

评分人数

    • Seter: NB..玩玩看~PB + 10
    • more: 牛人!!!PB + 30 技术 + 1
    • wxcute: 很好玩。PB + 15

re more
谢谢找出bug,已经找到原因了,是两进程同时操作一个文件时出的问题,看来这种方法并不稳定,

TOP

re more

问题已经解决,现在可以放心玩了

TOP

发布免三方,不用临时文件版
可惜的是速度减了
  1. @echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 1.3
  2. e100 EB 02 00 00 CD 1A 89 16 02 01 31 C0 CD 1A 3B 16 02 01 75 0E
  3. e114 B4 01 CD 16 74 F0 B4 00 CD 16 88 E0 EB 02 B0 00 B4 4C CD 21
  4. g
  5. set "d-v=for /l %%a in (0,1,#) do set/a one=0x!str:~%%a,1!,x=one/4+n,y=one%%4+m&(for %%b in ("r!x!.!y!") do if "!%%~b!" equ " " (set r!x!.!y!=■) else (set err=1))"
  6. ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v:#=图标点数%)
  7. ::变量使用:one  x  y
  8. set "d-e=set aec=!cr!!cr! ┌───────────┐!cr!&(for /l %%a in (2,1,#) do for %%b in ("│!ebuf:@=%%a!│  !ebu%%a!") do set aec=!aec! %%~b!cr!)&cls&echo;!aec! └───────────┘"
  9. ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
  10. set ebu4=第!guan!关
  11. set ebu6=总分:!fen!
  12. set cr=^
  13. ::各种图标定义
  14. set ga1=0156
  15. set ga2=1458
  16. set gb1=1245
  17. set gb2=0459
  18. set za1=4567
  19. set za2=159d
  20. set qa1=1598
  21. set qa2=0456
  22. set qa3=0148
  23. set qa4=0126
  24. set qb1=0489
  25. set qb2=0124
  26. set qb3=0159
  27. set qb4=2456
  28. set ta1=0145
  29. set sa1=0125
  30. set sa2=1459
  31. set sa3=1456
  32. set sa4=0458
  33. ::按键定义
  34. set k72=k%%=mx,k+
  35. set k80=down
  36. set k75=m-
  37. set k77=m+
  38. set k28=paus%%=2,paus+
  39. set k1=quit
  40. set paus=1
  41. chcp 437 >nul
  42. graftabl 936>nul
  43. title 方向键操作,回车暂停,Esc退出
  44. setlocal enabledelayedexpansion
  45. mode con: rate=50 delay=0
  46. for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
  47. for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2) do (
  48. for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
  49.   set _%%b=%%c
  50.   for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
  51. )
  52. )
  53. ::定义各种图型的可变型数,及单个图的随机号
  54. :restart
  55. for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
  56. set/a fen=0,guan=1
  57. ::初始化坐标空间18行,10列
  58. :loop
  59. set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
  60. set/a r=!random!%%nx+1
  61. set err=
  62. set ttr=!_ttr!
  63. set _ttr=!ran%r%!
  64. ::随机取一个图标,
  65. if not defined ttr goto :loop
  66. set mx=!_%ttr:~,2%!
  67. set k=%ttr:~2%
  68. set str=!%ttr%!
  69. set _str=!%_ttr%!
  70. setlocal enabledelayedexpansion
  71. for /l %%a in (0,1,3) do set/a one=0x!_str:~%%a,1!,x=one/4+8,y=one%%4&set kk!x!.!y!=■
  72. for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
  73. if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
  74. )
  75. endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
  76. ::对预备图标的处理
  77. :cont
  78. ::读取按键
  79. debug<%~n0.bat>nul
  80. set key=%errorlevel%
  81. (if %paus% equ 2 goto :pause
  82. if defined k%key% (
  83.   if %key% equ 1 call :error %key%&exit
  84.   set bs=!str!&set/a bm=m,bk=k
  85.   set/a !k%key%!=1
  86.   if "%key%" equ "72" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
  87.   setlocal enabledelayedexpansion
  88.   (%d-v:#=3%)
  89.   rem 调用函数把图标点放置到总坐标空间
  90.   if defined err (
  91.    endlocal
  92.    set/a m=bm,k=bk
  93.    set str=!bs!
  94.   ) else (
  95.    (%d-e:#=18%)
  96.    rem 调用显示函数
  97.    endlocal
  98.   )
  99. )
  100. set ti=1!time:~7,1!!time:~9,2!
  101. if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
  102. if !tn! gtr !down! (
  103. set/a bti=ti,n+=1
  104. setlocal enabledelayedexpansion
  105. (%d-v:#=3%)
  106. if defined err (
  107.   endlocal
  108.   goto :jmpout
  109. ) else (
  110.   (%d-e:#=18%)
  111.   endlocal
  112. )
  113. )
  114. if %key% equ 28 echo 按回车键继续。。。
  115. goto :cont)
  116. :jmpout
  117. set/a n-=1
  118. (%d-v:#=3%)
  119. set m=18
  120. for /l %%a in (18,-1,2) do for %%b in ("!ebuf:@=%%a!") do if "%%~b" neq "■■■■■■■■■■■" (set e!m!=%%~b&set/a m-=1)
  121. if !m! neq 1 (
  122. for /l %%a in (!m!,-1,2) do set "e%%a=           "
  123. for /l %%a in (18,-1,2) do (
  124.   for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
  125. )
  126. set/a "fen=fen+(m-1)*10,guan=fen/150+1"
  127. )
  128. if !n! leq 2 (
  129. cls&(%d-e:#=18%)
  130. echo       游戏结束!
  131. ping -n 3 127.1 >nul
  132. goto :restart
  133. )
  134. goto :loop
  135. :error
  136. if %1 equ 1 echo 谢谢使用,再见。。。
  137. ping -n 3 127.1 >nul
  138. mode con rate=30 delay=1
  139. goto :eof
  140. :pause
  141. if %key% equ 28 set paus=1
  142. if %key% equ 1 goto :error
  143. goto :cont
复制代码

[ 本帖最后由 netbenton 于 2009-9-26 23:14 编辑 ]

TOP

增加自定义按键功能
  1. @goto :` 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 1.3
  2. e100 EB 02 00 00 CD 1A 89 16 02 01 31 C0 CD 1A 3B 16 02 01 75 0E
  3. e114 B4 01 CD 16 74 F0 B4 00 CD 16 88 E0 EB 02 B0 00 B4 4C CD 21
  4. g
  5. :`
  6. @echo off
  7. set        "d-v=for /l %%a in (0,1,#) do set/a one=0x!str:~%%a,1!,x=one/4+n,y=one%%4+m&(for %%b in ("r!x!.!y!") do if "!%%~b!" equ " " (set %%~b=■) else (set err=1))"
  8. ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v:#=图标点数%)
  9. ::变量使用:one  x  y
  10. set "d-e=set aec=!cr!!cr!        ┌───────────┐!cr!&(for /l %%a in (2,1,#) do for %%b in ("│!ebuf:@=%%a!│  !ebu%%a!") do set aec=!aec!        %%~b!cr!)&cls&echo;!aec!        └───────────┘"
  11. ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
  12. set ebu4=第!guan!关
  13. set ebu6=总分:!fen!
  14. set cr=^
  15. ::各种图标定义
  16. set ga1=0156
  17. set ga2=1458
  18. set gb1=1245
  19. set gb2=0459
  20. set za1=4567
  21. set za2=159d
  22. set qa1=1598
  23. set qa2=0456
  24. set qa3=0148
  25. set qa4=0126
  26. set qb1=0489
  27. set qb2=0124
  28. set qb3=0159
  29. set qb4=2456
  30. set ta1=0145
  31. set sa1=0125
  32. set sa2=1459
  33. set sa3=1456
  34. set sa4=0458
  35. chcp 437 >nul
  36. graftabl 936>nul
  37. setlocal enabledelayedexpansion
  38. ::按键定义
  39. set 转=k%%=mx,k+
  40. set 速=down
  41. set 左=m-
  42. set 右=m+
  43. set 停=paus%%=2,paus+
  44. set 退=quit
  45. cls
  46. echo 批处理俄罗斯方块,300分为一关
  47. echo 一次消一行得10分
  48. echo 一次消二行得30分
  49. echo 一次消三行得50分
  50. echo 一次消四行得70分
  51. echo;
  52. echo 请自定义操作按键
  53. echo;
  54. call :setkey 左 "左按键"
  55. call :setkey 右 "右按键"
  56. call :setkey 速 "加速键"
  57. call :setkey 转 "转动键"
  58. call :setkey 停 "暂停"
  59. call :setkey 退 "退出"
  60. set paus=1
  61. mode con: rate=50 delay=0
  62. for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
  63. for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2) do (
  64.         for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
  65.                 set _%%b=%%c
  66.                 for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
  67.         )
  68. )
  69. ::定义各种图型的可变型数,及单个图的随机号        
  70. :restart
  71. for /l %%a in (0,1,20) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
  72. set/a fen=0,guan=1
  73. ::初始化坐标空间20行,10列
  74. :loop
  75. set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
  76. set/a r=!random!%%nx+1
  77. set err=
  78. set ttr=!_ttr!
  79. set _ttr=!ran%r%!
  80. ::随机取一个图标,
  81. if not defined ttr goto :loop
  82. set mx=!_%ttr:~,2%!
  83. set k=%ttr:~2%
  84. set str=!%ttr%!
  85. set _str=!%_ttr%!
  86. setlocal enabledelayedexpansion
  87. for /l %%a in (0,1,3) do set/a one=0x!_str:~%%a,1!,x=one/4+8,y=one%%4&set kk!x!.!y!=■
  88. for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
  89.         if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
  90. )
  91. endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
  92. ::对预备图标的处理
  93. :cont
  94. ::读取按键
  95. debug<"%~n0.bat">nul
  96. set key=%errorlevel%
  97. (if %paus% equ 2 goto :pause
  98. if defined k%key% (
  99.                 if %key% equ %退% call :error %key%&exit
  100.                 set bs=!str!&set/a bm=m,bk=k
  101.                 set/a !k%key%!=1
  102.                 if "%key%" equ "%转%" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
  103.                 setlocal enabledelayedexpansion
  104.                 (%d-v:#=3%)
  105.                 rem 调用函数把图标点放置到总坐标空间
  106.                 if defined err (
  107.                         endlocal
  108.                         set/a m=bm,k=bk
  109.                         set str=!bs!
  110.                 ) else (
  111.                         (%d-e:#=20%)
  112.                         rem 调用显示函数
  113.                         endlocal
  114.                 )
  115. )
  116.         
  117. set ti=1!time:~7,1!!time:~9,2!
  118. if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
  119. if !tn! gtr !down! (
  120.         set/a bti=ti,n+=1
  121.         setlocal enabledelayedexpansion
  122.         (%d-v:#=3%)
  123.         if defined err (
  124.                 endlocal
  125.                 goto :jmpout
  126.         ) else (
  127.                 (%d-e:#=20%)
  128.                 endlocal
  129.         )
  130. )
  131. if %key% equ %停% echo 再按暂停键继续。。。
  132. goto :cont)
  133. :jmpout
  134. set/a n-=1
  135. (%d-v:#=3%)
  136. set m=20
  137. for /l %%a in (20,-1,2) do for %%b in ("!ebuf:@=%%a!") do if "%%~b" neq "■■■■■■■■■■■" (set e!m!=%%~b&set/a m-=1)
  138. if !m! neq 1 (
  139.         for /l %%a in (!m!,-1,2) do set "e%%a=           "
  140.         for /l %%a in (20,-1,2) do (
  141.                 for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
  142.         )
  143.         set/a "fen=fen+(m-1)*20-10,guan=fen/300+1"
  144. )
  145. if !n! leq 2 (
  146.         cls&(%d-e:#=20%)
  147.         echo       游戏结束!
  148.         ping -n 3 127.1 >nul
  149.         goto :restart
  150. )
  151. goto :loop
  152. :error
  153. if %1 equ %退% echo 谢谢使用,再见。。。
  154. ping -n 3 127.1 >nul
  155. mode con rate=30 delay=1
  156. goto :eof
  157. :pause
  158. if %key% equ %停% set paus=1
  159. if %key% equ %退% goto :error
  160. goto :cont
  161. :setkey
  162. echo;
  163. echo 定义: %~2
  164. :sk_lp
  165. ping -n 1 127.1 >nul
  166. debug<"%~n0.bat">nul
  167. set var=%errorlevel%
  168. if %var% equ 0 goto :sk_lp
  169. if defined k%var% echo;不能重复定义&goto :setkey
  170. set k%var%=!%1!
  171. set %1=%var%
  172. goto :eof
复制代码

[ 本帖最后由 netbenton 于 2009-10-6 13:14 编辑 ]

TOP

re 11 楼
谢谢测试

虽然这些bug并不会影响程序的运行,但还是要尽量改正
4行前的已经处理好,已经在9楼更正

83行的错误
是因为二进程同时操作同一个临时文件所至,但并不会影响运行,也很难感觉得出来
,只要是用这种方法,就很难避免,
只有用echo; 2>nul 3>nul,屏蔽掉

TOP

回复15楼
谢谢测试

是保存的批处理文件名中含有空格的问题,已经在9楼更正。

TOP

回复18楼

这次应该是与你的测试环境有关
正常打开是可以运行的

TOP

本帖最后由 netbenton 于 2021-12-7 00:10 编辑
  1. @echo off&rem 俄罗斯方块游戏,win10测试运行。由netbenton编写,在bathome首发,完成时间:2021年12月06日
  2. if "%1" equ "para2" goto :para2
  3. rem 取控制符到变量。(1BH=27=033)
  4. for /F "tokens=1 delims=#" %%a in ('"prompt #$E# & echo on & for %%b in (1) do rem"') do set "ESC=%%a"
  5. set ebu4=第!guan!关
  6. set ebu6=总分:!fen!
  7. ::各种图标定义
  8. set ga1=0 1 5 6
  9. set ga2=1 4 5 8
  10. ::■■
  11. ::  ■■
  12. set gb1=1 2 4 5
  13. set gb2=0 4 5 9
  14. ::  ■■
  15. ::■■
  16. set za1=4 5 6 7
  17. set za2=1 5 9 d
  18. ::■■■■
  19. set qa1=1 5 9 8
  20. set qa2=0 4 5 6
  21. set qa3=0 1 4 8
  22. set qa4=0 1 2 6
  23. ::■■
  24. ::  ■
  25. ::  ■
  26.   
  27. set qb1=0 4 8 9
  28. set qb2=0 1 2 4
  29. set qb3=0 1 5 9
  30. set qb4=2 4 5 6
  31. ::■■
  32. ::■
  33. ::■
  34. set ta1=0 1 4 5
  35. ::■■
  36. ::■■
  37. set sa1=0 1 2 5
  38. set sa2=1 4 5 9
  39. set sa3=1 4 5 6
  40. set sa4=0 4 5 8
  41. ::  ■
  42. ::■■■
  43. set tw1=0 1
  44. set tw2=0 4
  45. set on1=0
  46. set on2=0
  47. set sh1=1 4 5 6 9
  48. set sh2=1 4 5 6 9
  49. set ao1=0 1 2 4 6
  50. set ao2=0 1 4 8 9
  51. set ao3=0 4 5 6 2
  52. set ao4=0 1 5 8 9
  53. set tt1=0 1 2 5 9
  54. set tt2=0 4 8 5 6
  55. set tt3=1 5 8 9 a
  56. set tt4=2 4 5 6 a
  57. ::cdef
  58. ::89ab
  59. ::4567
  60. ::0123
  61. start "aswd" %0 para2
  62. ::起动控制窗口
  63. set k3=k%%=mx,k+
  64. set k4=down
  65. set k1=m-
  66. set k2=m+
  67. set k5=t+
  68. ::按键定义
  69. setlocal enabledelayedexpansion
  70. for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
  71. for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2 tw_2 on_2 sh_2 ao_4 tt_4) do (
  72. for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
  73.   set _%%b=%%c
  74.   for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
  75. )
  76. )
  77. ::定义各种图型的可变型数,及单个图的随机号
  78. :restart
  79. cls
  80. echo 0 2 >%~n0.tmp
  81. for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
  82. set/a fen=0,guan=1
  83. ::初始化坐标空间18行,10列
  84. :loop
  85. set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
  86. set/a r=!random!%%nx+1
  87. set err=
  88. set ttr=!_ttr!
  89. set _ttr=!ran%r%!
  90. ::随机取一个图标,
  91. if not defined ttr goto :loop
  92. set mx=!_%ttr:~,2%!
  93. set k=%ttr:~2%
  94. set str=!%ttr%!
  95. set _str=!%_ttr%!
  96. setlocal enabledelayedexpansion
  97. for %%a in (!_str!) do set/a one=0x%%a,x=one/4+8,y=one%%4&set kk!x!.!y!=■
  98. for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
  99. if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
  100. )
  101. endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
  102. ::对预备图标的处理
  103. :cont
  104. set/p var=<%~n0.tmp
  105. for /f "tokens=1,2" %%a in ("%var%") do (
  106. if %%a neq !test! (
  107.   if %%b geq 6 call :error %%b&del/q %~n0.tmp&exit
  108.   set bs=!str!&set/a bm=m,bk=k
  109.   set/a !k%%b!=1
  110.   if "%%b" equ "3" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
  111.   setlocal enabledelayedexpansion
  112. for %%a in (!str!) do (set/a one=0x%%a,x=one/4+n,y=one%%4+m
  113. for %%b in ("r!x!.!y!") do (
  114. if "!%%~b!" equ " " (set r!x!.!y!=■) else (set err=1)
  115. )
  116. )
  117.   rem 调用函数把图标点放置到总坐标空间
  118.   if defined err (
  119.    endlocal
  120.    set/a m=bm,k=bk
  121.    set str=!bs!
  122.   ) else (
  123. echo;%ESC%[0;0H
  124. echo;
  125. echo;
  126. for /l %%a in (2,1,18) do (
  127. for %%b in ("│!ebuf:@=%%a!│  !ebu%%a!") do echo; %%~b
  128. )
  129. echo;
  130.    rem 调用显示函数
  131.    endlocal
  132.   )
  133. )
  134. set test=%%a
  135. )
  136. set ti=1!time:~7,1!!time:~9,2!
  137. if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
  138. if !tn! gtr !down! (
  139. set/a bti=ti,n+=1
  140. setlocal enabledelayedexpansion
  141. for %%a in (!str!) do (set/a one=0x%%a,x=one/4+n,y=one%%4+m
  142. for %%b in ("r!x!.!y!") do (
  143. if "!%%~b!" equ " " (set r!x!.!y!=■) else (set err=1)
  144. ))
  145. if defined err (
  146.   endlocal
  147.   goto :jmpout
  148. ) else (
  149. echo;%ESC%[0;0H
  150. echo;
  151. echo; ┌──────────────────────┐
  152. for /l %%a in (2,1,18) do (
  153. for %%b in ("│!ebuf:@=%%a!│  !ebu%%a!") do echo; %%~b
  154. )
  155. echo; └──────────────────────┘
  156.   endlocal
  157. )
  158. )
  159. goto :cont
  160. :jmpout
  161. set/a n-=1
  162. for %%a in (!str!) do (set/a one=0x%%a,x=one/4+n,y=one%%4+m
  163. for %%b in ("r!x!.!y!") do (
  164. if "!%%~b!" equ " " (set r!x!.!y!=■) else (set err=1)
  165. )
  166. )
  167. set m=18
  168. for /l %%a in (18,-1,2) do for %%b in ("!ebuf:@=%%a!") do if "%%~b" neq "■■■■■■■■■■■" (set e!m!=%%~b&set/a m-=1)
  169. if !m! neq 1 (
  170. for /l %%a in (!m!,-1,2) do set "e%%a=           "
  171. for /l %%a in (18,-1,2) do (
  172.   for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
  173. )
  174. set/a "fen=fen+(m-1)*10,guan=fen/150+1"
  175. )
  176. if !n! leq 2 (
  177. echo 游戏结束!
  178. ping -n 3 127.1 >nul
  179. goto :restart
  180. )
  181. goto :loop
  182. :para2
  183. mode con: cols=30 lines=2
  184. echo a左 d右 w转 s加速 q退出
  185. for %%a in (a d w s g q) do set /a n+=1,K%%a=n
  186. :p_lp
  187. for /F "tokens=2 delims=键" %%L in ('xcopy /w . 2^>nul') do set k=%%L
  188. if not defined K%k% goto :p_lp
  189. set/a n=n%%50+1,k=K%k%
  190. >%~n0.tmp echo;%n% %k%
  191. if %k% geq 6 exit
  192. for /l %%a in (1,1,25) do ver>nul
  193. goto :p_lp
  194. :error
  195. if %1 equ 6 echo 谢谢使用,再见。。。
  196. ping -n 3 127.1 >nul
  197. goto :eof
复制代码
1

评分人数

TOP

返回列表