[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
完美!批处理居然能这样玩呢!!!
要是把边框线跟方块之间的空隙再小点就更好了!
有一种爱叫放弃

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

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

[ 本帖最后由 senkiss 于 2009-9-27 18:02 编辑 ]

TOP

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

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

re more

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

TOP

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

TOP

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

[ 本帖最后由 more 于 2009-9-25 15:23 编辑 ]

TOP

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

对你是相当的无语:牛人!
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

返回列表