标题: [游戏娱乐] 俄罗斯方块游戏批处理 [打印本页]
作者: netbenton 时间: 2009-9-25 02:05 标题: 俄罗斯方块游戏批处理
本游戏需要choice.exe三方工具
第一版,只有基本图标方块- @echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 1.0
- if "%1" equ "para2" goto :para2
- 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))"
- ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v:#=图标点数%)
- ::变量使用:one x y
- 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! └───────────┘"
- ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
- set ebu4=第!guan!关
- set ebu6=总分:!fen!
- set cr=^
-
-
- ::各种图标定义
- set ga1=0156
- set ga2=1458
- ::■■
- :: ■■
- set gb1=1245
- set gb2=0459
- :: ■■
- ::■■
- set za1=4567
- set za2=159d
- ::■■■■
- set qa1=1598
- set qa2=0456
- set qa3=0148
- set qa4=0126
- ::■■
- :: ■
- :: ■
-
- set qb1=0489
- set qb2=0124
- set qb3=0159
- set qb4=2456
- ::■■
- ::■
- ::■
- ::cdef
- ::89ab
- ::4567
- ::0123
- set ta1=0145
- ::■■
- ::■■
- set sa1=0125
- set sa2=1459
- set sa3=1456
- set sa4=0458
- :: ■
- ::■■■
-
- echo 0 2 >%~n0.tmp
- start "aswd" %0 para2
- ::起动控制窗口
- set k3=k%%=mx,k+
- set k4=down
- set k1=m-
- set k2=m+
- set k5=t+
- ::按键定义
- setlocal enabledelayedexpansion
- for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
- for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2) do (
- for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
- set _%%b=%%c
- for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
- )
- )
- ::定义各种图型的可变型数,及单个图的随机号
- :restart
- for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
- set/a fen=0,guan=1
- ::初始化坐标空间18行,10列
- :loop
- set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
- set/a r=!random!%%nx+1
- set err=
- set ttr=!_ttr!
- set _ttr=!ran%r%!
- ::随机取一个图标,
- if not defined ttr goto :loop
- set mx=!_%ttr:~,2%!
- set k=%ttr:~2%
- set str=!%ttr%!
- set _str=!%_ttr%!
-
- setlocal enabledelayedexpansion
- 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!=■
- for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
- if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
- )
- endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
- ::对预备图标的处理
-
- :cont
- set/p var=<%~n0.tmp
- for /f "tokens=1,2" %%a in ("%var%") do (
- if %%a neq !test! (
- if %%b geq 6 call :error %%b&del /q %~n0.tmp&exit
- set bs=!str!&set/a bm=m,bk=k
- set/a !k%%b!=1
- if "%%b" equ "3" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
- setlocal enabledelayedexpansion
- (%d-v:#=3%)
- rem 调用函数把图标点放置到总坐标空间
- if defined err (
- endlocal
- set/a m=bm,k=bk
- set str=!bs!
- ) else (
- (%d-e:#=18%)
- rem 调用显示函数
- endlocal
- )
- )
- set test=%%a
- )
-
- set ti=1!time:~7,1!!time:~9,2!
- if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
- if !tn! gtr !down! (
- set/a bti=ti,n+=1
- setlocal enabledelayedexpansion
- (%d-v:#=3%)
- if defined err (
- endlocal
- goto :jmpout
- ) else (
- (%d-e:#=18%)
- endlocal
- )
- )
- for /l %%a in (1,1,25) do ver>nul
- goto :cont
- :jmpout
- set/a n-=1
- (%d-v:#=3%)
- set m=18
- 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)
- if !m! neq 1 (
- for /l %%a in (!m!,-1,2) do set "e%%a= "
- for /l %%a in (18,-1,2) do (
- for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
- )
- set/a "fen=fen+(m-1)*10,guan=fen/150+1"
- )
- if !n! leq 2 (
- echo 游戏结束!
- ping -n 3 127.1 >nul
- goto :restart
- )
- goto :loop
- :para2
- mode con: cols=30 lines=2
- echo a左 d右 w转 s加速 q退出
- :p_lp
- set/a n=n%%10+1
- choice /c adwsgq /n >nul
- >%~n0.tmp echo;%n% %errorlevel%
- if %errorlevel% geq 6 exit
- for /l %%a in (1,1,12) do ver>nul
- goto :p_lp
- :error
- if %1 equ 6 echo 谢谢使用,再见。。。
- if %1 gtr 6 echo 对不起!choice.exe 文件不存在,不能运行。。。
- ping -n 3 127.1 >nul
- goto :eof
复制代码
第二版,加入混合图标方块- @echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 2.0
- if "%1" equ "para2" goto :para2
- 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))"
- ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v%)
- ::变量使用:one x y
- 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! └───────────┘"
- ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
- set ebu4=第!guan!关
- set ebu6=总分:!fen!
- set cr=^
-
-
- ::各种图标定义
- set ga1=0 1 5 6
- set ga2=1 4 5 8
- ::■■
- :: ■■
- set gb1=1 2 4 5
- set gb2=0 4 5 9
- :: ■■
- ::■■
- set za1=4 5 6 7
- set za2=1 5 9 d
- ::■■■■
- set qa1=1 5 9 8
- set qa2=0 4 5 6
- set qa3=0 1 4 8
- set qa4=0 1 2 6
- ::■■
- :: ■
- :: ■
-
- set qb1=0 4 8 9
- set qb2=0 1 2 4
- set qb3=0 1 5 9
- set qb4=2 4 5 6
- ::■■
- ::■
- ::■
- set ta1=0 1 4 5
- ::■■
- ::■■
- set sa1=0 1 2 5
- set sa2=1 4 5 9
- set sa3=1 4 5 6
- set sa4=0 4 5 8
- :: ■
- ::■■■
- set tw1=0 1
- set tw2=0 4
- set on1=0
- set on2=0
- set sh1=1 4 5 6 9
- set sh2=1 4 5 6 9
- set ao1=0 1 2 4 6
- set ao2=0 1 4 8 9
- set ao3=0 4 5 6 2
- set ao4=0 1 5 8 9
- set tt1=0 1 2 5 9
- set tt2=0 4 8 5 6
- set tt3=1 5 8 9 a
- set tt4=2 4 5 6 a
-
- ::cdef
- ::89ab
- ::4567
- ::0123
- echo 0 2 >%~n0.tmp
- start "aswd" %0 para2
- ::起动控制窗口
- set k3=k%%=mx,k+
- set k4=down
- set k1=m-
- set k2=m+
- set k5=t+
- ::按键定义
- setlocal enabledelayedexpansion
- for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
- 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 (
- for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
- set _%%b=%%c
- for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
- )
- )
- ::定义各种图型的可变型数,及单个图的随机号
- :restart
- for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
- set/a fen=0,guan=1
- ::初始化坐标空间18行,10列
-
- :loop
- set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
- set/a r=!random!%%nx+1
- set err=
- set ttr=!_ttr!
- set _ttr=!ran%r%!
- ::随机取一个图标,
- if not defined ttr goto :loop
- set mx=!_%ttr:~,2%!
- set k=%ttr:~2%
- set str=!%ttr%!
- set _str=!%_ttr%!
-
- setlocal enabledelayedexpansion
- for %%a in (!_str!) do set/a one=0x%%a,x=one/4+8,y=one%%4&set kk!x!.!y!=■
- for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
- if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
- )
- endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
- ::对预备图标的处理
-
- :cont
- set/p var=<%~n0.tmp
- for /f "tokens=1,2" %%a in ("%var%") do (
- if %%a neq !test! (
- if %%b geq 6 call :error %%b&del/q %~n0.tmp&exit
- set bs=!str!&set/a bm=m,bk=k
- set/a !k%%b!=1
- if "%%b" equ "3" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
- setlocal enabledelayedexpansion
- (%d-v%)
- rem 调用函数把图标点放置到总坐标空间
- if defined err (
- endlocal
- set/a m=bm,k=bk
- set str=!bs!
- ) else (
- (%d-e:#=18%)
- rem 调用显示函数
- endlocal
- )
- )
- set test=%%a
- )
-
-
- set ti=1!time:~7,1!!time:~9,2!
- if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
- if !tn! gtr !down! (
- set/a bti=ti,n+=1
- setlocal enabledelayedexpansion
- (%d-v%)
- if defined err (
- endlocal
- goto :jmpout
- ) else (
- (%d-e:#=18%)
- endlocal
- )
- )
-
- goto :cont
- :jmpout
- set/a n-=1
- (%d-v%)
- set m=18
- 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)
- if !m! neq 1 (
- for /l %%a in (!m!,-1,2) do set "e%%a= "
- for /l %%a in (18,-1,2) do (
- for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
- )
- set/a "fen=fen+(m-1)*10,guan=fen/150+1"
- )
- if !n! leq 2 (
- echo 游戏结束!
- ping -n 3 127.1 >nul
- goto :restart
- )
- goto :loop
- :para2
- mode con: cols=30 lines=2
- echo a左 d右 w转 s加速 q退出
- :p_lp
- set/a n=n%%50+1
- choice /c adwsgq /n >nul
- >%~n0.tmp echo;%n% %errorlevel%
- if %errorlevel% geq 6 exit
- for /l %%a in (1,1,25) do ver>nul
- goto :p_lp
- :error
- if %1 equ 6 echo 谢谢使用,再见。。。
- if %1 gtr 6 echo 对不起!choice.exe 文件不存在,不能运行。。。
- ping -n 3 127.1 >nul
- 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
发布免三方,不用临时文件版
可惜的是速度减了
- @echo off&rem 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 1.3
- e100 EB 02 00 00 CD 1A 89 16 02 01 31 C0 CD 1A 3B 16 02 01 75 0E
- e114 B4 01 CD 16 74 F0 B4 00 CD 16 88 E0 EB 02 B0 00 B4 4C CD 21
- g
- 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))"
- ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v:#=图标点数%)
- ::变量使用:one x y
- 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! └───────────┘"
- ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
- set ebu4=第!guan!关
- set ebu6=总分:!fen!
- set cr=^
-
-
- ::各种图标定义
- set ga1=0156
- set ga2=1458
- set gb1=1245
- set gb2=0459
- set za1=4567
- set za2=159d
- set qa1=1598
- set qa2=0456
- set qa3=0148
- set qa4=0126
- set qb1=0489
- set qb2=0124
- set qb3=0159
- set qb4=2456
- set ta1=0145
- set sa1=0125
- set sa2=1459
- set sa3=1456
- set sa4=0458
- ::按键定义
- set k72=k%%=mx,k+
- set k80=down
- set k75=m-
- set k77=m+
- set k28=paus%%=2,paus+
- set k1=quit
- set paus=1
- chcp 437 >nul
- graftabl 936>nul
- title 方向键操作,回车暂停,Esc退出
- setlocal enabledelayedexpansion
- mode con: rate=50 delay=0
- for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
- for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2) do (
- for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
- set _%%b=%%c
- for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
- )
- )
- ::定义各种图型的可变型数,及单个图的随机号
- :restart
- for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
- set/a fen=0,guan=1
- ::初始化坐标空间18行,10列
- :loop
- set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
- set/a r=!random!%%nx+1
- set err=
- set ttr=!_ttr!
- set _ttr=!ran%r%!
- ::随机取一个图标,
- if not defined ttr goto :loop
- set mx=!_%ttr:~,2%!
- set k=%ttr:~2%
- set str=!%ttr%!
- set _str=!%_ttr%!
-
- setlocal enabledelayedexpansion
- 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!=■
- for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
- if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
- )
- endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
- ::对预备图标的处理
-
- :cont
- ::读取按键
- debug<%~n0.bat>nul
- set key=%errorlevel%
- (if %paus% equ 2 goto :pause
- if defined k%key% (
- if %key% equ 1 call :error %key%&exit
- set bs=!str!&set/a bm=m,bk=k
- set/a !k%key%!=1
- if "%key%" equ "72" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
- setlocal enabledelayedexpansion
- (%d-v:#=3%)
- rem 调用函数把图标点放置到总坐标空间
- if defined err (
- endlocal
- set/a m=bm,k=bk
- set str=!bs!
- ) else (
- (%d-e:#=18%)
- rem 调用显示函数
- endlocal
- )
- )
-
- set ti=1!time:~7,1!!time:~9,2!
- if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
- if !tn! gtr !down! (
- set/a bti=ti,n+=1
- setlocal enabledelayedexpansion
- (%d-v:#=3%)
- if defined err (
- endlocal
- goto :jmpout
- ) else (
- (%d-e:#=18%)
- endlocal
- )
- )
- if %key% equ 28 echo 按回车键继续。。。
- goto :cont)
- :jmpout
- set/a n-=1
- (%d-v:#=3%)
- set m=18
- 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)
- if !m! neq 1 (
- for /l %%a in (!m!,-1,2) do set "e%%a= "
- for /l %%a in (18,-1,2) do (
- for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
- )
- set/a "fen=fen+(m-1)*10,guan=fen/150+1"
- )
- if !n! leq 2 (
- cls&(%d-e:#=18%)
- echo 游戏结束!
- ping -n 3 127.1 >nul
- goto :restart
- )
- goto :loop
- :error
- if %1 equ 1 echo 谢谢使用,再见。。。
- ping -n 3 127.1 >nul
- mode con rate=30 delay=1
- goto :eof
- :pause
- if %key% equ 28 set paus=1
- if %key% equ 1 goto :error
- 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
增加自定义按键功能
- @goto :` 俄罗斯方块游戏,由netbenton编写,在bathome首发,完成时间:2009年9月25日 ver 1.3
- e100 EB 02 00 00 CD 1A 89 16 02 01 31 C0 CD 1A 3B 16 02 01 75 0E
- e114 B4 01 CD 16 74 F0 B4 00 CD 16 88 E0 EB 02 B0 00 B4 4C CD 21
- g
- :`
- @echo off
- 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))"
- ::函数d-v,把str中的图标数据,放置到总坐标空间中,如果有覆盖,则err=1。调用方法:(%d-v:#=图标点数%)
- ::变量使用:one x y
- 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! └───────────┘"
- ::函数d-e,把总坐标空间显示出来,调用方法:(%d-e:#=行数%)
- set ebu4=第!guan!关
- set ebu6=总分:!fen!
- set cr=^
-
-
- ::各种图标定义
- set ga1=0156
- set ga2=1458
- set gb1=1245
- set gb2=0459
- set za1=4567
- set za2=159d
- set qa1=1598
- set qa2=0456
- set qa3=0148
- set qa4=0126
- set qb1=0489
- set qb2=0124
- set qb3=0159
- set qb4=2456
- set ta1=0145
- set sa1=0125
- set sa2=1459
- set sa3=1456
- set sa4=0458
- chcp 437 >nul
- graftabl 936>nul
- setlocal enabledelayedexpansion
- ::按键定义
- set 转=k%%=mx,k+
- set 速=down
- set 左=m-
- set 右=m+
- set 停=paus%%=2,paus+
- set 退=quit
-
- cls
- echo 批处理俄罗斯方块,300分为一关
- echo 一次消一行得10分
- echo 一次消二行得30分
- echo 一次消三行得50分
- echo 一次消四行得70分
- echo;
- echo 请自定义操作按键
- echo;
- call :setkey 左 "左按键"
- call :setkey 右 "右按键"
- call :setkey 速 "加速键"
- call :setkey 转 "转动键"
- call :setkey 停 "暂停"
- call :setkey 退 "退出"
-
- set paus=1
- mode con: rate=50 delay=0
- for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
- for %%a in (sa_4 ta_1 qb_4 qa_4 za_2 ga_2 gb_2) do (
- for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
- set _%%b=%%c
- for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
- )
- )
- ::定义各种图型的可变型数,及单个图的随机号
- :restart
- for /l %%a in (0,1,20) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
- set/a fen=0,guan=1
- ::初始化坐标空间20行,10列
- :loop
- set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
- set/a r=!random!%%nx+1
- set err=
- set ttr=!_ttr!
- set _ttr=!ran%r%!
- ::随机取一个图标,
- if not defined ttr goto :loop
- set mx=!_%ttr:~,2%!
- set k=%ttr:~2%
- set str=!%ttr%!
- set _str=!%_ttr%!
-
- setlocal enabledelayedexpansion
- 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!=■
- for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
- if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
- )
- endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
- ::对预备图标的处理
-
- :cont
- ::读取按键
- debug<"%~n0.bat">nul
- set key=%errorlevel%
- (if %paus% equ 2 goto :pause
- if defined k%key% (
- if %key% equ %退% call :error %key%&exit
- set bs=!str!&set/a bm=m,bk=k
- set/a !k%key%!=1
- if "%key%" equ "%转%" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
- setlocal enabledelayedexpansion
- (%d-v:#=3%)
- rem 调用函数把图标点放置到总坐标空间
- if defined err (
- endlocal
- set/a m=bm,k=bk
- set str=!bs!
- ) else (
- (%d-e:#=20%)
- rem 调用显示函数
- endlocal
- )
- )
-
- set ti=1!time:~7,1!!time:~9,2!
- if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
- if !tn! gtr !down! (
- set/a bti=ti,n+=1
- setlocal enabledelayedexpansion
- (%d-v:#=3%)
- if defined err (
- endlocal
- goto :jmpout
- ) else (
- (%d-e:#=20%)
- endlocal
- )
- )
- if %key% equ %停% echo 再按暂停键继续。。。
- goto :cont)
- :jmpout
- set/a n-=1
- (%d-v:#=3%)
- set m=20
- 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)
- if !m! neq 1 (
- for /l %%a in (!m!,-1,2) do set "e%%a= "
- for /l %%a in (20,-1,2) do (
- for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
- )
- set/a "fen=fen+(m-1)*20-10,guan=fen/300+1"
- )
- if !n! leq 2 (
- cls&(%d-e:#=20%)
- echo 游戏结束!
- ping -n 3 127.1 >nul
- goto :restart
- )
- goto :loop
- :error
- if %1 equ %退% echo 谢谢使用,再见。。。
- ping -n 3 127.1 >nul
- mode con rate=30 delay=1
- goto :eof
- :pause
- if %key% equ %停% set paus=1
- if %key% equ %退% goto :error
- goto :cont
- :setkey
- echo;
- echo 定义: %~2
- :sk_lp
- ping -n 1 127.1 >nul
- debug<"%~n0.bat">nul
- set var=%errorlevel%
- if %var% equ 0 goto :sk_lp
- if defined k%var% echo;不能重复定义&goto :setkey
- set k%var%=!%1!
- set %1=%var%
- 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 编辑
- @echo off&rem 俄罗斯方块游戏,win10测试运行。由netbenton编写,在bathome首发,完成时间:2021年12月06日
- if "%1" equ "para2" goto :para2
-
-
- rem 取控制符到变量。(1BH=27=033)
- for /F "tokens=1 delims=#" %%a in ('"prompt #$E# & echo on & for %%b in (1) do rem"') do set "ESC=%%a"
-
-
- set ebu4=第!guan!关
- set ebu6=总分:!fen!
-
- ::各种图标定义
- set ga1=0 1 5 6
- set ga2=1 4 5 8
- ::■■
- :: ■■
- set gb1=1 2 4 5
- set gb2=0 4 5 9
- :: ■■
- ::■■
- set za1=4 5 6 7
- set za2=1 5 9 d
- ::■■■■
- set qa1=1 5 9 8
- set qa2=0 4 5 6
- set qa3=0 1 4 8
- set qa4=0 1 2 6
- ::■■
- :: ■
- :: ■
-
- set qb1=0 4 8 9
- set qb2=0 1 2 4
- set qb3=0 1 5 9
- set qb4=2 4 5 6
- ::■■
- ::■
- ::■
- set ta1=0 1 4 5
- ::■■
- ::■■
- set sa1=0 1 2 5
- set sa2=1 4 5 9
- set sa3=1 4 5 6
- set sa4=0 4 5 8
- :: ■
- ::■■■
- set tw1=0 1
- set tw2=0 4
- set on1=0
- set on2=0
- set sh1=1 4 5 6 9
- set sh2=1 4 5 6 9
- set ao1=0 1 2 4 6
- set ao2=0 1 4 8 9
- set ao3=0 4 5 6 2
- set ao4=0 1 5 8 9
- set tt1=0 1 2 5 9
- set tt2=0 4 8 5 6
- set tt3=1 5 8 9 a
- set tt4=2 4 5 6 a
-
- ::cdef
- ::89ab
- ::4567
- ::0123
-
- start "aswd" %0 para2
- ::起动控制窗口
- set k3=k%%=mx,k+
- set k4=down
- set k1=m-
- set k2=m+
- set k5=t+
- ::按键定义
- setlocal enabledelayedexpansion
- for /l %%a in (0,1,10) do (set "ebuf=!ebuf!^!r@.%%a^!")
- 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 (
- for /f "tokens=1,2 delims=_" %%b in ("%%a") do (
- set _%%b=%%c
- for /l %%d in (1,1,%%c) do set/a nx+=1&set ran!nx!=%%b%%d
- )
- )
- ::定义各种图型的可变型数,及单个图的随机号
-
- :restart
- cls
- echo 0 2 >%~n0.tmp
-
- for /l %%a in (0,1,18) do (for /l %%b in (0,1,10) do set r%%a.%%b= )
- set/a fen=0,guan=1
- ::初始化坐标空间18行,10列
-
- :loop
- set/a "m=4,t=2,n=1,down=450/(guan<<2),bti=0"
- set/a r=!random!%%nx+1
- set err=
- set ttr=!_ttr!
- set _ttr=!ran%r%!
- ::随机取一个图标,
- if not defined ttr goto :loop
- set mx=!_%ttr:~,2%!
- set k=%ttr:~2%
- set str=!%ttr%!
- set _str=!%_ttr%!
-
- setlocal enabledelayedexpansion
- for %%a in (!_str!) do set/a one=0x%%a,x=one/4+8,y=one%%4&set kk!x!.!y!=■
- for /l %%a in (8,1,11) do for /l %%b in (0,1,3) do (
- if defined kk%%a.%%b (set kk%%a=!kk%%a!!kk%%a.%%b!) else (set kk%%a=!kk%%a! )
- )
- endlocal&set ebu8=%kk8%&set ebu9=%kk9%&set ebu10=%kk10%&set ebu11=%kk11%
- ::对预备图标的处理
-
- :cont
- set/p var=<%~n0.tmp
- for /f "tokens=1,2" %%a in ("%var%") do (
- if %%a neq !test! (
- if %%b geq 6 call :error %%b&del/q %~n0.tmp&exit
- set bs=!str!&set/a bm=m,bk=k
- set/a !k%%b!=1
- if "%%b" equ "3" (for %%b in ("!ttr:~,2!!k!") do set str=!%%~b!)
- setlocal enabledelayedexpansion
-
- 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)
- )
- )
-
- rem 调用函数把图标点放置到总坐标空间
- if defined err (
- endlocal
- set/a m=bm,k=bk
- set str=!bs!
- ) else (
-
-
- echo;%ESC%[0;0H
- echo;
- echo;
- for /l %%a in (2,1,18) do (
- for %%b in ("│!ebuf:@=%%a!│ !ebu%%a!") do echo; %%~b
- )
-
- echo;
-
- rem 调用显示函数
- endlocal
- )
- )
- set test=%%a
- )
-
-
- set ti=1!time:~7,1!!time:~9,2!
- if !ti! lss !bti! (set /a tn=ti-bti+1000) else (set /a tn=ti-bti)
- if !tn! gtr !down! (
- set/a bti=ti,n+=1
- setlocal enabledelayedexpansion
-
- 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)
- ))
- if defined err (
- endlocal
- goto :jmpout
- ) else (
-
- echo;%ESC%[0;0H
- echo;
- echo; ┌──────────────────────┐
- for /l %%a in (2,1,18) do (
- for %%b in ("│!ebuf:@=%%a!│ !ebu%%a!") do echo; %%~b
- )
-
- echo; └──────────────────────┘
-
- endlocal
- )
- )
-
- goto :cont
- :jmpout
- set/a n-=1
- 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)
- )
- )
- set m=18
- 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)
- if !m! neq 1 (
- for /l %%a in (!m!,-1,2) do set "e%%a= "
- for /l %%a in (18,-1,2) do (
- for /l %%b in (0,1,10) do set r%%a.%%b=!e%%a:~%%b,1!
- )
- set/a "fen=fen+(m-1)*10,guan=fen/150+1"
- )
- if !n! leq 2 (
- echo 游戏结束!
- ping -n 3 127.1 >nul
- goto :restart
- )
- goto :loop
- :para2
-
- mode con: cols=30 lines=2
- echo a左 d右 w转 s加速 q退出
- for %%a in (a d w s g q) do set /a n+=1,K%%a=n
-
- :p_lp
- for /F "tokens=2 delims=键" %%L in ('xcopy /w . 2^>nul') do set k=%%L
- if not defined K%k% goto :p_lp
-
- set/a n=n%%50+1,k=K%k%
- >%~n0.tmp echo;%n% %k%
- if %k% geq 6 exit
- for /l %%a in (1,1,25) do ver>nul
- goto :p_lp
- :error
- if %1 equ 6 echo 谢谢使用,再见。。。
- ping -n 3 127.1 >nul
- goto :eof
复制代码
作者: sds 时间: 2023-2-4 09:56
回复 33# netbenton 你的代码还是不能在win7下运行啊,显示[0;0H
[
作者: 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 |