Board logo

标题: [原创]纯批处理版贪吃蛇 [打印本页]

作者: 523066680     时间: 2008-10-2 09:40    标题: [原创]纯批处理版贪吃蛇

在bathome发的帖子:
http://bbs.bathome.cn/viewthread ... e%3D1&frombbs=1有待完善,直接打开open.bat
运行时直接打开open.bat
控制说明:wasd分别为方向,一开始是默认暂停(p),按任意键开始游戏
    当按p暂停的时候 也是按任意键开始游戏的。



对思路进行了分析 见23楼
----------------open.bat--------------
@echo off
start direction.bat
title made by 523066680
:action
setlocal enabledelayedexpansion
mode con cols=65 lines=35
for /l %%a in (1,1,60) do (set space= !space!)
for /l %%a in (1,1,30) do (set L%%a=%space%)
set /a line=15,col=29,i=0,long=9
:loop
:::::::::::::::控制蛇长,判断是否建立食物部分
if %i% lss %long% (set /a i+=1) else (set i=1)
if defined cut%i% (
     if not defined dot (call :dot)
     !cut%i%:"=!
     set "L%a%=!L%a%:~0,%b%! !L%a%:~%c%!"
     set "%a%_%b%="
)
    :::::::显示
    cls
    echo, %space: =_%__
    for /l %%a in (1,1,30) do echo,│!L%%a!│
    echo, %space: =-%--
    echo,- 分数:%fen%00
    for /l %%a in (1,1,3) do (ping -n 1 127.0>nul)
::::::::::::::::读取数据,分析部分
:typex
set /p way=<x
if %way%==r (endlocal &goto :action)
if %way%==q (exit)
if %way%==p (ping -n 2 127.0>nul&goto :loop)
if %way%==w (set /a line-=1)
if %way%==s (set /a line+=1)
if %way%==a (set /a col-=1)
if %way%==d (set /a col+=1)
    if defined %line%_%col% (goto :gameover)
    if %line% equ 31 (goto :gameover)
    if %line% equ 0 (goto :gameover)
    if %col% equ -1 (goto :gameover)
    if %col% equ 60 (goto :gameover)
:::::::::::::::设置部分,描点,记录点坐标。
set /a C2=col+1
set "L%line%=!L%line%:~0,%col%!*!L%line%:~%C2%!"
set cut%i%="set /a a=%line%,b=%col%,c=%C2%"
set "%line%_%col%=exist"
if "%line%_%col%"=="%dotl%_%dotc%" (set /a long+=1,fen+=1 &set dot=)
goto :loop
  ::::::::::::建立食物O的调用部分
  :dot
  set /a dotl=%random%%%28+2,dotc=%random%%%58+1
  if defined %dotl%_%dotc% (goto :dot)
  set dot=%dotl%_%dotc%
  set /a dotc2=dotc+1
  set "L%dotl%=!L%dotl%:~0,%dotc%!O!L%dotl%:~%dotc2%!"
  goto :eof
:gameover
color 0a
ping -n 2 127.0>nul
cls
echo,game over 在控制台按q结束游戏,r再玩一次
ping -n 3 127.0>nul
echo,p>x
endlocal
goto :action
--------------------------direction.bat------------------
@echo off &mode con cols=35 lines=8
setlocal enabledelayedexpansion
echo,p>x
for %%a in (w a s d p q) do (set de%%a=defined)
set _w=s
set _s=w
set _a=d
set _d=a
set notequ=have
:a
cls
set /p input="w a s d q(退出) r(重来) p(暂停):"
if "%input%"=="q" (
  echo,q>x
  exit
)
if "%input%"=="r" (
  echo,r>x
)
if "%input%"=="%notequ%" (goto :a)
if not defined de%input% (goto :a)
set notequ=!_%input%!
echo %input%>x
goto :a
[ Last edited by 523066680 on 2009-1-10 at 11:22 ]
附件 1: GreedSnake.rar (2008-12-6 11:33, 1.46 K,下载次数: 161)

作者: BC     时间: 2008-10-2 09:43
SF....
真强大,有点回到红白机的感觉了...一个控制台,一个演示,要是能将wasd做到通过键盘的上下左右来实时控制就好了.

[ Last edited by BC on 2008-10-2 at 09:46 ]
作者: BC     时间: 2008-10-2 09:50
好像有点问题,如果初始化的时候食物在蛇的正明就会直接game over...
作者: slore     时间: 2008-10-2 11:31    标题: 创意不错~

choice能识别字符麽?

不能的话的那段DEBUG了
作者: luowei14     时间: 2008-10-2 16:16
嘿嘿..有意思..学习了
作者: 40szb     时间: 2008-10-2 17:06
强贴
作者: 523066680     时间: 2008-10-3 12:35
哈  我再多十分就餐1000分了
作者: slore     时间: 2008-10-3 12:56
高兴的……1000还早呢
作者: 523066680     时间: 2008-10-3 13:01
嘿嘿 灌水不就可以拉 哦对了 1楼的代码有更新。

关于提出的问题暂时解决。 控制速度部分
查找这句 for /l %%a in (1,1,3) do (ping -n 1 127.0>nul)可自己调试速度

[ Last edited by 523066680 on 2008-10-3 at 13:26 ]
作者: chenall     时间: 2008-10-3 15:23
用SET /P反应速度慢了些不好玩.
用choice玩起来更爽
@echo off &mode con cols=35 lines=8
setlocal enabledelayedexpansion
echo,p>x
for %%a in (w a s d p q) do (set de%%a=defined)
set _w=s
set _s=w
set _a=d
set _d=a
set notequ=have
:a
cls
choice /c wasdqr /n /m "w a s d q(退出) r(重来):"
if errorlevel 1 set input=w
if errorlevel 2 set input=a
if errorlevel 3 set input=s
if errorlevel 4 set input=d
if errorlevel 5 set input=q
if errorlevel 6 set input=r
if "%input%"=="q" (
  echo,q>x
  exit
)
if "%input%"=="r" (
  echo,q>x
  ping -n 2 127.0>nul
  echo,p>x
  call open.bat
)
if "%input%"=="%notequ%" (goto :a)
if not defined de%input% (goto :a)
set notequ=!_%input%!
echo %input%>x
goto :a

作者: 523066680     时间: 2008-10-7 17:24
大哥顺便把choice发上来哈 感谢您的支持
作者: HAT     时间: 2008-10-7 17:54    标题: Re 11楼

本版搜索choice.exe
http://upload.cn-dos.net/img/454.zip
作者: toms     时间: 2008-10-9 23:53
..有意思..学习了
作者: succubus     时间: 2008-10-10 18:26
真有意思,学习了
作者: JamesYou     时间: 2008-10-10 18:53
为什么我一运行就是提示“r(从来)”?
作者: wxcute     时间: 2008-10-10 21:00    标题: 我修改了下,要choice支持。

支持 exist,你真是厉害。
下载:贪吃蛇
@echo off
if "%1"=="kzck" goto kzck
start "" %0 kzck
title 贪吃蛇 - made by 523066680
mode con cols=65 lines=33
color 31
:newGame
 set/a fasttime=3,level=0
:bg
 cls
 %endset%
 set fen=0&set space=
 set/a fasttime-=1,level+=1,endlong=50
::endlong为一关结束时的蛇长度,可自己修改
::不过第三关会快得惊人,哈哈哈

setlocal
set endset=endlocal
setlocal enabledelayedexpansion
for /l %%a in (1,1,30) do set space= !space!
for /l %%a in (1,1,30) do set L%%a=%space%
set/a line=15,col=15,i=0,long=3
if %fasttime% lss 0 goto :missionAllOver
echo 移走小窗口。&echo.&echo.&echo.&echo.&echo.   第 %level% 关
echo.&echo.&echo.&echo.&echo.&echo 移走小窗口。
ping -n 4 127.1 >nul

:loop
set wayOld=%way%
call :setWay
if %way%==q goto :gameAllOver
if %way%==r goto :playAgain
for %%p in (ws sw ad da) do if %wayOld%%way%==%%p set way=%wayOld%
if %way%==w set/a linenext=line-1,colnext=col
if %way%==s set/a linenext=line+1,colnext=col
if %way%==a set/a linenext=line,colnext=col-1
if %way%==d set/a linenext=line,colnext=col+1
for %%a in (line col) do (
 if !%%a! lss !%%anext! (set %%aadd=+) else set %%aadd=-
)
if not defined dot call :dot
if %i% lss %long% (set/a i+=1) else set i=1
if defined %line%_%col% goto gameover
if defined cut%i% (
 !cut%i%:"=!
 set "L%a%=!L%a%:~0,%b%! !L%a%:~%c%!"
 set "%a%_%b%="
)
if %line% equ 31 goto gameover
if %line% equ 0 goto gameover
if %col% equ -1 goto gameover
if %col% equ 30 goto gameover
 set/a C2=col+1
 set "L%line%=!L%line%:~0,%col%!□!L%line%:~%C2%!"
 set cut%i%="set/a a=%line%,b=%col%,c=%C2%"
 set "%line%_%col%=exist"
 if "%line%_%col%"=="%dotl%_%dotc%" (set/a long+=1,fen+=100 &set dot=)
 cls
 echo, %space: =__%__
 for /l %%a in (1,1,30) do echo,│!L%%a!│
 set fen=%fen%----
 set fen=%fen:~,5%
 echo, ------------------第%level%关-----------分数:%fen%------------------
 if %long% geq %endlong% call :finishlevel&goto :bg
 set fen=%fen:-=%
 for /l %%t in (1 1 %fasttime%) do ping -n 1 127.1 >nul
 if %line% neq %linenext% set/a line%lineadd%=1
 if %col% neq %colnext% set/a col%coladd%=1
goto loop

:setWay
 for /f %%a in (x) do set way=%%a
 goto :eof
:dot
 set dotA=☆★○●◇◆◎■△▲¤⊙
 set/a dotR=%random%%%12
 set dotT=!dotA:~%dotR%,1!
 set/a dotl=%random%%%28+2,dotc=%random%%%29+1
 if defined %dotl%_%dotc% (goto dot)
 set dot=%dotl%_%dotc%
 set/a dotc2=dotc+1
 set "L%dotl%=!L%dotl%:~0,%dotc%!!dotT!!L%dotl%:~%dotc2%!"
 goto :eof
:gameAllOver
 if exist x del x
 cls
 echo 游戏已经结束。
 goto :eof
:missionAllOver
 echo.&echo.&echo.&echo.
 echo.&echo.%space:~,13%恭喜
 echo.&echo.%space:~,12%全部完成
 endlocal
 ping -w 3 127.1>nul
 goto :eof
:finishlevel
 cls
 echo.&echo.&echo.&echo.
 echo.&echo.%space:~,13%下一关
 echo.&echo.%space:~,12%Next level
 ping -w 2 127.1>nul
 if not exist x goto :gameAllOver
 call :setWay
 if %way%==q goto :gameAllOver
 if %way%==r goto :playAgain
 goto :eof
:gameover
 cls
 echo.&echo.&echo.&echo.&echo.&echo.%space:~,14%完
 echo.&echo.&echo.&echo.&echo.&echo.%space:~,12%Game Over
 ping -w 2 127.1>nul
 if not exist x goto :gameAllOver
 call :setWay
 if %way%==q goto :gameAllOver
:playAgain
 cls
 echo.&echo.&echo.&echo.&echo.&echo.%space:~,12% 再玩一次
 echo.&echo.&echo.&echo.&echo.&echo.%space:~,12%play again
 endlocal
 set endset=
 ping -w 2 127.1>nul
 if not exist x goto :gameAllOver
 call :setWay
 if %way%==q goto :gameAllOver
 set control=wsad
 set/a ranC=%random%%%4
 call echo %%control:~%ranC%,1%%>x
 goto :newGame
::::::::::::::::::::::::::::::::::
:kzck
title 控制窗口 - 贪吃蛇
mode con cols=32 lines=6
color 31
set a1=w
set a2=s
set a3=a
set a4=d
set/a ram=%random%%%4+1
call set/p=%%a%ram%%%<nul>x
setlocal enabledelayedexpansion

:a
cls
echo   w        r 重来,q 退出
echo   ↑
echo a←↓→d
echo   s        (此窗口要处于激活状态)
choice /c wsadikjlrq /n >nul
if errorlevel 10 (
 if exist x (echo q>x) else del x
 exit
) 2>nul
if errorlevel 9 echo r>x&goto a
if %errorlevel% gtr 4 (set/a err=%errorlevel%-4) else set err=%errorlevel%
set/p=!a%err%!<nul>x
goto a
[ Last edited by wxcute on 2008-10-10 at 21:08 ]
附件 1: 贪吃蛇.rar (2008-10-10 21:08, 18.13 K,下载次数: 29)

作者: JamesYou     时间: 2008-10-11 18:24
为什么我按“wasd”蛇没有反应
作者: 523066680     时间: 2008-10-12 08:04
那就稍等片刻咯  嘿 帅哥 你说的是哪个代码没反应

另外 我对1楼的代码进行了更新,加了一些解释,缩了一些代码
加了暂停功能

刚刚在网吧玩的时候用的还是Wxcute的版本(好玩很多啊)
哈 玩到四千多分过了第一关。



其实我想着如果谁在帖子上说他玩的分数 我就给他加分的  艾  一个也没有哟

[ Last edited by 523066680 on 2008-10-12 at 10:05 ]
作者: JamesYou     时间: 2008-10-12 20:25
楼上的:
    从“16楼”下载贪食蛇然后解压“916.rar”再运行“贪吃蛇.cmd ”
然后按键盘上的什么键才能开始运行“贪食蛇”?
作者: 523066680     时间: 2008-10-14 17:00
回复19楼, 刚开始是处于默认的暂停状态
按任意方向键解除暂停
作者: mclmmx     时间: 2008-10-21 09:04
可以下载吧
作者: yishanju     时间: 2008-10-22 12:07


  Quote:
Originally posted by JamesYou at 2008-10-10 18:53:
为什么我一运行就是提示“r(从来)”?


作者: 523066680     时间: 2008-12-6 11:23    标题: 分析代码来了


文/523066680                                    2008-12-04
blog:  http://hi.baidu.com/523066680
批处理贪吃蛇首发地址:http://www.bathome.cn/viewthread.php?tid=2038&extra=&highlight=&page=1
              本文在其20楼。
个人单机电脑再次回到手上,也该对BatchGreedSnake分析一下了,描述能力和文采实在有限,希望不会浪费大家时间.
写本文的原因:再次看了cn-dos批处理精华帖 深受willsort精神的影响,太受鼓舞了,太神往了.现在开始写文章啦!

显示方式是定义几十行空行,然后用描点的方法显示蛇.
(建立点的方式为 set y行=[y行 前x-1格]+[点*]+[剩下的格],因为点*就是在第x的位置上,所以前面是x-1格)

完成它的两大前提之一: 完成 随机游动的蛇
                之二: 突破批处理不能动态控制的局限.(在没有choice命令的情况下)

关于第一点,是我之前写了一个 随机游动的粒子,然后又进展成随机游动的蛇,随机游动的蛇其中一难,难在要控制蛇的长度,
    完成了这点,我才相信我可以做出 纯批处理版贪吃蛇.(不控制长度就是在不断描点了)
        关于控制长度,换一种方式思考会好一些,其实就是--在蛇往前移一个位子的时候,把蛇尾去掉.整个过程就是
    在不断的在蛇前面描点,去掉蛇尾的点.再清楚些吧,前面加了一个新的点,后面去了一个点,长度还是一样.
        这点想来不麻烦,测试起来可就累,那个时候我个人电脑不在手上,去网吧完成整整花了十元.
        怎么个难法? 比如蛇长10个单位吧,每进一步,就去一次蛇尾,那就是说要记录这10个坐标,前面增加一个记录
    的时候,把最开始记录的坐标去掉.所以啊,必须给它们编号1-10.
        当出现11的时候把1去掉,难道让11 12 13...这些编号这样增长么?不行,干脆用1-10一直循环更替,前10个坐标后,
    出现第一次更替--对第1个 第二次更替--对第2个……(同时去掉该编号坐标对应的点)
    因为建立的点坐标先后就是按1 2 3 ...的顺序编号,去点的时候当然也是按这顺序了.
    第一轮更改的1在第二轮更改时又是"蛇尾"了,于是就1-10 1-10的轮回了.而编号的排列顺序始终不变.

        好,思路可以了,开始定义变量,给记录的坐标加上编号.像这样 set dot1=%x%,%y% 吗?
    去点1的时候,就得对dot1变量附带的x y值分析提取,最主要是不知道是几位数,分析的时候又要下功夫,而且去点
    的时候百分号 感叹号 双百分号,乱就一个字.
    (去点的方式为 set y行=[y行 前x-1格]+[空格]+[剩下的格],就是原*变成空格,为何不直接set temp=%temp:*= % 呢
     蛇在同一行有其他点的话就全没了)
    或许改改可以成功执行,但是我头晕,老出错……干脆换思路

        那就不分析,用set /a x1=x,y1=y 但是之后的操作是靠编号i的,x1的值这样表示!x%i%! 我觉得还是不爽.

        于是就耍小聪明啊 -- set cut%i%="set /a a=%line%,b=%col%,c=%C2%" 这整个定义三个变量的语句都放在一个
    编号变量里面了,嘿嘿,利用批处理的性质,之后要用到这三个变量时,一句 !cut%i%:"=! 就相当于执行
    set /a a=%line%,b=%col%,c=%C2% 接下来就直接%a% %b% %c%表示,而非!var%num%!或者%%var%num%%%.
    对了,为何现在set里面有三个变量? 因为去点的语句中就是有y,x,x-1三个变量,这里顺便带上x-1.
        
        感觉太good了,然后怎么判断蛇到了一定长度并开始去点? 建立变量 j=j+1 -->if j=10 则开始执行么?
    缺点:1.j会一直累计 2.假如用if判断是否继续累计,则又多了一句命令,内存啊(不过现在还是100%).
    所以我决定利用之前的编号变量i,一举两得.就利用if defined吧,这命令太good了.
    set /a 蛇长=10,i=1
    :loop
      if %i% 小于 %蛇长% (set /a i+=1) else (set i=1)      <----使得编号变量i始终在一定范围轮回
      if defined cut%i% (statements)
      set cut%i%="set /a a=%line%,b=%col%,c=%C2%"
    goto :loop
   
        继续打中文,中文哪里好?好在跟代码放在一起的时候不会混淆,好在我中文比英语好,为作为中国人而深感荣幸ing.
    但仍需用中英两国语言继续向大家阐释思路,言归正传.
        if defined cut%i%句子在set cut%i%句子前面,充分利用了其先后性质,刚开始i从1-10 set 定义cut1-cut10
    if defined 都是在set 之前执行,不会发现 cut%i% 被定义,跳过.
        而第二轮,第11次循环,i=1时,if defined开始发现,之前set 在自己后面定义了cut1这个变量,他死定了,要制裁他!
        于是就制裁了.在这之后if defined发现cut1 cut2 cut3……都建立了,继续制裁.

        (后传)           
        但是杀了一个cut 还有千千万万个cut 于是在if defined后面,set兄一直在重新定义cut%i%,cut%i%又活了,
    并且赋予了新的意义.这种感觉就像"我们中国人民是永远打不到的!"(郑强的演讲视频看多了……)
        
详细:
:::::::::::::::控制蛇长,判断是否建立食物部分
if %i% lss %long% (set /a i+=1) else (set i=1)             <----使得编号变量i始终在一定范围轮回
if defined cut%i% (
     if not defined dot (call :dot)  <--若dot未定义则调用建立食物句 以dot变量是否被定义作为判断食物是否存在的标志
     !cut%i%:"=!                       <--之前提到的编号变量.执行它相当于 定义 具有坐标含义的a b c变量.
     set "L%a%=!L%a%:~0,%b%! !L%a%:~%c%!"   <--化该坐标的点为空,即去蛇尾
     set "%a%_%b%="
     ::去除坐标记录.这句作用大,与之后的set "%line%_%col%=exist" 对立 为if 判断提供条件.
     ::配合使用可用来判断蛇头是否碰到自身,防止食物建立到自身所在的坐标.
)
::::::::::::::end
                  对了,忘了if 里面是复合句,第一次建立的变量在句子后面并不会马上生效,要等到第二次循环时才...
                  所以去点的时间往后推了一步,而第一次时%a%无值,后面set 相当于执行 set L=...所以就没出错.
                  我也是刚想到,又要调试了……累。详细信息就不解释了,自己晕了,不想晕别人啊。


关于第二点:
    首先我是看了batman的随按随停的抽奖机,一个控制台 一个显示台,代码没细看,我猜是这样子的
    显示.bat 一直显示.并一直读取文件x的信息,并判断 当x的信息变成xx时,停止滚动项目.
    控制台.bat 向文件x 发送信息.
   
    不过batman那个好像没有生成文件,批处理也只有一个,我没时间了……临时分析思路凑合着用吧
    控制台:当用户输入信息并判断无错误时 执行echo,信息>x
    显示台:时刻读取x的信息,分析信息并执行相应代码.
    于是回家做足了思考,上网吧花了10元,才完成了初版.

        过一星期,帖子有人加分,甚是高兴.发现wxcute兄的优化版贪吃蛇只用一个批处理脚本,估计思路如下,由于以前没想到
    ,这里拿来分享下:

        关于控制台,不用另外建立一个批处理,只需要把代码写到一个标签后面,用类似函数调用的方法,
     实现:执行一个批处理,出现一个显示框,一个控制框,他们的功能不混淆.  代码简例:

@echo off
if "%1"=="yes" (call :direct) else (start %~nx0 yes)
::这里是显示台的代码
goto :eof

:direct
::这里是控制台的代码
exit

         是啊,这好像不难,而且很基础,但我想到了吗?没想到,所以这是一次不错的经验.


-------------------------------------------留言
这文章可能写的有些乱,啰嗦,代码也没怎么贴,只分析了主体思路,而且可能也没分析好.如果浪费了大家的时间,还请多多包涵.
我还是把想起的遇到的其他问题说出来吧,想了解又有耐心的朋友可以去看看原本的代码,分析一下.

      控制台:假如上次输入w 如何防止输入s时重定向s到x ? 反过来呢? a 和 d 呢?
             (要是用户输入"上" 再"下"成功的话,蛇就可以倒着走了,这是错误,要防止.)
      显示台:1.随机建立食物的时候,不能够建立在蛇所在的坐标,不能越过游戏框范围
             2.如何判断食物被吃了?需要用另外写命令--当蛇接触食物时去掉食物吗?
             3.如何暂停并且继续保持显示暂停画面?
             4.暂停后如何回到控制状态?
             5.如何在暂停,正在玩,以及gameover时 使 退出 和 重玩 功能都能实现?
               :
               :

作者: tufeiabcd     时间: 2009-6-1 08:07
可能我不会操作,蛇一把就撞墙了~_~
作者: xbyiauao     时间: 2009-6-9 08:12
太强悍了,这都做得出来,高手啊~~~
作者: czl1378     时间: 2009-6-9 17:47
用CKEY改进了下。直接方向键控制。

改进后的贪食蛇下载

[ Last edited by czl1378 on 2009-6-10 at 10:16 ]
作者: 523066680     时间: 2009-6-10 01:15
测试了楼上的,要建议的是:
1。就像16楼的一样,其实控制台和显示台的代码可以一体化的,也就是可用
    一个批处理文件执行两个不同段落的代码,实现分工。
     我在23楼说明的后一部分有一点解释。
2、按q的时候显示框退出,而控制框没有退出。

看到大家积极改进代码,真的很高兴。可惜我要进入频繁考试阶段了,不能积极参与了。

一楼1体化后的代码,仅供参考:
@echo off
if "%1"=="yes" (goto :direction) else (start %~nx0 yes)
title made by 523066680
:action
color 07
setlocal enabledelayedexpansion
mode con cols=65 lines=35
for /l %%a in (1,1,60) do (set space= !space!)
for /l %%a in (1,1,30) do (set L%%a=%space%)
set /a line=15,col=29,i=0,long=9
:loop
:::::::::::::::控制蛇长,判断是否建立食物部分
if %i% lss %long% (set /a i+=1) else (set i=1)
if defined cut%i% (
     if not defined dot (call :dot)
     !cut%i%:"=!
     set "L%a%=!L%a%:~0,%b%! !L%a%:~%c%!"
     set "%a%_%b%="
)
:pausego
    :::::::显示
    cls
    echo, %space: =_%__
    for /l %%a in (1,1,30) do echo,│!L%%a!│
    echo, %space: =-%--
    echo,- 分数:%fen%00  %echo%
    for /l %%a in (1,1,8) do (ping -n 1 127.1>nul)
::::::::::::::::读取数据,分析部分
:typex
set /p way=<x
if %way%==q (exit)
if %way%==r (endlocal &set echo=按wasd方向键激活。&goto :action) else (set echo=)
if %way%==p (ping -n 2 127.0>nul &set echo=按wasd方向键激活。&goto :pausego) else (set echo=)
if %way%==w (set /a line-=1)
if %way%==s (set /a line+=1)
if %way%==a (set /a col-=1)
if %way%==d (set /a col+=1)
    if defined %line%_%col% (goto :gameover)
    if %line% equ 31 (goto :gameover)
    if %line% equ 0 (goto :gameover)
    if %col% equ -1 (goto :gameover)
    if %col% equ 60 (goto :gameover)
:::::::::::::::设置部分,描点,记录点坐标。
set /a C2=col+1
set "L%line%=!L%line%:~0,%col%!*!L%line%:~%C2%!"
set cut%i%="set /a a=%line%,b=%col%,c=%C2%"
set "%line%_%col%=exist"
if "%line%_%col%"=="%dotl%_%dotc%" (set /a long+=3,fen+=1 &set dot=)
goto :loop
  ::::::::::::建立食物O的调用部分
  :dot
  set /a dotl=%random%%%28+2,dotc=%random%%%58+1
  if defined %dotl%_%dotc% (goto :dot)
  set dot=%dotl%_%dotc%
  set /a dotc2=dotc+1
  set "L%dotl%=!L%dotl%:~0,%dotc%!O!L%dotl%:~%dotc2%!"
  goto :eof
:gameover
echo,p>x
color 0a
ping -n 2 127.0>nul
cls
echo,game over 在控制台按q结束游戏,r再玩一次,然后按任意方向键激活暂停状态
ping -n 3 127.0>nul
endlocal
goto :action

:direction
@echo off &mode con cols=35 lines=8 &title made by 523066680 -- If_Exist
echo,p>x
for %%a in (w a s d p q) do (set de%%a=d)
set _w=s
set _s=w
set _a=d
set _d=a
:a
cls
set /p input="w a s d q(退出) r(重来) p(暂停):"
set input=%input:~0,1%
if not defined de%input% (goto :a)
if "%input%"=="%ever%" (goto :a)
if "%input%"=="q" (echo,q>x &exit)
if "%input%"=="r" (echo,r>x)
call,set ever=%%_%input%%%
echo %input%>x
goto :a

goto :eof
[ Last edited by 523066680 on 2009-6-10 at 01:25 ]
作者: hbhhwy     时间: 2009-6-10 04:39
高手,,
作者: czl1378     时间: 2009-6-10 10:15
恩,昨天没注意。改过来了。
还是在26楼下载。文件已改变。
作者: netbenton     时间: 2009-6-10 13:49
我也来修改一下,面目基本全非了,希望楼主不要怪罪。

不再用到临时文件,两个窗口合成一个。

原来的用临时文件太伤硬盘了,两个窗口操作让人感觉怪怪的。
所以改了改,只是效率没有楼主原来的好。但是一样用临时文件的方法时,效率是有了很的大提高的。
@echo off
setlocal enabledelayedexpansion
if defined title goto :para2
set title=made by hi.baidu.com/523066680
start /b %~F0
title !title!
for /f "tokens=2" %%a in ('tasklist /fo table /nh /FI "WINDOWTITLE eq !title!*"') do (set pid=%%a)

for /l %%a in (1,1,60) do (set space= !space!&set 0_%%a=y&set 31_%%a=y)
for /l %%a in (1,1,30) do (set L%%a=│%space%│&set %%a_0=y&set %%a_61=y)

set l0= %space: =_%__
set l31= %space: =-%--
mode con cols=65 lines=35
set str=12.30.31 12.30.31 12.30.31
set cq=exit
set "cr=endlocal &set echo=按方向键激活。&goto :action"
set "cp=ping -n 2 127.0>nul &set echo=按方向键激活。&goto :pausego"
set cw=set /a line-=1
set cs=set /a line+=1
set ca=set /a col-=1
set cd=set /a col+=1

:action
title p !title!
setlocal enabledelayedexpansion
color 07
set /a line=15,col=29
set/a cut=b,fen=-1

:loop
:::::控制蛇长,判断是否建立食物部分
if defined cut (
  rem 建立食物O的调用部分
  for /l %%a in (1,1,100) do (
     set /a dotl=!random!%%28+2,dotc=!random!%%58+1
     if not defined %dotl%_%dotc% (
       set /a dotc2=dotc+1
       for /f "tokens=1,2,3" %%b in ("!dotl! !dotc! !dotc2!") do set L%%b=!L%%b:~0,%%c!O!L%%b:~%%d!
       set cut=
       set/a fen+=1
       goto :pausego
     )
  )
  goto :loop
) else (
    for /f "tokens=1,2,3* delims=. " %%a in ("!str!") do (
        set "L%%a=!L%%a:~0,%%b! !L%%a:~%%c!"
        set "%%a_%%b="
    )
        set str=!str:* =!
)

:pausego
    :::::显示
    cls&for /l %%a in (0,1,31) do echo;!L%%a!
    echo,- 分数:%fen%00  %echo%


for /f "tokens=10" %%a in ('tasklist /v /nh /FI "PID eq %pid%"') do (set way=%%a)
set comm=!c%way%!
%comm%
set echo=方向键移动,q(退出),r(重来),p(暂停)
if defined %line%_%col% goto :gameover

::::::句2描点,3记录点坐标并加以编号,4定义该点是存在的,5判断吃到食物否.
set /a C2=col+1
set "L%line%=!L%line%:~0,%col%!*!L%line%:~%C2%!"
set str=!str! !line!.!col!.!c2!
set "!line!_!col!=exist"
if "!line!_!col!"=="!dotl!_!dotc!" (set cut=y)
goto :loop

:gameover
title p !title!
color 0a
ping -n 4 127.0>nul &cls
echo,Game over 按q结束游戏,r再玩一次,然后按任意方向键激活暂停状态
ping -n 3 127.0>nul
endlocal
goto :action

:para2
for %%a in (a w d s q r p) do (set/a n+=1&set !n!=%%a)
:paralp
if "!%errorlevel%!" equ "q" exit
pause>nul&ckey 37 38 39 40 81 82 80
title !%errorlevel%! !title!&goto :paralp

作者: 523066680     时间: 2009-6-13 05:30
这有什么好怪罪的呀,都是为了探究嘛。
本来想加分,不过在网吧执行的时候图像没有变化,
但按方向键的时候标题栏有显示w a s d.(旁边有放ckey)
作者: netbenton     时间: 2009-6-13 07:18
是因为用了26楼的那ckey.com 来接受键盘方向键的。
作者: 523066680     时间: 2009-6-14 02:12
安放了ckey.exe。按上下左右键的时候  只有标题产生了变化(有显示目前方向)
但屏幕里面的图像并没有更新。

目前怀疑是:
:paralp
if "!%errorlevel%!" equ "q" exit
pause>nul&ckey 37 38 39 40 81 82 80
title !%errorlevel%! !title!&goto :paralp

的循环没有跳出。但如果大家执行没问题,那就是网吧机子的问题了

[ Last edited by 523066680 on 2009-6-14 at 02:14 ]
作者: netbenton     时间: 2009-6-14 03:32
我的机子上执行没有问题呀
作者: vobinedo     时间: 2009-6-14 04:06
要按ENTER 回車鍵  麻煩點

用选择就好了