前言:又觉得不好写什么,但又不想中断,于是想起以前学shell时,经常拿前辈的脚本来模仿学习,所以今天给大家分享一个shell写的贪食蛇小游戏脚本,然后再挑其中一些我的理解与大家分享
一,环境
[root@localhost shell]# uname -aLinux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux[root@localhost shell]# cat /etc/resolv.conf# Generated by NetworkManagersearch localdomainnameserver 192.168.142.2
二,源代码
https://www.showdoc.com.cn/1145583068016018?page_id=5827968208216738
三,理解分析
1,第一段,游戏开始界面,这里提出来分享下,是因为这是一个很简单开始倒计时。
#这个是开始时的界面#start show interfacefunction startShowInterface(){ seconds=$1 printf "\e[1;42m" printf "******************************************\n" for ((i=0; i<10; i++)) do printf "* *\n" done printf "*******\e[1;31msnake start after: $seconds seconds\e[0m\e[1;42m*******\n" for ((i=0; i<10; i++)) do printf "* *\n" done printf "******************************************\n" printf "\e[0m"}#start show function startShow(){ seconds=1; while [[ $seconds -gt -1 ]]; do clear; startShowInterface $seconds; sleep 1; let seconds--; done}startShow;
分析,
#首先startShowInterface方法执行时会调用startShow方法,startShow对seconds变量做一个比较,但seconds变量gt(大于)-1,就执行startShowInterface方法,且给startShowInterface方法传一个$seconds参数。
#值得注意的是,seconds变量在startShowInterface方法里被复制为传给shell的第一个参数: $1,也就是倒计时的时间
#运行结果如下图
2,第二段,随机生成食物位置
#首先,这里用了shell的内置函数RANDOM来生成随机数
#前面定义了false=0 true=1,且定义了eat=$true
#所以第一个if语句,$eat 和 $false不想等,执行done
#done被复制为0
#执行while,判断 $done = $false 时候成立,此时0=0成立
#此时定义newFoodPos为新生成食物的位置
#$(( $with-1 ))*$(( $height-1 )) 的结果为(42-1)*(22-1)=861
#然后用RANDOM得来数除以861取余, echo $RANDOM可得随机数,假设这里随机数22365,那么此时newFoodPos的值为22365/861取余数,取余结果是840
#最后用这个结果去数据里比对具体位置,最后一行很有意思
[[ ${area[$newFoodPos]} = 0 ]] && area[$foodPos]=0 && foodPos=$newFoodPos && (( area[$foodPos]=$snakeFood )) && done=$true && eat=$false
#[ ${area[$newFoodPos]} = 0 ]判断具体位置
#area[$foodPos]=0 原本食物被吃掉
#foodPos=$newFoodPos 食物位置赋值为新位置
#随机生成食物位置function generateFood(){ if [[ $eat = $false ]]; then return fi done=$false while [[ $done = $false ]]; do newFoodPos=$(( RANDOM%$(( $(( $with-1 ))*$(( $height-1 )) )) )) [[ ${area[$newFoodPos]} = 0 ]] && area[$foodPos]=0 && foodPos=$newFoodPos && (( area[$foodPos]=$snakeFood )) && done=$true && eat=$false done}
四,所有的模块
function startShowInterface() #开始时的界面function startShow() #开始界面,倒计时界面function gameMainInterface() #游戏显示界面function initSnake() #初始蛇身及位置function drawSnake() #绘制贪食蛇function generateFood() #随机生成食物位置function snakeMove() #贪吃蛇移动的算法,用的一维数组,我也就这样来实现了function mainInterface #游戏运行的进程,游戏主逻辑都在这里了function moveDirectionUpdate() #贪食蛇移动function watchInput() #监听上下左右键function gameOver() #游戏结束
五,总结
总的只有两百多行代码,不过小编还是觉得挺复杂,到现在小编也还有些模块没完全理解,不过有时候回头看看前辈写的代码,去思考其中逻辑,总是有收获。好了,本期就到这了。
最后的最后(Last but not least),欢迎交流:
关注公众号留言,或者在下方直接留言: