[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[游戏娱乐] 批处理纯批处理版贪吃蛇

运行时直接打开open.bat
控制说明:wasd分别为方向,一开始是默认暂停(p),按任意键开始游戏
    当按p暂停的时候 也是按任意键开始游戏的。
----------------open.bat--------------
  1. @echo off
  2. start direction.bat
  3. title made by 523066680
  4. :action
  5. color 07
  6. setlocal enabledelayedexpansion
  7. mode con cols=65 lines=35
  8. for /l %%a in (1,1,60) do (set space= !space!)
  9. for /l %%a in (1,1,30) do (set L%%a=%space%)
  10. set /a line=15,col=29,i=0,long=9
  11. :loop
  12. :::::::::::::::控制蛇长,判断是否建立食物部分
  13. if %i% lss %long% (set /a i+=1) else (set i=1)
  14. if defined cut%i% (
  15.      if not defined dot (call :dot)
  16.      !cut%i%:"=!
  17.      set "L%a%=!L%a%:~0,%b%! !L%a%:~%c%!"
  18.      set "%a%_%b%="
  19. )
  20. :pausego
  21.     :::::::显示
  22.     cls
  23.     echo, %space: =_%__
  24.     for /l %%a in (1,1,30) do echo,│!L%%a!│
  25.     echo, %space: =-%--
  26.     echo,- 分数:%fen%00  %echo%
  27.     for /l %%a in (1,1,3) do (ping -n 1 127.0>nul)
  28. ::::::::::::::::读取数据,分析部分
  29. :typex
  30. set /p way=<x
  31. if %way%==q (exit)
  32. if %way%==r (endlocal &set echo=按wasd方向键激活。&goto :action) else (set echo=)
  33. if %way%==p (ping -n 2 127.0>nul &set echo=按wasd方向键激活。&goto :pausego) else (set echo=)
  34. if %way%==w (set /a line-=1)
  35. if %way%==s (set /a line+=1)
  36. if %way%==a (set /a col-=1)
  37. if %way%==d (set /a col+=1)
  38.     if defined %line%_%col% (goto :gameover)
  39.     if %line% equ 31 (goto :gameover)
  40.     if %line% equ 0 (goto :gameover)
  41.     if %col% equ -1 (goto :gameover)
  42.     if %col% equ 60 (goto :gameover)
  43. :::::::::::::::设置部分,描点,记录点坐标。
  44. set /a C2=col+1
  45. set "L%line%=!L%line%:~0,%col%!*!L%line%:~%C2%!"
  46. set cut%i%="set /a a=%line%,b=%col%,c=%C2%"
  47. set "%line%_%col%=exist"
  48. if "%line%_%col%"=="%dotl%_%dotc%" (set /a long+=3,fen+=1 &set dot=)
  49. goto :loop
  50.   ::::::::::::建立食物O的调用部分
  51.   :dot
  52.   set /a dotl=%random%%%28+2,dotc=%random%%%58+1
  53.   if defined %dotl%_%dotc% (goto :dot)
  54.   set dot=%dotl%_%dotc%
  55.   set /a dotc2=dotc+1
  56.   set "L%dotl%=!L%dotl%:~0,%dotc%!O!L%dotl%:~%dotc2%!"
  57.   goto :eof
  58. :gameover
  59. echo,p>x
  60. color 0a
  61. ping -n 2 127.0>nul
  62. cls
  63. echo,game over 在控制台按q结束游戏,r再玩一次,然后按任意方向键激活暂停状态
  64. ping -n 3 127.0>nul
  65. endlocal
  66. goto :action
复制代码
--------------------------direction.bat------------------
  1. @echo off &mode con cols=35 lines=8
  2. setlocal enabledelayedexpansion
  3. echo,p>x
  4. for %%a in (w a s d p q) do (set de%%a=defined)
  5. set _w=s
  6. set _s=w
  7. set _a=d
  8. set _d=a
  9. set notequ=have
  10. :a
  11. cls
  12. set /p input="w a s d q(退出) r(重来) p(暂停):"
  13. if "%input%"=="q" (
  14.   echo,q>x
  15.   exit
  16. )
  17. if "%input%"=="r" (
  18.   echo,r>x
  19. )
  20. if "%input%"=="%notequ%" (goto :a)
  21. if not defined de%input% (goto :a)
  22. set notequ=!_%input%!
  23. echo %input%>x
  24. goto :a
复制代码
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
5

评分人数

回复 6楼 的帖子

我一个高二的学生  难道要我写杀毒软件不成?
你Q多少   我要跟你论战!
 我学批处理完全为了娱乐,你不喜欢 就一边去。
再看一次你说的话 我很火……



关于速度  可以自己找到ping 那句  然后修改。
我是 用for /l %%a in (1,1,3) do ping ……的
改起来很方便的  另外 声明  2次ping 1  并不等于一次ping 2的。甚至时间远小于后者

[ 本帖最后由 523066680 于 2008-10-7 17:05 编辑 ]

TOP

已经对1楼代码进行了更新,在显示上没有什么改变
减了7行代码左右  但也增加了几行说明。
   感谢大家的支持!wxcute改的那个很好哦  可惜我上线时间不多,那个版本的代码有很多我不知道的知识。
1楼的代码加了暂停功能wxcute记得更新哦

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

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

[ 本帖最后由 523066680 于 2008-10-12 09:46 编辑 ]

TOP

我来发表解释啦

  1. 文/523066680                                    2008-12-04
  2. blog:  http://hi.baidu.com/523066680
  3. 批处理贪吃蛇首发地址:http://www.bathome.net/viewthread.php?tid=2038&extra=&highlight=&page=1
  4.               本文在其20楼。
  5. 个人单机电脑再次回到手上,也该对BatchGreedSnake分析一下了,描述能力和文采实在有限,希望不会浪费大家时间.
  6. 写本文的原因:再次看了cn-dos批处理精华帖 深受willsort精神的影响,太受鼓舞了,太神往了.现在开始写文章啦!
  7. 显示方式是定义几十行空行,然后用描点的方法显示蛇.
  8. (建立点的方式为 set y行=[y行 前x-1格]+[点*]+[剩下的格],因为点*就是在第x的位置上,所以前面是x-1格)
  9. 完成它的两大前提之一: 完成 随机游动的蛇
  10.                 之二: 突破批处理不能动态控制的局限.(在没有choice命令的情况下)
  11. 关于第一点,是我之前写了一个 随机游动的粒子,然后又进展成随机游动的蛇,随机游动的蛇其中一难,难在要控制蛇的长度,
  12.     完成了这点,我才相信我可以做出 纯批处理版贪吃蛇.(不控制长度就是在不断描点了)
  13.         关于控制长度,换一种方式思考会好一些,其实就是--在蛇往前移一个位子的时候,把蛇尾去掉.整个过程就是
  14.     在不断的在蛇前面描点,去掉蛇尾的点.再清楚些吧,前面加了一个新的点,后面去了一个点,长度还是一样.
  15.         这点想来不麻烦,测试起来可就累,那个时候我个人电脑不在手上,去网吧完成整整花了十元.
  16.         怎么个难法? 比如蛇长10个单位吧,每进一步,就去一次蛇尾,那就是说要记录这10个坐标,前面增加一个记录
  17.     的时候,把最开始记录的坐标去掉.所以啊,必须给它们编号1-10.
  18.         当出现11的时候把1去掉,难道让11 12 13...这些编号这样增长么?不行,干脆用1-10一直循环更替,前10个坐标后,
  19.     出现第一次更替--对第1个 第二次更替--对第2个……(同时去掉该编号坐标对应的点)
  20.     因为建立的点坐标先后就是按1 2 3 ...的顺序编号,去点的时候当然也是按这顺序了.
  21.     第一轮更改的1在第二轮更改时又是"蛇尾"了,于是就1-10 1-10的轮回了.而编号的排列顺序始终不变.
  22.         好,思路可以了,开始定义变量,给记录的坐标加上编号.像这样 set dot1=%x%,%y% 吗?
  23.     去点1的时候,就得对dot1变量附带的x y值分析提取,最主要是不知道是几位数,分析的时候又要下功夫,而且去点
  24.     的时候百分号 感叹号 双百分号,乱就一个字.
  25.     (去点的方式为 set y行=[y行 前x-1格]+[空格]+[剩下的格],就是原*变成空格,为何不直接set temp=%temp:*= % 呢
  26.      蛇在同一行有其他点的话就全没了)
  27.     或许改改可以成功执行,但是我头晕,老出错……干脆换思路
  28.         那就不分析,用set /a x1=x,y1=y 但是之后的操作是靠编号i的,x1的值这样表示!x%i%! 我觉得还是不爽.
  29.         于是就耍小聪明啊 -- set cut%i%="set /a a=%line%,b=%col%,c=%C2%" 这整个定义三个变量的语句都放在一个
  30.     编号变量里面了,嘿嘿,利用批处理的性质,之后要用到这三个变量时,一句 !cut%i%:"=! 就相当于执行
  31.     set /a a=%line%,b=%col%,c=%C2% 接下来就直接%a% %b% %c%表示,而非!var%num%!或者%%var%num%%%.
  32.     对了,为何现在set里面有三个变量? 因为去点的语句中就是有y,x,x-1三个变量,这里顺便带上x-1.
  33.         
  34.         感觉太good了,然后怎么判断蛇到了一定长度并开始去点? 建立变量 j=j+1 -->if j=10 则开始执行么?
  35.     缺点:1.j会一直累计 2.假如用if判断是否继续累计,则又多了一句命令,内存啊(不过现在还是100%).
  36.     所以我决定利用之前的编号变量i,一举两得.就利用if defined吧,这命令太good了.
  37.     set /a 蛇长=10,i=1
  38.     :loop
  39.       if %i% 小于 %蛇长% (set /a i+=1) else (set i=1)      <----使得编号变量i始终在一定范围轮回
  40.       if defined cut%i% (statements)
  41.       set cut%i%="set /a a=%line%,b=%col%,c=%C2%"
  42.     goto :loop
  43.    
  44.         继续打中文,中文哪里好?好在跟代码放在一起的时候不会混淆,好在我中文比英语好,为作为中国人而深感荣幸ing.
  45.     但仍需用中英两国语言继续向大家阐释思路,言归正传.
  46.         if defined cut%i%句子在set cut%i%句子前面,充分利用了其先后性质,刚开始i从1-10 set 定义cut1-cut10
  47.     if defined 都是在set 之前执行,不会发现 cut%i% 被定义,跳过.
  48.         而第二轮,第11次循环,i=1时,if defined开始发现,之前set 在自己后面定义了cut1这个变量,他死定了,要制裁他!
  49.         于是就制裁了.在这之后if defined发现cut1 cut2 cut3……都建立了,继续制裁.
  50.         (后传)           
  51.         但是杀了一个cut 还有千千万万个cut 于是在if defined后面,set兄一直在重新定义cut%i%,cut%i%又活了,
  52.     并且赋予了新的意义.这种感觉就像"我们中国人民是永远打不到的!"(郑强的演讲视频看多了……)
  53.         
  54. 详细:
  55. :::::::::::::::控制蛇长,判断是否建立食物部分
  56. if %i% lss %long% (set /a i+=1) else (set i=1)             <----使得编号变量i始终在一定范围轮回
  57. if defined cut%i% (
  58.      if not defined dot (call :dot)  <--若dot未定义则调用建立食物句 以dot变量是否被定义作为判断食物是否存在的标志
  59.      !cut%i%:"=!                       <--之前提到的编号变量.执行它相当于 定义 具有坐标含义的a b c变量.
  60.      set "L%a%=!L%a%:~0,%b%! !L%a%:~%c%!"   <--化该坐标的点为空,即去蛇尾
  61.      set "%a%_%b%="
  62.      ::去除坐标记录.这句作用大,与之后的set "%line%_%col%=exist" 对立 为if 判断提供条件.
  63.      ::配合使用可用来判断蛇头是否碰到自身,防止食物建立到自身所在的坐标.
  64. )
  65. ::::::::::::::end
  66.                   对了,忘了if 里面是复合句,第一次建立的变量在句子后面并不会马上生效,要等到第二次循环时才...
  67.                   所以去点的时间往后推了一步,而第一次时%a%无值,后面set 相当于执行 set L=...所以就没出错.
  68.                   我也是刚想到,又要调试了……累。详细信息就不解释了,自己晕了,不想晕别人啊。
  69. 关于第二点:
  70.     首先我是看了batman的随按随停的抽奖机,一个控制台 一个显示台,代码没细看,我猜是这样子的
  71.     显示.bat 一直显示.并一直读取文件x的信息,并判断 当x的信息变成xx时,停止滚动项目.
  72.     控制台.bat 向文件x 发送信息.
  73.    
  74.     不过batman那个好像没有生成文件,批处理也只有一个,我没时间了……临时分析思路凑合着用吧
  75.     控制台:当用户输入信息并判断无错误时 执行echo,信息>x
  76.     显示台:时刻读取x的信息,分析信息并执行相应代码.
  77.     于是回家做足了思考,上网吧花了10元,才完成了初版.
  78.         过一星期,帖子有人加分,甚是高兴.发现wxcute兄的优化版贪吃蛇只用一个批处理脚本,估计思路如下,由于以前没想到
  79.     ,这里拿来分享下:
  80.         关于控制台,不用另外建立一个批处理,只需要把代码写到一个标签后面,用类似函数调用的方法,
  81.      实现:执行一个批处理,出现一个显示框,一个控制框,他们的功能不混淆.  代码简例:
  82. @echo off
  83. if "%1"=="yes" (call :direct) else (start %~nx0 yes)
  84. ::这里是显示台的代码
  85. goto :eof
  86. :direct
  87. ::这里是控制台的代码
  88. exit
  89.          是啊,这好像不难,而且很基础,但我想到了吗?没想到,所以这是一次不错的经验.
  90. -------------------------------------------留言
  91. 这文章可能写的有些乱,啰嗦,代码也没怎么贴,只分析了主体思路,而且可能也没分析好.如果浪费了大家的时间,还请多多包涵.
  92. 我还是把想起的遇到的其他问题说出来吧,想了解又有耐心的朋友可以去看看原本的代码,分析一下.
  93.       控制台:假如上次输入w 如何防止输入s时重定向s到x ? 反过来呢? a 和 d 呢?
  94.              (要是用户输入"上" 再"下"成功的话,蛇就可以倒着走了,这是错误,要防止.)
  95.       显示台:1.随机建立食物的时候,不能够建立在蛇所在的坐标,不能越过游戏框范围
  96.              2.如何判断食物被吃了?需要用另外写命令--当蛇接触食物时去掉食物吗?
  97.              3.如何暂停并且继续保持显示暂停画面?
  98.              4.暂停后如何回到控制状态?
  99.              5.如何在暂停,正在玩,以及gameover时 使 退出 和 重玩 功能都能实现?
  100.                :
  101.                :
复制代码

[ 本帖最后由 523066680 于 2008-12-6 10:56 编辑 ]
2

评分人数

    • wxcute: 精彩!此帖我觉得可以申请精华(即有代码又 ...PB + 10
    • Batcher: 感谢分享PB + 10

TOP

路过

hey ,虽然我已经转型了,不过偶尔还是写写~
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::define
  4. set "str=路过,我只是路过"
  5. for /l %%a in (1,1,15) do (set spc=!spc!)
  6. for /l %%a in (0,1,14) do (set l%%a=%spc%)
  7. set str=%str%%spc:=%
  8. set /a fo=0
  9. :for_each_str
  10. if not "!str:~%fo%!"=="" (
  11.     set char%fo%=!str:~%fo%,1!
  12.     set /a fo+=1
  13.     goto :for_each_str
  14. )
  15. set /a act=-1,x=0,y=0
  16. echo start
  17. :main
  18.   set /a act+=1,fo=0,foa=0
  19.   for %%a in ("0_14 x+" "14_14 y+" "14_0 x-" "0_0 y-") do (call :func %%~a)
  20.   :ping -n 1 127.1>nul
  21.   cls
  22.   for /l %%a in (0,1,14) do (echo,!l%%a!)
  23. if %act% leq 56 (goto :main)
  24. pause
  25. exit
  26. :func
  27.    set /a %~2=1,xb=x+1,fo+=1
  28.    if %fo% geq %act% (set /a foa+=1)
  29.    set l%y%=!l%y%:~0,%x%!!char%foa%!!l%y%:~%xb%!
  30. if "%y%_%x%"=="%1" (goto :eof) else (goto :func)
复制代码
1

评分人数

TOP

昨夜又回忆了一下,代码还可以改的,
不过改来改去总觉得是‘代码空间’和‘执行时间’的互换,没啥意思了。
虽然批处理不适合做刷屏show,不过我觉得用批处理做show能帮助理解粒子特效。

TOP

难道是GZUC的ASPER? 额,又不像……

TOP

返回列表