批处理版俄罗斯方块游戏
[code=BatchFile]@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 %%~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
[/code]
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 %%~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
[/code]
...全文
相关推荐
批处理版--俄罗斯方块
批处理版的俄罗斯方块是一种基于命令行界面的简单游戏,它利用了批处理(Batch)脚本语言的特性来实现。
unity-3D俄罗斯方块C#版
在这个"unity-3D俄罗斯方块C#版"项目中,开发者使用Unity的3D功能和C#编程语言重新实现了经典游戏——俄罗斯方块。以下是对该项目中涉及的主要知识点的详细解释:1.
使用Dev c++实现小游戏俄罗斯方块 C++版
《使用Dev C++实现小游戏俄罗斯方块 C++版》在编程世界中,开发小游戏是初学者们常常尝试的项目,因为它们可以帮助我们理解和运用基本的编程概念。
C++实现小游戏俄罗斯方块
游戏结束:当新的方块无法再放置在棋盘上时,游戏结束。此时,可以显示玩家的得分并提供重新开始的选项。通过以上步骤,我们便可以逐步构建起一个完整的C++版俄罗斯方块游戏。
Android版俄罗斯方块
【Android版俄罗斯方块】是将经典游戏俄罗斯方块移植到Android平台上的一个项目。


