Board logo

标题: [游戏娱乐] 俄罗斯方块游戏批处理 [打印本页]

作者: netbenton    时间: 2009-9-25 02:05     标题: 俄罗斯方块游戏批处理

本游戏需要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
复制代码

作者: wxcute    时间: 2009-9-25 08:12

加一个CHOICE地址罢:http://bbs.bathome.net/thread-1726-1-1.html

对你是相当的无语:牛人!
作者: more    时间: 2009-9-25 15:19

第一个游戏BUG:
1.在小窗口中出现"无法访问"字样.
2."无效数字....",然后"游戏结束!",重新开局...
3.临时文件应该在退出时清除...

[ 本帖最后由 more 于 2009-9-25 15:23 编辑 ]
作者: netbenton    时间: 2009-9-25 19:53

re more
谢谢找出bug,已经找到原因了,是两进程同时操作一个文件时出的问题,看来这种方法并不稳定,
作者: netbenton    时间: 2009-9-26 14:04

re more

问题已经解决,现在可以放心玩了
作者: netbenton    时间: 2009-9-26 22:37

发布免三方,不用临时文件版
可惜的是速度减了
  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 编辑 ]
作者: zhouyongjun    时间: 2009-9-27 15:22

你真是太牛了
不过玩俄罗斯方块大部分是空格键加速,都已经习惯那个了
上面的代码提下速就完美了
我觉得每一关的分数要设高一点,要不前面几关一下就玩过去了,后面速度太快,游戏就很快结束了
作者: senkiss    时间: 2009-9-27 18:01

哎~!完全不懂~!對我來說你是偶的神啊,能不能把鍵也改動下~用起來不習慣

[ 本帖最后由 senkiss 于 2009-9-27 18:02 编辑 ]
作者: netbenton    时间: 2009-9-27 19:37

增加自定义按键功能
  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 编辑 ]
作者: zjw767676    时间: 2009-9-28 23:43

完美!批处理居然能这样玩呢!!!
要是把边框线跟方块之间的空隙再小点就更好了!
作者: yslyxqysl    时间: 2009-10-1 13:39

正在获取系统变量列表...
成功获取系统变量列表
正在初始化批处理内容...
成功初始化批处理内容
正在启动调试批处理...
成功启动调试批处理
开始调试...
调试结束
读取错误信息...
以下是错误信息

2行:
'e100' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

3行:
'e114' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

4行:
'g' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

83行:
系统找不到指定的文件。

83行:
系统找不到指定的文件。

83行:
系统找不到指定的文件。

83行:
系统找不到指定的文件。

83行:
系统找不到指定的文件。

83行:
系统找不到指定的文件。

83行:
系统找不到指定的文件。
作者: netbenton    时间: 2009-10-2 13:19

re 11 楼
谢谢测试

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

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

这样的帖子 怎么能让他沉呢    对楼主 真是佩服  !
作者: athinko    时间: 2009-10-6 10:16

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

choice.exe三方工具是什么
作者: yslyxqysl    时间: 2009-10-6 11:18

无法读取按键

-------------以下是测试信息--------------

正在获取系统变量列表...
成功获取系统变量列表
正在初始化批处理内容...
成功初始化批处理内容
正在启动调试批处理...
成功启动调试批处理
开始调试...
调试结束
读取错误信息...
以下是错误信息

200行:
系统找不到指定的文件。

200行:
系统找不到指定的文件。

200行:
系统找不到指定的文件。

200行:
系统找不到指定的文件。

200行:
系统找不到指定的文件。

200行:
系统找不到指定的文件。

[ 本帖最后由 yslyxqysl 于 2009-10-6 11:22 编辑 ]
作者: Batcher    时间: 2009-10-6 11:48     标题: 回复 14楼 的帖子

XP系统没有自带choice.exe,如果需要,可以按照2楼的链接去下载。
楼主的代码从6楼开始,已经不再需要这个工具了。
作者: netbenton    时间: 2009-10-6 13:17

回复15楼
谢谢测试

是保存的批处理文件名中含有空格的问题,已经在9楼更正。
作者: yslyxqysl    时间: 2009-10-6 13:32

读取错误信息...
以下是错误信息

172行:
系统找不到指定的文件。

172行:
系统找不到指定的文件。

172行:
系统找不到指定的文件。

172行:
系统找不到指定的文件。

172行:
系统找不到指定的文件。

[ 本帖最后由 yslyxqysl 于 2009-10-6 20:08 编辑 ]
作者: netbenton    时间: 2009-10-6 18:12

回复18楼

这次应该是与你的测试环境有关
正常打开是可以运行的
作者: yslyxqysl    时间: 2009-10-6 18:54

我分析了一下,原因如下
1.似乎LZ忘记了批处理的后缀名并不止.bat,还有.cmd
2.最主要的是def的烂BP不支持混合编程
作者: lxj    时间: 2009-10-10 13:40

无第三方工具的感觉用起来很舒服.但抖动有点晃眼.眼睛有点吃不消..
作者: zhujihong    时间: 2009-10-13 07:47

楼主真牛人也!!!
作者: kevin2008    时间: 2009-10-20 13:32

牛人,楼主太牛了!~
作者: opolokoi    时间: 2009-11-10 17:10

我就是看到了这个帖子,让我一定要注册,一定要顶。
作者: wgoxm521    时间: 2010-2-1 15:42     标题: 回复 6楼 的帖子

O(∩_∩)O~有意思,好玩。
作者: acaigg    时间: 2011-1-4 16:25

两个字:强大。收藏并学习。
作者: 飛雪    时间: 2015-2-27 07:51

來試玩看看
雖然沒有UI
作者: i670    时间: 2015-2-27 09:39

加速键能不能设为按下才加
作者: eddf    时间: 2015-5-21 11:00

不能在WIN7环境下运行!
作者: eddf    时间: 2015-5-21 11:00

不能在WIN7环境下运行!
作者: semiuel    时间: 2015-7-22 20:10

四个批处理全部不能在WIN7环境下运行。
作者: shenyu    时间: 2018-10-6 13:15

2018.10.6前来考古
作者: netbenton    时间: 2021-12-6 23:53

本帖最后由 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
复制代码

作者: sds    时间: 2023-2-4 09:56

回复 33# netbenton 你的代码还是不能在win7下运行啊,显示
[
作者: HOPE2021    时间: 2023-2-4 10:04

回复 34# sds
控制台虚拟终端序列仅支持 Windows 10 / Windows 11
详见:https://learn.microsoft.com/zh-cn/windows/console/console-virtual-terminal-sequences
作者: LTSC1809    时间: 2023-5-5 22:30

佩服!批处理侦测输入没几个做的这么好的
作者: GenshinImpact    时间: 2023-11-19 14:27

?孵???蝵?孵?嚗?00?蛹銝?? 執行的程式或批次檔。
'?銵?30??' 不是內部或外部命令、可執行的程式或批次檔。
'?0??' 不是內部或外部命令、可執行的程式或批次檔。新啟動。
'瘨?銵?70??' 不是內部或外部命令、可執行的程式或批次檔。
'ping' 不是內部或外部命令、可執行的程式或批次檔。
霂瑁摰???? 檔案。 令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。新啟動。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
'ping' 不是內部或外部命令、可執行的程式或批次檔。
系統找不到指定的檔案。 令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。新啟動。
'ping' 不是內部或外部命令、可執行的程式或批次檔。
系統找不到指定的檔案。 令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
'ping' 不是內部或外部命令、可執行的程式或批次檔。新啟動。
系統找不到指定的檔案。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
'ping' 不是內部或外部命令、可執行的程式或批次檔。
系統找不到指定的檔案。、可執行的程式或批次檔。 重新啟動。
摰?嚗????指定的檔案。
摰?嚗?不是內部或外部命令、可執行的程式或批次檔。
'ping' 不是內部或外部命令、可執行的程式或批次檔。
系統找不到指定的檔案。 令、可執行的程式或批次檔。
'?' 不是內部或外部命令、可執行的程式或批次檔。 重新啟動。
摰?嚗????指定的檔案。
'ping' 不是內部或外部命令、可執行的程式或批次檔。
系統找不到指定的檔案。
'mode' 不是內部或外部命令、可執行的程式或批次檔。
'?' 不是內部或外部命令、可執行的程式或批次檔。 重新啟動。
系統找不到指定的檔案。
這個時候不應有 )。

[處理結束,代碼為 255 (0x000000ff)]
您現在可以使用 Ctrl+D 關閉此終端機,或按 Enter 重新啟動。
作者: Batcher    时间: 2023-11-19 17:57

回复 37# GenshinImpact


请参考Q-04把test.bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: myjoys    时间: 2024-3-20 11:40

win11下可以运行,保存ANSI编码格式的bat文件
用右键“管理员身份运行”

可以界面有点小




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2