贪吃蛇 |
您所在的位置:网站首页 › 贪吃蛇脚本代码Labplus › 贪吃蛇 |
1 简介
这几天在看Shell脚本编程,正所谓“寓教于乐”,为了激发自己的学习效率呢,就考虑通过游戏方式来边学边玩!所以这条贪吃蛇就诞生啦! 选择做贪吃蛇最重要的原因就2个字:“简单”!苗条的身体,固定的转向!想想就觉得超好做!超有成就感! 果然,大约花了1天的时间吧,利用5毛钱界面,编出了这简单版本!这里来分享一下! 有效代码250行左右~ 代码已经上传到Github上了我是代码!快点我!一言不合先上图: 2 问题分析好了,光说不干假本事!下面就来一起分析问题与解决方法! 2.1 键盘读取与多进程代码中使用“上、下、左、右”(‘上’编码:27 91 65)键进行蛇行走方向的控制, 为了实时读取键盘输入,并且控制不回显,那就要死循环检测键盘状态啦! function readinput() { local input; while(true);do { read -st 1 -n 1 input; if [[ $input == $'\033' ]];then read -st 1 -n 1 input; if [[ $input == '[' ]];then read -st 1 -n 1 input; case $input in "A") `kill -35 $PIDSnack`;; "B") `kill -36 $PIDSnack`;; "D") `kill -38 $PIDSnack`;; "C") `kill -37 $PIDSnack`;; esac; fi; fi; };done; }为了同时正常刷新地图又避免耽误读键盘,我们就需要引入多进程,将蛇的控制与显示放到单独的进程中!互不影响,但又互相通信! 2.2 进程间通信与信号传递键盘进程读取到了数据,需要立刻传递给控制进程,那在Shell中如何进行进程间通信呢?我们就使用了“信号”机制! 2.1节中 kill -35 $PIDSnack 就是向控制进程发送35信号!控制进程需要捕捉与处理! function initSnackTrap() { trap "readisign A" 35 trap "readisign B" 36 trap "readisign D" 37 trap "readisign C" 38 trap "exit 2" 2 }使用trap捕捉信号,并根据信号调用相应处理函数!到这,这就完成了一次完美的进程间通讯!怎么样?是不是很简单? 现在控制进程已经得到下一步要走的方向了,一旦时间到达时,就可以移动蛇身啦! 2.3 蛇身控制蛇头要根据读入数据进行上下左右转向(不能反向转向),蛇尾巴和蛇身要根据前一元素进行替换! function movetoNext() { snackEat print "clear" ${xsnackBody[((${l_snack}-1))]} ${ysnackBody[((${l_snack}-1))]} for((i=$l_snack;i>0;i--)) { ysnackBody[$i]=${ysnackBody[((${i}-1))]}; xsnackBody[$i]=${xsnackBody[((${i}-1))]}; } case ${way[0]} in "上") let ysnackBody[0]-- ;; "下") let ysnackBody[0]++ ;; "左") let xsnackBody[0]-- ;; "右") let xsnackBody[0]++ ;; esac; gameOverTest; printSnack; }除了蛇身体的变化之外,每次变化还需要食物检测和碰撞检测就是: snackEat gameOverTest这2个函数!满满的“爱与恨”!就是他们让小蛇长大,也让小蛇结束! 2.4 地图显示游戏么!交互性一定要好!虽然没时间,我们也可以做一些5毛钱特效! 地图交互要分类型!下面就利用case语句实现了7种不同的显示! function print() { case "$1" in "map") echo -e "\e[${3};${2}H\e[44m \e[0m";; "wall") echo -e "\e[${3};${2}H\e[42;30m#\e[0m";; "head") echo -e "\e[${3};${2}H\e[42;30m*\e[0m";; "body") echo -e "\e[${3};${2}H\e[42m+\e[0m";; "tail") echo -e "\e[${3};${2}H\e[42;30m-\e[0m";; "food") echo -e "\e[${3};${2}H\e[30m@\e[0m";; "clear") echo -e "\e[${3};${2}H \e[0m";; esac; } 2.5 终端交互除了上面的显示,还需要一些其他终端交互: 自适应窗口大小 tput lines tput cols 光标隐藏与恢复 tput civis tput cnorm 清屏 echo -ne "\e[2J" 欢迎界面 "she" 3 实现代码200多行,我这里就不粘贴了,感兴趣的同学可以去下载!免费的吆! 4 总结虽然代码不多,但是真的能学到很多知识! 花1天时间弄出来,是对以前那么多天Shell命令学习的肯定!很赚呀!^_^ |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |