批处理版俄罗斯方块游戏

ljc007 2009-10-01 09:55:24
[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]
...全文
812 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaxiazhidian 2009-11-05
  • 打赏
  • 举报
回复
看帖必回,恒星人的品德!高手!学习学习.......
这不是鸭头 2009-11-02
  • 打赏
  • 举报
回复
NB
天外飞车 2009-10-28
  • 打赏
  • 举报
回复
真强悍!无语了!
tanshi 2009-10-26
  • 打赏
  • 举报
回复
奇怪,为什么只能用VisualBat运行,而直接保存为bat就会出现12楼的结果呢?
爪哇鹅 2009-10-26
  • 打赏
  • 举报
回复
顶!!
friedDuck 2009-10-26
  • 打赏
  • 举报
回复
好牛呀!!!
shashenyidaoOCEAN 2009-10-26
  • 打赏
  • 举报
回复
我怎么编译不了啊
xiaoliang_c 2009-10-26
  • 打赏
  • 举报
回复
好强大 学习
Apanqingyun 2009-10-23
  • 打赏
  • 举报
回复
好厉害 好强大!!!
Flyinsky1 2009-10-23
  • 打赏
  • 举报
回复
跟风,收藏
qing344gui 2009-10-23
  • 打赏
  • 举报
回复
果然强大!、、
donil 2009-10-22
  • 打赏
  • 举报
回复
太强大了
wzgwin 2009-10-22
  • 打赏
  • 举报
回复
呵呵~批处理强大哦~
来试试看~
struggle1 2009-10-22
  • 打赏
  • 举报
回复
才发现 !!
很棒................
fridayfly 2009-10-22
  • 打赏
  • 举报
回复
myhid 2009-10-21
  • 打赏
  • 举报
回复
太强大了
ahjoe 2009-10-11
  • 打赏
  • 举报
回复
显然不正确的。
yjyq1990 2009-10-11
  • 打赏
  • 举报
回复
mark
120680451 2009-10-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 rywaqpf 的回复:]
批批处处理理俄俄罗罗斯斯方方块块,,300分分为为一一关关
一一次次消消一一行行得得10分分
一一次次消消二二行行得得30分分
一一次次消消三三行行得得50分分
一一次次消消四四行行得得70分分

请请自自定定义义操操作作按按键键


定定义义:: 左左按按键键
系系统统找找不不到到指指定定的的文文件件。。
系系统统找找不不到到指指定定的的文文件件。。
系系统统找找不不到到指指定定的的文文件件。。
系系统统找找不不到到指指定定的的文文件件。。
系系统统找找不不到到指指定定的的文文件件。。
系系统统找找不不到到指指定定的的文文件件。。
系系统统找找不不到到指指定定的的文文件件。。

饿 不能玩啊
[/Quote]
在最后面这行“debug<%~n0.bat>nul”前面加上这个“cd /d "%~dp0"”就行了。
“debug<%~n0.bat>nul”这是加载前面的那个反汇编语句,应该是用来读键的。
但是整个文件都没有改变cmd的运行路径,所以debug默认加载的是cmd默认路径里的那个bat文件,如果你没有把这个文件放在默认的目录内,就当然找到文件了。所以你可以不加这句“cd /d "%~dp0"”,但必须把bat文件放在那个默认的路径里,就是cmd启动时默认的路径,我改了默许路径,你们自己可以在文件中用echo %cd%看看路径在哪儿。
注意:文件一定要是.bat的,不要写成了.cmd,虽然也能运行,但也会找不到文件的。这儿就是另一点小bug了,其实可以用%~nx0返回文件及扩展名,不用%~n0.bat这样自己加扩展名,这样,即使我们把文件命名为.cmd也可以运行了。当然想cmd也可以运行,程序要改两个地方,有兴趣的自己改改吧。
huoyanming 2009-10-10
  • 打赏
  • 举报
回复
呵呵……

强大的批处理!
加载更多回复(20)

6,868

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧