shell 取中间行的第一列_Linux 下shell编写贪食蛇游戏

前言:又觉得不好写什么,但又不想中断,于是想起以前学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,也就是倒计时的时间

#运行结果如下图

cf2373ae2699d943ab2b7cba13fb3b92.png

15ee6cd50d3d13a95aa93360339f0986.png

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),欢迎交流:

关注公众号留言,或者在下方直接留言:

bdbb12cc9d50b789a626a918211d6200.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值