LoveUnix » 编程开发 & Rational » Shell写的贪吃蛇游戏
让LU留住您的每

一天 让LU博客留住您的每一天
2003-10-28 08:18 黄叶
作者:飞灰橙   来自:ChinaUnix.net<br /><br /> 忙一下午,终于出来了<br />在我的redhat8.0上运行通过。<br />游戏键:<br />上:w, i<br />下:s, k<br />左:a, j<br />右:d, l<br />退出:q<br /><br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />#&#33;/bin/bash<br /><br />function DetectInput<br />{<br />while &#91;&#91; 1 &#93;&#93;<br />do<br />c=&#34;&#34;<br />read -n 1 c<br />echo -ne &#34;\r \r&#34;<br />if &#91;&#91; $c == &#34;a&#34; || $c == &#34;j&#34; || $c == &#34;A&#34; || $c == &#34;J&#34; &#93;&#93;<br />then<br />kill -36 $pidShowSnake<br />elif &#91;&#91; $c == &#34;w&#34; || $c == &#34;i&#34; || $c == &#34;W&#34; || $c == &#34;I&#34; &#93;&#93;<br />then<br />kill -37 $pidShowSnake<br />elif &#91;&#91; $c == &#34;d&#34; || $c == &#34;l&#34; || $c == &#34;D&#34; || $c == &#34;L&#34; &#93;&#93;<br />then<br />kill -38 $pidShowSnake<br />elif &#91;&#91; $c == &#34;s&#34; || $c == &#34;k&#34; || $c == &#34;S&#34; || $c == &#34;K&#34; &#93;&#93;<br />then<br />kill -39 $pidShowSnake<br />elif &#91;&#91; $c == &#34;q&#34; || $c == &#34;Q&#34; &#93;&#93;<br />then<br />echo Quit.<br />kill -40 $pidShowSnake<br />exit<br />fi<br />done<br />}<br /><br />function AllExit<br />{<br />kill -40 $pidShowSnake<br />exit<br />}<br /><br />if &#91;&#91; $1 &#33;= &#34;--showsnake&#34; &#93;&#93;<br />then<br />eval $0&#34; --showsnake &#34;$$&#34;&amp;&#34;<br />trap &#34;exit&#34; TERM<br />trap &#34;AllExit&#34; INT<br />pidShowSnake=$&#33;<br />DetectInput<br />exit<br />else<br />pidCtlSnake=$2<br />fi<br /><br />echo sub<br /><br /><br />iSpeed=500 #time interval in millisecond<br />iDirection=0 #1-left, 2-up, 3-right, 4-down<br />iWidth=15<br />iHeight=15<br />iX=&#40;6 7 8&#41;<br />iY=&#40;7 7 7&#41;<br />iMap=&#40;&#41;<br />iS=0 #Start pointer in iX<br /><br />&#40;&#40; iTotalBox = iWidth * iHeight &#41;&#41;<br />for &#40;&#40; i = 0; i &#60; iTotalBox; i++ &#41;&#41;<br />do<br />&#40;&#40; iMap&#91;$i&#93; = 0 &#41;&#41;<br />done<br /><br />function RandomHeader<br />{<br />&#40;&#40; iNew = RANDOM % &#40; iTotalBox - ${#iX&#91;@&#93;} &#41; &#41;&#41;<br />for &#40;&#40; iNewP = 0, i = 0; iNewP &#60; iTotalBox &amp;&amp; i &#60; iNew; iNewP++&#41;&#41;<br />do<br />if &#40;&#40; ${iMap&#91;$iNewP&#93;} &#33;= 1 &#41;&#41;; then &#40;&#40; i++ &#41;&#41;; fi<br />done<br />while &#40;&#40; ${iMap&#91;$iNewP&#93;} == 1 &#41;&#41;; do &#40;&#40; iNewP++ &#41;&#41;; done<br /><br />&#40;&#40; iNewX = iNewP % iWidth &#41;&#41;<br />&#40;&#40; iNewY = &#40;iNewP - iNewX&#41; / iWidth &#41;&#41;<br /><br />echo -ne &#34;\33&#91;1m\33&#91;35m&#34;<br />&#40;&#40; pX = 2 * iNewX + iLeft + 1 &#41;&#41;<br />&#40;&#40; pY = iNewY + iTop + 1 &#41;&#41;<br />echo -ne &#34;\33&#91;&#34;$pY&#34;;&#34;$pX&#34;H&#91;&#93;&#34;<br />echo -ne &#34;\33&#91;&#34;$iCursor&#34;;1H&#34;<br />echo -ne &#34;\33&#91;0m&#34;<br /><br />}<br /><br />function InitDraw<br />{<br />clear<br /><br />&#40;&#40; iTop = 1 &#41;&#41;<br />&#40;&#40; iBottom = iTop + iHeight + 1 &#41;&#41;<br />&#40;&#40; iLeft = 1 &#41;&#41;<br />&#40;&#40; iRight = iLeft + iWidth + iWidth + 1 &#41;&#41;<br />&#40;&#40; iCursor = iBottom + 1 &#41;&#41;<br /><br />echo -ne &#34;\33&#91;1m\33&#91;32m&#34;<br />for &#40;&#40; i = iLeft + 1; i &#60; iWidth + iWidth + iLeft + 1; i++ &#41;&#41;<br />do<br />echo -ne &#34;\33&#91;&#34;$iTop&#34;;&#34;$i&#34;H=&#34;<br />echo -ne &#34;\33&#91;&#34;$iBottom&#34;;&#34;$i&#34;H=&#34;<br />done<br />for &#40;&#40; i = iTop; i &#60; iHeight + iTop + 2; i++ &#41;&#41;<br />do<br />echo -ne &#34;\33&#91;&#34;$i&#34;;&#34;$iLeft&#34;H|&#34;<br />echo -ne &#34;\33&#91;&#34;$i&#34;;&#34;$iRight&#34;H|&#34;<br />done<br />echo -ne &#34;\33&#91;&#34;$iCursor&#34;;1H&#34;<br />echo -ne &#34;\33&#91;0m&#34;<br /><br />echo -ne &#34;\33&#91;1m\33&#91;33m&#34;<br />for &#40;&#40; i = 0; i &#60; ${#iX&#91;@&#93;}; i++ &#41;&#41;<br />do<br />&#40;&#40; pX = 2 * ${iX&#91;$i&#93;} + iLeft + 1 &#41;&#41;<br />&#40;&#40; pY = ${iY&#91;$i&#93;} + iTop + 1 &#41;&#41;<br />&#40;&#40; pM = ${iY&#91;$i&#93;} * iWidth + ${iX&#91;$i&#93;} &#41;&#41;<br />&#40;&#40; iMap&#91;$pM&#93; = 1 &#41;&#41;<br />echo -ne &#34;\33&#91;&#34;$pY&#34;;&#34;$pX&#34;H&#91;&#93;&#34;<br />#echo ${iX&#91;$i&#93;}<br />done<br />echo -ne &#34;\33&#91;&#34;$iCursor&#34;;1H&#34;<br />echo -ne &#34;\33&#91;0m&#34;<br /><br />RandomHeader<br />}<br /><br /><br />function ShiftSnake<br />{<br />&#40;&#40; iLastP = iS - 1 &#41;&#41;<br />if &#40;&#40; iLastP &#60; 0 &#41;&#41;; then &#40;&#40;iLastP = ${#iX&#91;@&#93;} - 1 &#41;&#41;; fi<br /><br />if &#40;&#40; iDir == 1 &#41;&#41; #left<br />then<br />&#40;&#40; iHX = ${iX&#91;$iLastP&#93;} - 1 &#41;&#41;<br />&#40;&#40; iHY = ${iY&#91;$iLastP&#93;} &#41;&#41;<br />elif &#40;&#40; iDir == 2 &#41;&#41; #up<br />then<br />&#40;&#40; iHX = ${iX&#91;$iLastP&#93;} &#41;&#41;<br />&#40;&#40; iHY = ${iY&#91;$iLastP&#93;} - 1 &#41;&#41;<br />elif &#40;&#40; iDir == 3 &#41;&#41; #right<br />then<br />&#40;&#40; iHX = ${iX&#91;$iLastP&#93;} + 1 &#41;&#41;<br />&#40;&#40; iHY = ${iY&#91;$iLastP&#93;} &#41;&#41;<br />elif &#40;&#40; iDir == 4 &#41;&#41; #down<br />then<br />&#40;&#40; iHX = ${iX&#91;$iLastP&#93;} &#41;&#41;<br />&#40;&#40; iHY = ${iY&#91;$iLastP&#93;} + 1 &#41;&#41;<br />fi<br /><br />bOver=0<br />if &#40;&#40; iHX &#60; 0 || iHY &#60; 0 || iHX &#62;= iWidth || iHY &#62;= iHeight &#41;&#41;; then bOver=1;fi<br />if &#40;&#40; bOver == 0 &#41;&#41;; then<br />if &#40;&#40; ${iMap&#91;iHY * iWidth + iHX&#93;} == 1 &#41;&#41;; then bOver=1; fi<br />fi<br /><br />if &#40;&#40; bOver == 1 &#41;&#41;<br />then<br />kill $pidCtlSnake<br />&#40;&#40; iBottom = iBottom + 1 &#41;&#41;<br />echo -e &#34;\33&#91;&#34;$iBottom&#34;;0HGame over&#33; &#40;Score&#58; &#34;${#iX&#91;@&#93;}&#34;00&#41;\33&#91;0m&#34;<br />exit 0;<br />fi<br /><br /><br />#check if catch the new box<br />if &#40;&#40; iHX == iNewX &amp;&amp; iHY == iNewY &#41;&#41;<br />then<br />for &#40;&#40; i = ${#iX&#91;@&#93;}; i &#62; iS; i-- &#41;&#41;<br />do<br />&#40;&#40; iX&#91;$i&#93; = ${iX&#91;$i - 1&#93;} &#41;&#41;<br />&#40;&#40; iY&#91;$i&#93; = ${iY&#91;$i - 1&#93;} &#41;&#41;<br />done<br />&#40;&#40; iX&#91;$iS&#93; = iHX &#41;&#41;<br />&#40;&#40; iY&#91;$iS&#93; = iHY &#41;&#41;<br /><br />&#40;&#40; iNextP = iS + 1 &#41;&#41;<br />if &#40;&#40; iNextP &#62;= ${#iX&#91;@&#93;} &#41;&#41;; then iNextP=0; fi<br /><br />echo -ne &#34;\a&#34;<br />RandomHeader<br />else<br />&#40;&#40; iNextP = iS + 1 &#41;&#41;<br />if &#40;&#40; iNextP &#62;= ${#iX&#91;@&#93;} &#41;&#41;; then iNextP=0; fi<br /><br />#clear snake tailer<br />&#40;&#40; pX = 2 * ${iX&#91;$iS&#93;} + iLeft + 1 &#41;&#41;<br />&#40;&#40; pY = ${iY&#91;$iS&#93;} + iTop + 1 &#41;&#41;<br />&#40;&#40; pM = ${iY&#91;$iS&#93;} * iWidth + ${iX&#91;$iS&#93;} &#41;&#41;<br />&#40;&#40; iMap&#91;$pM&#93; = 0 &#41;&#41;<br />echo -ne &#34;\33&#91;&#34;$pY&#34;;&#34;$pX&#34;H &#34;<br />&#40;&#40; iX&#91;$iS&#93; = iHX &#41;&#41;<br />&#40;&#40; iY&#91;$iS&#93; = iHY &#41;&#41;<br /><br />fi<br /><br />#draw snake header<br />echo -ne &#34;\33&#91;1m\33&#91;33m&#34;<br />&#40;&#40; pX = 2 * iHX + iLeft + 1 &#41;&#41;<br />&#40;&#40; pY = iHY + iTop + 1 &#41;&#41;<br />&#40;&#40; pM = iHY * iWidth + iHX &#41;&#41;<br />&#40;&#40; iMap&#91;$pM&#93; = 1 &#41;&#41;<br />echo -ne &#34;\33&#91;&#34;$pY&#34;;&#34;$pX&#34;H&#91;&#93;&#34;<br />echo -ne &#34;\33&#91;&#34;$iCursor&#34;;1H&#34;<br />echo -ne &#34;\33&#91;0m&#34;<br /><br />&#40;&#40; iS = iNextP &#41;&#41;<br />}<br /><br />trap &#34;if &#40;&#40; iDir &#33;= 3 &amp;&amp; iDir &#33;= 0 &#41;&#41;; then iDirection=1; fi&#34; 36<br />trap &#34;if &#40;&#40; iDir &#33;= 4 &#41;&#41;; then iDirection=2; fi&#34; 37<br />trap &#34;if &#40;&#40; iDir &#33;= 1 &#41;&#41;; then iDirection=3; fi&#34; 38<br />trap &#34;if &#40;&#40; iDir &#33;= 2 &#41;&#41;; then iDirection=4; fi&#34; 39<br />trap &#34;exit&#34; 40<br /><br />InitDraw<br /><br />&#40;&#40; iNanoSec = iSpeed * 1000000 &#41;&#41;<br />iTime=&#34;1&#34;`date +&#34;%S%N&#34;`<br />while &#91;&#91; 1 &#93;&#93;<br />do<br />usleep 100000<br />iTimeNew=&#34;1&#34;`date +&#34;%S%N&#34;`<br /><br />#avoid iTimeNew &#60; iTime when new minute comes<br />if &#40;&#40; iTimeNew &#60; iTime &#41;&#41;<br />then<br />&#40;&#40; iTime = iTime - 60000000000 &#41;&#41;<br />fi<br /><br />#detect the time interval<br />if &#40;&#40; iTimeNew - iTime &#60; iNanoSec &#41;&#41;; then continue; fi<br />iTime=$iTimeNew<br /><br />iDir=$iDirection<br /><br />if &#40;&#40; iDir &#33;= 0 &#41;&#41;<br />then<br />ShiftSnake<br />fi<br />done<br /><!--c2--></div><!--ec2-->

2004-7-29 09:30 时家东
前辈:<br />     您好!<br />     我今天在查资料的时候无意中发现了这个论坛,看了你好多文章,真是佩服你,我也是正在学习shell编程,不过是刚刚起步,希望能拜您为师,向您多学习点这方面的知识,不知道您愿意收我吗?呵呵。希望您不要拒绝我。<br />     祝您身体健康,工作顺利!<br /><br /><br /><br />                                                    您未来的学生:<br />                                                     时家东

2004-7-29 15:01 zsdzsd1
好啊!!<br />先收下再仔细研究。

2004-7-29 17:53 无双
黄叶兄现在有了baby比较忙了<br /><br />不过他可能上linuxsir<br /><br />楼上想找他的可以到那里看看 说不定会看到他

2004-11-1 22:28 daliwa

2006-4-16 10:05 george16
PF PF

2006-4-20 22:08 ohpig
晕,强人。。。
我先收下在研究。。。 :L

页: [1]
查看完整版本: Shell写的贪吃蛇游戏


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.