精华内容
下载资源
问答
  • shell扫雷脚本

    2017-04-03 23:11:34
    shell写的扫雷游戏脚本,ujhk分别是上下左右,a是确认,在ubuntu12测试通过
  • http://bbs.chinaunix.net/thread-3580033-1-1.html  shell游戏收集贴 #!/bin/bash # Tetris Game #APP declaration APP_NAME="${0##*[\\/]}" APP_VERSION="1.0" ...
    http://bbs.chinaunix.net/thread-3580033-1-1.html  shell游戏收集贴    

    #!/bin/bash # Tetris Game #APP declaration APP_NAME="${0##*[\\/]}" APP_VERSION="1.0" #颜色定义 cRed=1 cGreen=2 cYellow=3 cBlue=4 cFuchsia=5 cCyan=6 cWhite=7 colorTable=($cRed $cGreen $cYellow $cBlue $cFuchsia $cCyan $cWhite) #位置和大小 iLeft=3 iTop=2 ((iTrayLeft = iLeft + 2)) ((iTrayTop = iTop + 1)) ((iTrayWidth = 10)) ((iTrayHeight = 15)) #颜色设置 cBorder=$cGreen cScore=$cFuchsia cScoreValue=$cCyan #控制信号 #改游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面; #当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。 sigRotate=25 sigLeft=26 sigRight=27 sigDown=28 sigAllDown=29 sigExit=30 #七中不同的方块的定义 #通过旋转,每种方块的显示的样式可能有几种 box0=(0 0 0 1 1 0 1 1) box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3) box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0) box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1) box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2) box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2) box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2) #所有其中方块的定义都放到box变量中 box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]}) #各种方块旋转后可能的样式数目 countBox=(1 2 2 2 4 4 4) #各种方块再box数组中的偏移 offsetBox=(0 1 3 5 7 11 15) #每提高一个速度级需要积累的分数 iScoreEachLevel=50 #be greater than 7 #运行时数据 sig=0 #接收到的signal iScore=0 #总分 iLevel=0 #速度级 boxNew=() #新下落的方块的位置定义 cBoxNew=0 #新下落的方块的颜色 iBoxNewType=0 #新下落的方块的种类 iBoxNewRotate=0 #新下落的方块的旋转角度 boxCur=() #当前方块的位置定义 cBoxCur=0 #当前方块的颜色 iBoxCurType=0 #当前方块的种类 iBoxCurRotate=0 #当前方块的旋转角度 boxCurX=-1 #当前方块的x坐标位置 boxCurY=-1 #当前方块的y坐标位置 iMap=() #背景方块图表 #初始化所有背景方块为-1, 表示没有方块 for ((i = 0; i < iTrayHeight * iTrayWidth; i++)); do iMap[$i]=-1; done #接收输入的进程的主函数 function RunAsKeyReceiver() { local pidDisplayer key aKey sig cESC sTTY pidDisplayer=$1 aKey=(0 0 0) cESC=`echo -ne "\033"` cSpace=`echo -ne "\040"` #保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。 #如果在read -s时程序被不幸杀掉,可能会导致终端混乱, #需要在程序退出时恢复终端属性。 sTTY=`stty -g` #捕捉退出信号 trap "MyExit;" INT TERM trap "MyExitNoSub;" $sigExit #隐藏光标 echo -ne "\033[?25l" while : do #读取输入。注-s不回显,-n读到一个字符立即返回 read -s -n 1 key aKey[0]=${aKey[1]} aKey[1]=${aKey[2]} aKey[2]=$key sig=0 #判断输入了何种键 if [[ $key == $cESC && ${aKey[1]} == $cESC ]] then #ESC键 MyExit elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]] then if [[ $key == "A" ]]; then sig=$sigRotate #<向上键> elif [[ $key == "B" ]]; then sig=$sigDown #<向下键> elif [[ $key == "D" ]]; then sig=$sigLeft #<向左键> elif [[ $key == "C" ]]; then sig=$sigRight #<向右键> fi elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate #W, w elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown #S, s elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft #A, a elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight #D, d elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown #空格键 elif [[ $key == "Q" || $key == "q" ]] #Q, q then MyExit fi if [[ $sig != 0 ]] then #向另一进程发送消息 kill -$sig $pidDisplayer fi done } #退出前的恢复 function MyExitNoSub() { local y #恢复终端属性 stty $sTTY ((y = iTop + iTrayHeight + 4)) #显示光标 echo -e "\033[?25h\033[${y};0H" exit } function MyExit() { #通知显示进程需要退出 kill -$sigExit $pidDisplayer MyExitNoSub } #处理显示和游戏流程的主函数 function RunAsDisplayer() { local sigThis InitDraw #挂载各种信号的处理函数 trap "sig=$sigRotate;" $sigRotate trap "sig=$sigLeft;" $sigLeft trap "sig=$sigRight;" $sigRight trap "sig=$sigDown;" $sigDown trap "sig=$sigAllDown;" $sigAllDown trap "ShowExit;" $sigExit while : do #根据当前的速度级iLevel不同,设定相应的循环的次数 for ((i = 0; i < 21 - iLevel; i++)) do sleep 0.02 sigThis=$sig sig=0 #根据sig变量判断是否接受到相应的信号 if ((sigThis == sigRotate)); then BoxRotate; #旋转 elif ((sigThis == sigLeft)); then BoxLeft; #左移一列 elif ((sigThis == sigRight)); then BoxRight; #右移一列 elif ((sigThis == sigDown)); then BoxDown; #下落一行 elif ((sigThis == sigAllDown)); then BoxAllDown; #下落到底 fi done #kill -$sigDown $$ BoxDown #下落一行 done } #BoxMove(y, x), 测试是否可以把移动中的方块移到(x, y)的位置, 返回0则可以, 1不可以 function BoxMove() { local j i x y xTest yTest yTest=$1 xTest=$2 for ((j = 0; j < 8; j += 2)) do ((i = j + 1)) ((y = ${boxCur[$j]} + yTest)) ((x = ${boxCur[$i]} + xTest)) if (( y < 0 || y >= iTrayHeight || x < 0 || x >= iTrayWidth)) then #撞到墙壁了 return 1 fi if ((${iMap[y * iTrayWidth + x]} != -1 )) then #撞到其他已经存在的方块了 return 1 fi done return 0; } #将当前移动中的方块放到背景方块中去, #并计算新的分数和速度级。(即一次方块落到底部) function Box2Map() { local j i x y xp yp line #将当前移动中的方块放到背景方块中去 for ((j = 0; j < 8; j += 2)) do ((i = j + 1)) ((y = ${boxCur[$j]} + boxCurY)) ((x = ${boxCur[$i]} + boxCurX)) ((i = y * iTrayWidth + x)) iMap[$i]=$cBoxCur done #消去可被消去的行 line=0 for ((j = 0; j < iTrayWidth * iTrayHeight; j += iTrayWidth)) do for ((i = j + iTrayWidth - 1; i >= j; i--)) do if ((${iMap[$i]} == -1)); then break; fi done if ((i >= j)); then continue; fi ((line++)) for ((i = j - 1; i >= 0; i--)) do ((x = i + iTrayWidth)) iMap[$x]=${iMap[$i]} done for ((i = 0; i < iTrayWidth; i++)) do iMap[$i]=-1 done done if ((line == 0)); then return; fi #根据消去的行数line计算分数和速度级 ((x = iLeft + iTrayWidth * 2 + 7)) ((y = iTop + 11)) ((iScore += line * 2 - 1)) #显示新的分数 echo -ne "\033[1m\033[3${cScoreValue}m\033[${y};${x}H${iScore} " if ((iScore % iScoreEachLevel < line * 2 - 1)) then if ((iLevel < 20)) then ((iLevel++)) ((y = iTop + 14)) #显示新的速度级 echo -ne "\033[3${cScoreValue}m\033[${y};${x}H${iLevel} " fi fi echo -ne "\033[0m" #重新显示背景方块 for ((y = 0; y < iTrayHeight; y++)) do ((yp = y + iTrayTop + 1)) ((xp = iTrayLeft + 1)) ((i = y * iTrayWidth)) echo -ne "\033[${yp};${xp}H" for ((x = 0; x < iTrayWidth; x++)) do ((j = i + x)) if ((${iMap[$j]} == -1)) then echo -ne " " else echo -ne "\033[1m\033[7m\033[3${iMap[$j]}m\033[4${iMap[$j]}m[]\033[0m" fi done done } #下落一行 function BoxDown() { local y s ((y = boxCurY + 1)) #新的y坐标 if BoxMove $y $boxCurX #测试是否可以下落一行 then s="`DrawCurBox 0`" #将旧的方块抹去 ((boxCurY = y)) s="$s`DrawCurBox 1`" #显示新的下落后方块 echo -ne $s else #走到这儿, 如果不能下落了 Box2Map #将当前移动中的方块贴到背景方块中 RandomBox #产生新的方块 fi } #左移一列 function BoxLeft() { local x s ((x = boxCurX - 1)) if BoxMove $boxCurY $x then s=`DrawCurBox 0` ((boxCurX = x)) s=$s`DrawCurBox 1` echo -ne $s fi } #右移一列 function BoxRight() { local x s ((x = boxCurX + 1)) if BoxMove $boxCurY $x then s=`DrawCurBox 0` ((boxCurX = x)) s=$s`DrawCurBox 1` echo -ne $s fi } #下落到底 function BoxAllDown() { local k j i x y iDown s iDown=$iTrayHeight #计算一共需要下落多少行 for ((j = 0; j < 8; j += 2)) do ((i = j + 1)) ((y = ${boxCur[$j]} + boxCurY)) ((x = ${boxCur[$i]} + boxCurX)) for ((k = y + 1; k < iTrayHeight; k++)) do ((i = k * iTrayWidth + x)) if (( ${iMap[$i]} != -1)); then break; fi done ((k -= y + 1)) if (( $iDown > $k )); then iDown=$k; fi done s=`DrawCurBox 0` #将旧的方块抹去 ((boxCurY += iDown)) s=$s`DrawCurBox 1` #显示新的下落后的方块 echo -ne $s Box2Map #将当前移动中的方块贴到背景方块中 RandomBox #产生新的方块 } #旋转方块 function BoxRotate() { local iCount iTestRotate boxTest j i s iCount=${countBox[$iBoxCurType]} #当前的方块经旋转可以产生的样式的数目 #计算旋转后的新的样式 ((iTestRotate = iBoxCurRotate + 1)) if ((iTestRotate >= iCount)) then ((iTestRotate = 0)) fi #更新到新的样式, 保存老的样式(但不显示) for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++)) do boxTest[$j]=${boxCur[$j]} boxCur[$j]=${box[$i]} done if BoxMove $boxCurY $boxCurX #测试旋转后是否有空间放的下 then #抹去旧的方块 for ((j = 0; j < 8; j++)) do boxCur[$j]=${boxTest[$j]} done s=`DrawCurBox 0` #画上新的方块 for ((j = 0, i = (${offsetBox[$iBoxCurType]} + $iTestRotate) * 8; j < 8; j++, i++)) do boxCur[$j]=${box[$i]} done s=$s`DrawCurBox 1` echo -ne $s iBoxCurRotate=$iTestRotate else #不能旋转,还是继续使用老的样式 for ((j = 0; j < 8; j++)) do boxCur[$j]=${boxTest[$j]} done fi } #DrawCurBox(bDraw), 绘制当前移动中的方块, bDraw为1, 画上, bDraw为0, 抹去方块。 function DrawCurBox() { local i j t bDraw sBox s bDraw=$1 s="" if (( bDraw == 0 )) then sBox="\040\040" else sBox="[]" s=$s"\033[1m\033[7m\033[3${cBoxCur}m\033[4${cBoxCur}m" fi for ((j = 0; j < 8; j += 2)) do ((i = iTrayTop + 1 + ${boxCur[$j]} + boxCurY)) ((t = iTrayLeft + 1 + 2 * (boxCurX + ${boxCur[$j + 1]}))) #\033[y;xH, 光标到(x, y)处 s=$s"\033[${i};${t}H${sBox}" done s=$s"\033[0m" echo -n $s } #更新新的方块 function RandomBox() { local i j t #更新当前移动的方块 iBoxCurType=${iBoxNewType} iBoxCurRotate=${iBoxNewRotate} cBoxCur=${cBoxNew} for ((j = 0; j < ${#boxNew[@]}; j++)) do boxCur[$j]=${boxNew[$j]} done #显示当前移动的方块 if (( ${#boxCur[@]} == 8 )) then #计算当前方块该从顶端哪一行""出来 for ((j = 0, t = 4; j < 8; j += 2)) do if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi done ((boxCurY = -t)) for ((j = 1, i = -4, t = 20; j < 8; j += 2)) do if ((${boxCur[$j]} > i)); then i=${boxCur[$j]}; fi if ((${boxCur[$j]} < t)); then t=${boxCur[$j]}; fi done ((boxCurX = (iTrayWidth - 1 - i - t) / 2)) #显示当前移动的方块 echo -ne `DrawCurBox 1` #如果方块一出来就没处放,Game over! if ! BoxMove $boxCurY $boxCurX then kill -$sigExit ${PPID} ShowExit fi fi #清除右边预显示的方块 for ((j = 0; j < 4; j++)) do ((i = iTop + 1 + j)) ((t = iLeft + 2 * iTrayWidth + 7)) echo -ne "\033[${i};${t}H " done #随机产生新的方块 ((iBoxNewType = RANDOM % ${#offsetBox[@]})) ((iBoxNewRotate = RANDOM % ${countBox[$iBoxNewType]})) for ((j = 0, i = (${offsetBox[$iBoxNewType]} + $iBoxNewRotate) * 8; j < 8; j++, i++)) do boxNew[$j]=${box[$i]}; done ((cBoxNew = ${colorTable[RANDOM % ${#colorTable[@]}]})) #显示右边预显示的方块 echo -ne "\033[1m\033[7m\033[3${cBoxNew}m\033[4${cBoxNew}m" for ((j = 0; j < 8; j += 2)) do ((i = iTop + 1 + ${boxNew[$j]})) ((t = iLeft + 2 * iTrayWidth + 7 + 2 * ${boxNew[$j + 1]})) echo -ne "\033[${i};${t}H[]" done echo -ne "\033[0m" } #初始绘制 function InitDraw() { clear RandomBox #随机产生方块,这时右边预显示窗口中有方快了 RandomBox #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落 local i t1 t2 t3 #显示边框 echo -ne "\033[1m" echo -ne "\033[3${cBorder}m\033[4${cBorder}m" ((t2 = iLeft + 1)) ((t3 = iLeft + iTrayWidth * 2 + 3)) for ((i = 0; i < iTrayHeight; i++)) do ((t1 = i + iTop + 2)) echo -ne "\033[${t1};${t2}H||" echo -ne "\033[${t1};${t3}H||" done ((t2 = iTop + iTrayHeight + 2)) for ((i = 0; i < iTrayWidth + 2; i++)) do ((t1 = i * 2 + iLeft + 1)) echo -ne "\033[${iTrayTop};${t1}H==" echo -ne "\033[${t2};${t1}H==" done echo -ne "\033[0m" #显示"Score""Level"字样 echo -ne "\033[1m" ((t1 = iLeft + iTrayWidth * 2 + 7)) ((t2 = iTop + 10)) echo -ne "\033[3${cScore}m\033[${t2};${t1}HScore" ((t2 = iTop + 11)) echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iScore}" ((t2 = iTop + 13)) echo -ne "\033[3${cScore}m\033[${t2};${t1}HLevel" ((t2 = iTop + 14)) echo -ne "\033[3${cScoreValue}m\033[${t2};${t1}H${iLevel}" echo -ne "\033[0m" } #退出时显示GameOVer! function ShowExit() { local y ((y = iTrayHeight + iTrayTop + 3)) echo -e "\033[${y};0HGameOver!\033[0m" exit } #显示用法. function Usage() { cat << EOF Usage: $APP_NAME Start tetris game. -h, --help display this help and exit --version output version information and exit
    EOF } #游戏主程序在这儿开始.
    if [[ "$1" == "-h" || "$1" == "--help" ]]; then Usage elif [[ "$1" == "--version" ]]; then echo "$APP_NAME $APP_VERSION" elif [[ "$1" == "--show" ]]; then #当发现具有参数--show时,运行显示函数 RunAsDisplayer else bash $0 --show& #以参数--show将本程序再运行一遍 RunAsKeyReceiver $! #以上一行产生的进程的进程号作为参数 fi

    游戏似乎有些问题,注释掉以下代码便可运行。否则报错

    #显示用法.   
        function Usage   
        {   
                cat << EOF   
        Usage: $APP_NAME   
        Start tetris game.   
          
          -h, --help              display this help and exit   
              --version           output version information and exit   
        EOF   
        }   
    [root@250-shiyan sed]# chmod u+x game
    [root@250-shiyan sed]# ./game -h
    ./game: line 622: warning: here-document at line 599 delimited by end-of-file (wanted `EOF')
    ./game: line 623: syntax error: unexpected end of file
    最后发现,这是因为结尾的EOF前后不能有空白,仅此而已。

     

    转载于:https://www.cnblogs.com/createyuan/p/4228766.html

    展开全文
  • 主要为大家详细介绍了shell脚本实现猜数游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了Shell脚本实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • shell脚本

    2019-03-23 16:38:42
    如被大家熟知的python脚本、JavaScript脚本游戏领域经常使用的lua脚本以及今天要说的linux下的shell脚本,它们的共同点就是不需要编译而可以被直接解释并且执行的一种程序。脚本语言也因此被称为动态语言。 在...

    脚本的概念:

    如被大家熟知的python脚本、JavaScript脚本和游戏领域经常使用的lua脚本以及今天要说的linux下的shell脚本,它们的共同点就是不需要编译而可以被直接解释并且执行的一种程序。脚本语言也因此被称为动态语言。

    在linux下,默认的脚本语言是bash shell脚本。shell译为贝壳,在此处为linux外壳的意思。shell脚本可以理解为一些linux指令的集合。脚本在运维方向以及自动化控制中有着不可或缺的地位,许多项目需要通过脚本运行各种重复的命令来处理相关事务。以下是一个简单的shell脚本例子:

    #!/bin/bash
    
    #输出
    echo "hello bash shell!"

    #!/bin/bash 是程序的开始,必须放在shell脚本的第一行,#!用来告诉系统/bin/bash是用来执行本文件的程序。echo 是shell脚本的输出命令如C语言的printf,以上脚本简单的输出了一句hello bash shell语句。

    当在linux下使用vi命令编写并保存好一个脚本后,如hello.sh。可以通过bash hello.sh 运行此脚本。也可以通过chmod命令改变脚本的执行权限。如chmod 775 hello.sh后,可以通过./hello.sh来执行脚本。

    shell单行注释:

    除第一行#!标识解释器外,其余的#开头的语句表示单行注释。从#开始直到该行的结束为注释部分,如上文的#输出。注释不会在运行结果中打印出来,会被解释器忽略,但是通过注释可以极大的增强脚本的可读性。

    多行注释:

    #!/bin/bash
    
    :<<BLOCK
    echo "note"
    echo "lines"
    BLOCK

    使用:<<BLOCK  BLOCK 符号可以对多行命令进行注释。

    shell脚本变量与运算符

    1、变量定义与赋值操作:

    gl@gl:~$ var=hello
    gl@gl:~$ echo $var
    hello

    shell通过$符号来取一个变量中的值,如上,var存放的是hello字符串,通过$符号取出hello,然后经echo命令打印出来。

    1)赋值时,字符串直接不能有空格,否则赋值会失败。

    gl@gl:~$ var=hello world
    No command 'world' found, did you mean:
     Command 'tworld' from package 'tworld' (universe)
    world: command not found

    除非是有双引号"或者单引号'包裹起来。

    gl@gl:~$ var="hello world"
    gl@gl:~$ echo $var
    hello world

    2)单引号'和双引号的"区别
    双引号:

    gl@gl:~$ a="next"
    gl@gl:~$ b="$a again"
    gl@gl:~$ echo $b
    next again

    单引号:

    gl@gl:~$ a="next"
    gl@gl:~$ b='$a again'
    gl@gl:~$ echo $b
    $a again

    可以看到,单引号中的$a保持原样输出。而双引号中的$a会替换成其变量值。

    2、算术运算符

    gl@gl:~$ a=100
    gl@gl:~$ b=200
    gl@gl:~$ var=`expr $a + $b`
    gl@gl:~$ echo $var
    300

    通过expr关键字可以实现a变量和b变量的值相加操作。解释一下 ` (键盘感叹号的左边)符号的作用。
    即在该符号中的命令会被执行。

    常用的算术运算符
    运算符    说明    举例
    +           加法      expr $a + $b 结果为 30。
    -            减法      expr $a - $b 结果为 10。
    *            乘法      expr $a \* $b 结果为 200。
    /            除法      expr $b / $a 结果为 2。
    %          取余      expr $b % $a 结果为 0。
    =           赋值      a=$b将把变量 b 的值赋给 a。
    ==         相等      用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
    !=          不相等  用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

    3、关系运算符

    #!/bin/bash
    
    a=200
    b=200
    
    if [ $a -eq $b ]
    then
        echo true
    else
        echo false
    fi

    以上代码表示如果a的值和b的值相等,输出true,否则输出false。

    常用的关系运算符
    运算符    说明                                                          
    -eq         检测两个数是否相等,相等返回 true。    [ $a -eq $b ] 
    -ne         检测两个数是否相等,相等返回 false。  
    -gt          检测左边的数是否“大于”右边的,如果是,则返回 true。        
    -lt           检测左边的数是否“小于”右边的,如果是,则返回 true。       
    -ge        检测左边的数是否“大于等于”右边的,如果是,则返回 true。 
    -le         检测左边的数是否“小于等于”右边的,如果是,则返回 true。  

    4、布尔运算符 

    常用的布尔运算符如下
    运算符         说明                                                                   
    !    非运算,表达式为 true 则返回 false,否则返回 true。  [ ! false ] 
    -o    或运算,有一个表达式为 true 则返回 true。                [ $a -lt 20 -o $b -gt 100 ] 
    -a    与运算,两个表达式都为 true 才返回 true。                [ $a -lt 20 -a $b -gt 100 ] 

    5、字符串运算符 

    常用的字符串运算符如下
    运算符    说明                                                              
    =      检测两个字符串是否相等,相等返回 true。         [ $a = $b ] 
    !=     检测两个字符串是否相等,不相等返回 true。     [ $a != $b ] 
    -z     检测字符串长度是否为0,为0返回 true。            [ -z $a ] 
    -n     检测字符串长度是否为0,不为0返回 true。        [ -n $a ] 

    6、文件测试运算符 

    常用的文件测试运算符如下
    运算符    说明                                                                                                                      
    -b file    检测文件是否是块设备文件,如果是,则返回 true。                                [ -b $file ]
    -c file    检测文件是否是字符设备文件,如果是,则返回 true。                                        
    -d file    检测文件是否是目录,如果是,则返回 true。                                                   
    -f file    检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。   
    -g file    检测文件是否设置了 SGID 位,如果是,则返回 true。                
    -k file    检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。   
    -p file    检测文件是否是具名管道,如果是,则返回 true。                        
    -u file    检测文件是否设置了 SUID 位,如果是,则返回 true。                 
    -r file    检测文件是否可读,如果是,则返回 true。                                  
    -w file    检测文件是否可写,如果是,则返回 true。                                
    -x file    检测文件是否可执行,如果是,则返回 true。                               
    -s file    检测文件是否为空(文件大小是否大于0),不为空返回 true。    
    -e file    检测文件(包括目录)是否存在,如果是,则返回 true。             

    shell控制结构

    shell脚本的控制结构与C语言的有所不同,但是运用上大同小异。

    if-else

    #!/bin/bash
    
    var1="hello"
    var2="hello"
    
    if [ "$var1" == "$var2" ]
    then
        echo "ture"
    else
        echo "false"
    fi

    需要注意的是[ ]左右必须加空格与变量隔开。fi表示if结构的结束,如C语言中的}括号。

    for循环:

    #!/bin/bash
    
    vars="a b c d"
    for var in $vars
    do
        echo $var
    done

    gl@gl:~/shellSet$ bash if.sh 
    a
    b
    c
    d
     

    while循环:

    #!/bin/bash
    
    #输出0-100的和
    var=1
    sum=0
    while [ $var -le 100 ]
    do
        sum=`expr $var + $sum`
        var=`expr $var + 1`
    done
    echo $sum
    
    ​

    gl@gl:~/shellSet$ bash while.sh 
    5050

    for和while以do开始,done表示结束。

    case分支:

    Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,
    如果匹配成功,执行相匹配的命令。

    case语句格式如下:

    case $var in
    a)
        echo "aaa"
        ;;                   #表示一个case的结束
    b)
       echo "bbb"
        ;;
    *)                     #*表示其他
        echo "ccc"
        ;;
    esac    #表示结束

    case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。
    取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;; 。

    展开全文
  • shell脚本游戏五子棋

    2019-09-18 06:33:34
    #!/bin/bashP1=6;P2=1P3=20;P4=1P5=14;P6=48 function Chess_board (){printf "\n\n\n";printf "%32s " " ";printf "\e[33m----->>FIVE STONE GAME<<-----\e[0m";...Information:&g...

    #!/bin/bash
    P1=6;P2=1
    P3=20;P4=1
    P5=14;P6=48

    function Chess_board ()
    {
    printf "\n\n\n";printf "%32s " " ";printf "\e[33m----->>FIVE STONE GAME<<-----\e[0m";printf "\n"
    printf "<Information:>\n"
    printf "%30s\e[43m ";printf "\e[43m \e[0m\n"
    for i in {15..1}
    do
    for j in {1..15}
    do
    if [ $j = 1 ]
    then
    if [ $i -le 9 ]
    then
    printf "%30s" " ";echo -ne "\e[43m\e[30m"" "$i" "; printf "\e[43m\e[30m+ \e[0m"
    else
    printf "%30s" " ";echo -ne "\e[43m\e[30m"$i" "; printf "\e[43m\e[30m+ \e[0m"
    fi
    elif [ $j = 15 ]
    then
    printf "\e[43m\e[30m+ \e[0m"
    elif [ $j = 8 ] && [ $i = 8 ]
    then
    printf "\e[43m\e[30m.\e[43m \e[0m"
    elif [ $j = 4 ] && [ $i = 4 ]
    then
    printf "\e[43m\e[30m.\e[43m \e[0m"
    elif [ $j = 12 ] && [ $i = 4 ]
    then
    printf "\e[43m\e[30m.\e[43m \e[0m"
    elif [ $j = 4 ] && [ $i = 12 ]
    then
    printf "\e[43m\e[30m.\e[43m \e[0m"
    elif [ $j = 12 ] && [ $i = 12 ]
    then
    printf "\e[43m\e[30m.\e[43m \e[0m"
    else
    printf "\e[43m\e[30m+ \e[0m"
    fi
    done
    printf "\n"
    done
    printf "%30s\e[43m\e[30m A B C D E F G H I J K L M N O ";printf "\e[43m \e[0m\n"
    }
    function Location_cursor()
    {
    h=$1;l=$2
    printf "\e[$h;$l;H"
    }
    function Moving_cursor ()
    {
    stty cbreak -echo
    dd if=/dev/tty bs=1 count=1 2>/dev/null
    stty -cbreak echo
    }
    function Choose ()
    {
    x=0;y=0;
    while true
    do
    case $(Moving_cursor) in
    i|I) printf "\e[1A";((x--));; # Up
    k|K) printf "\e[1B";((x++));; # Down
    j|J) printf "\e[2D";((y--));; # Left
    l|L) printf "\e[2C";((y++));; # Right
    " ") break;; # Play
    b|B) Start_game;; # Quit the game
    esac
    done
    }
    function Test_array ()
    {
    point=$1;arr=$2
    test=$(eval echo \${$arr[@]})
    [[ $test == ${test/$point/} ]]
    }
    function y_n ()
    {
    arr=$1
    eval echo \${$arr[@]}|tr ' ' '\n'|sort -t',' -k1,1n -k2,2n|tr ',' ' '|Score $2 $3
    }
    function x_n (){
    arr=$1
    eval echo \${$arr[@]}|tr ' ' '\n' |awk -F, '{print $2" "$1}' |sort -k1n -k2n |Score $2 $3
    }
    function xy_l_n(){
    arr=$1
    eval echo \${$arr[@]}|tr ' ' '\n' |awk -F, '{print $1+$2" "$1}' |sort -k1n -k2n |Score $2 $3
    }
    function xy_r_n(){
    arr=$1
    eval echo \${$arr[@]}|tr ' ' '\n' |awk -F, '{print $1-$2" "$1}' |sort -k1n -k2n |Score $2 $3
    }
    function Score(){
    num=$2;
    if [ $1 == 1 ]
    then
    awk -vn=$num '{if($1==v1){
    if($2==v2+1){a[$1]++}
    else{a[$1]=1}}
    else{a[$1]=1}
    v1=$1
    v2=$2}
    END{for(i in a)
    if(a[i]>=n){print "1";exit}
    print "0"}
    '
    else
    awk -vn=$num '{if($1==v1){
    if($2==v2+1){a[$1]++}
    else{a[$1]=1}}
    else{a[$1]=1}
    v1=$1
    v2=$2}
    END{for(i in a){
    if(a[i]>=n){print sum="1000000000";exit}
    sum+=a[i]==4?"10000000":10*10^a[i]};
    print sum}
    '
    fi
    }
    function Computer_decision(){
    i=0
    unset max_w
    unset max_b
    ((sum_w_old=$(xy_r_n array_white 0 5)+$(xy_l_n array_white 0 5)+$(x_n array_white 0 5)+$(y_n array_white 0 5)))
    ((sum_b_old=$(xy_r_n array_black 0 5)+$(xy_l_n array_black 0 5)+$(x_n array_black 0 5)+$(y_n array_black 0 5)))br/>while((i<${#All_pos[@]}))
    do
    blackpoint="$black_point ${All_pos[$i]}"
    arrayblack=(${blackpoint:1})
    whilepoint="$white_point ${All_pos[$i]}"
    arraywhite=(${whilepoint:1})
    ((sum_w=$(xy_r_n arraywhite 0 5)+$(xy_l_n arraywhite 0 5)+$(x_n arraywhite 0 5)+$(y_n arraywhite 0 5)))
    ((sum_b=$(xy_r_n arrayblack 0 5)+$(xy_l_n arrayblack 0 5)+$(x_n arrayblack 0 5)+$(y_n arrayblack 0 5)))
    ((increase_score_b=sum_b-sum_b_old))
    ((increase_score_w=sum_w-sum_w_old))
    if ((sum_w>=1000000000))||((sum_b>=1000000000))
    then
    echo ${All_pos[$i]}&&s=1&&break
    else
    if ((max_b>increase_score_b))
    then
    ((max_b=max_b))
    else
    ((max_b=increase_score_b,index_b=i))
    fi

                        if ((max_w>increase_score_w))
                        then
                                ((max_w=max_w))
                        else
                                ((max_w=increase_score_w,index_w=i))
                        fi       
                        s=0;
                fi
                ((i++))
        done
        if [ $s != 1 ]
        then
                if ((max_b >= max_w))
                then
                        echo ${All_pos[$index_b]}
                else
                        echo ${All_pos[$index_w]}
                fi
        fi

    }
    if_continue ()
    {
    Location_cursor 40 1
    read -p "Do you want one more game? Y/N: " answer1
    case $answer1 in
    y|Y) clear;
    echo -e '\n\n\n\n\n\n Do you want to continue player vs player\e[31m(1)\e[0m, or try player vs computer\e[33m(2)\e[0m? '
    read -p " Please choose: " answer2;
    case $answer2 in
    1) Main_program_player_vs_player ;;
    2) Main_program_player_vs_computer ;;
    esac;;
    n|N) echo " Thanks!!! ";exit;;
    esac
    }
    function Winif ()
    {
    who
    =$1;
    [ xy_r_n $1 $2 $3 == 1 ]||[ xy_l_n $1 $2 $3 == 1 ]||[ x_n $1 $2 $3 == 1 ]||[ y_n $1 $2 $3 == 1 ]&& Locationcursor 12 1 && echo "The ${who##_} win!!!" && Location_cursor $Cx $Cy && echo -e "\e[47m\e[30m+ \e[0m" && Location_cursor $Cx $Cy &&if_continue
    }
    function Main_program_player_vs_player ()
    {
    clear # CygWin use echo -e "\e[2J"
    Chess_board
    Location_cursor $P5 $P6
    ((Cx=P5,Cy=P6))
    unset test_point step step_b step_w black_point white_point
    array_white=(); array_black=()
    while true
    do
    Choose
    Location_cursor $P3 $P4
    echo -e " \n \n "
    ((Cx=Cx+x,Cy=2
    y+Cy))
    ((abs_x=P5-Cx,abs_y=((Cy-P6))/2))
    test_point="$abs_x,$abs_y"

                if (($abs_x <= 7)) && (($abs_x >= -7)) && (($abs_y <= 7)) && (($abs_y >= -7))
                then
                        if ! Test_array $test_point array_white || ! Test_array $test_point array_black
                        then
                                Location_cursor $P3 $P4       
                                echo -e "Not allowed\nPlease try again!!!" && test_result=1
                        fi
                else
                        Location_cursor $P3 $P4
                        echo -e "Out of chess broad\nNot allowed\nPlease try again!!!" && test_result=1
                fi
    
                if [ "$test_result" == 1 ]
                then
                        ((Cx=P5-abs_x,Cy=2*abs_y+P6)) && test_result=0
                        Location_cursor $Cx $Cy
                else
                        ((step++))
                        ((who_go=step%2)) 
                        Location_cursor $P1 $P2
                        if [ $who_go = 1 ]
                                then
                                ((step_b++))
                                black_point="$black_point $abs_x,$abs_y"
                                array_black=(${black_point:1})
                                Win_if array_black 1 5
                                Location_cursor $P1 $P2
                                echo -e "\e[31m The Black \e[0m"
                                echo -e "\e[31mStep= $step_b\e[0m" 
                                echo "-->The White's turn<--"
                                echo "Step= $step_w"
                                Location_cursor $Cx $Cy
                                echo -e "\e[40m+ \e[0m"
                                Location_cursor $Cx $Cy
                        else
                                ((step_w++))
                                white_point="$white_point $abs_x,$abs_y" 
                                array_white=(${white_point:1})
                                Win_if array_white 1 5
                                Location_cursor $P1 $P2               
                                echo -e "\e[31m The White \e[0m"
                                echo -e "\e[31mStep= $step_w\e[0m" 
                                echo  "-->The Black's turn<--" 
                                echo  "Step= $step_b"
                                Location_cursor $Cx $Cy
                                echo -e "\e[47m\e[30m+ \e[0m"
                                Location_cursor $Cx $Cy
                        fi
                fi
        done

    }
    #Main_program
    function Main_program_player_vs_computer ()
    {
    clear # CygWin use echo -e "\e[2J"
    All_pos=($(echo {-7..7},{-7..7}))
    Chess_board
    Location_cursor $P5 $P6
    ((Cx=P5,Cy=P6))
    unset test_point step step_b step_w black_point white_point
    array_white=(); array_black=()

        while true
        do
                Choose
                Location_cursor $P3 $P4
                echo -e "                          \n                           \n                            "
    
                ((Cx=Cx+x,Cy=2*y+Cy))
                ((abs_x=P5-Cx,abs_y=((Cy-P6))/2))
                test_point="$abs_x,$abs_y"       
                if (($abs_x <= 7)) && (($abs_x >= -7)) && (($abs_y <= 7)) && (($abs_y >= -7))
                then
                        if ! Test_array $test_point array_white
                        then
                                Location_cursor $P3 $P4       
                                echo -e "Not allowed\nPlease try again!!!" && test_result=1
                        fi
                else
                        Location_cursor $P3 $P4
                        echo -e "Out of chess broad\nNot allowed\nPlease try again!!!" && test_result=1
                fi
    
                if [ "$test_result" == 1 ]
                then
                        ((Cx=P5-abs_x,Cy=2*abs_y+P6)) && test_result=0
                        Location_cursor $Cx $Cy
    
                else
                        Location_cursor $P1 $P2
    
                        ((step_b++))
                        black_point="$black_point $abs_x,$abs_y"
                        array_black=(${black_point:1})
                        Location_cursor $((P3+2)) $P4
                        Win_if array_black 1 5
    
                        Location_cursor $P1 $P2
                        echo -e "\e[31mThe Player \e[0m"
                        echo -e "\e[31mStep= $step_b\e[0m"
                        echo "-->The Computer's turn<--"
                        echo "Step= $step_w"
                        Location_cursor $Cx $Cy
                        echo -e "\e[40m+ \e[0m"
                        Location_cursor $Cx $Cy
                        All_pos=(`echo ${All_pos[@]}|sed "s/ $abs_x,$abs_y / /"`)
    
                # computer:
                        Comp_pos=$(Computer_decision)
                        ((step_w++))
                        white_point="$white_point $Comp_pos"
                        array_white=(${white_point:1})
                        abs_x=${Comp_pos%,*}
                        abs_y=${Comp_pos#*,}
                        ((Cx=P5-abs_x,Cy=2*abs_y+P6))
                        Win_if array_white 1 5
                        All_pos=(`echo ${All_pos[@]}|sed "s/ $Comp_pos / /"`)
                        Location_cursor $P1 $P2
                        echo -e "\e[31mThe Computer \e[0m"
                        echo -e "\e[31mStep= $step_w\e[0m"
                        echo -e "-->The Player's turn<--"
                        echo -e "Step= $step_b"
                        Location_cursor $Cx $Cy
                        echo -e "\e[47m\e[30m+ \e[0m"
                        Location_cursor $Cx $Cy
                fi
        done

    }
    function Start_game()
    {
    clear; # CygWin use echo -e "\e[2J"
    cat <<Mainpage

                                  ----->>FIVE STONE GAME<<-----
                                         <<How to play>>
                        *****************************************************
                        *   Game Types:                                            *
                        *       (1) Main_program_player_vs_player           *
                        *       (2) Main_program_player_vs_computer         *
                        *   Control Keys:                                   *
                        *       (i|I)Up                                            *
                        *       (k|K)Down                                   *
                        *       (j|J)Left                                   *
                        *       (l|L)Right                                  *
                        *       (space)Play                                 *
                        *       (B|b)Back to the mainpage                   *
                        *       (q|Q)Quit the game                          *
                        *****************************************************

    Mainpage
    read -p " Please choose the game you want to play, or quit the game: " answer;
    case $answer in
    1) Main_program_player_vs_player ;;
    2) Main_program_player_vs_computer ;;
    q|Q) exit;;
    esac
    }
    Start_game

    展开全文
  • Shell猜数脚本

    2019-09-24 15:19:15
    这是一个猜数小游戏,对输出做了控制,可以不停地猜数,直到猜对脚本才会停止运行,要想调猜中的几率,只需要修改随机数即可。 #!/bin/bash #==================================================== # # Function:...

    这是一个猜数小游戏,对输出做了控制,可以不停地猜数,直到猜对脚本才会停止运行,要想调猜中的几率,只需要修改随机数即可。

    #!/bin/bash
    #====================================================
    #       DESCRIPTION: Guessing games
    #           CREATED: 2020-10-10 PM
    #            AUTHOR: wyp
    #
    #===================================================
    
    # 定义初始状态
    status=False
    
    # 游戏开始
    while [ "${status}" == "False" ];do
        # 玩家输入
        echo -ne "\033[1;36m请输入一个正整数(1-100):\033[0m"
        read -p "" num
    
        # 判断输入(输入只允许是数字)
        while true;do
            if [ -z "${num}" ];then
                echo -ne "\033[1;31m输入有误,请重新输入: "
                read num
            else
                if [ -n "`echo ${num} | sed 's/[[:digit:]]//g'`" ];then
                    echo -ne "\033[1;31m输入有误,请重新输入: "
                    read num
                else
                    break
                fi
            fi
        done
    
    
        # 生成随机数
        RandomNumber=$[RANDOM%10+1]
    
        # 判断输入与随机数值状态
        if [ "${num}" -eq "${RandomNumber}" ];then
            status=True
            echo -e "\033[1;32m恭喜你猜对了!!!\033[0m"
        elif [ "${num}" -gt "${RandomNumber}" ];then
            echo -e "\033[1;33m很遗憾猜大了!!!\033[0m"
            continue
        else
            echo -e "\033[1;33m很遗憾猜小了!!!\033[0m"
            continue
        fi
    done
    
    展开全文
  • 概述今天主要分享下怎么用shell脚本来实现俄罗斯方块这个小游戏。testris.shtetris是整个游戏的核心,大概500多行,所以这里就不贴脚本了。keytest.shkeytest这个脚本主要是为了获取键盘#!/bin/bash GetKey() { aKey...
  • 主要介绍了shell脚本编写的俄罗斯方块游戏代码,非常强大,需要的朋友可以参考下
  • shell实验脚本例题

    2020-11-11 11:49:22
    shell脚本 学习内容: 1、计算器 2、猜字谜小游戏 1、计算器 #!/bin/bash read -p "输入第一个数字:" num1 read -p "请选择需要的运算:" yun read -p "请输入第二个数字:" num2 if [ "$yun" = "+" ] then echo...
  • 主要介绍了Shell脚本实现的猜数字小游戏,本文的猜数字规则相对一般规则的猜数字可能难度要大不少,需要的朋友可以参考下
  • 亲自测试了一个大牛写的shell脚本,感兴趣可以看看,效果如下: 代码如下: 1 #!/bin/bash 2 3 # Tetris Game 4 # 10.21.2003 xhchen<[email]xhchen@winbond.com.tw[/email]> 5 6 #APP ...
  • shell脚本猜数字游戏

    2019-12-28 08:48:52
    #!/bin/bash while true # 运用死循环执行此脚本 do a=`expr $RANDOM % 10` # 定义猜10个数中的数字 b=3 # 定义输入的次数 for i in $(seq 3) # for循环三次 do ...
  • shell脚本实现猜数字小游戏创建脚本编写脚本运行脚本 创建脚本 # vim /root/caishuzi.sh 编写脚本 #/bin/bash sj_num=$(echo `expr $RANDOM % 100`) count=0 while : do read -p "请输入一个随机数:" num let ...
  • 概述今天主要分享下怎么用shell脚本来实现俄罗斯方块这个小游戏。testris.shtetris是整个游戏的核心,大概500多行,所以这里就不贴脚本了。keytest.shkeytest这个脚本主要是为了获取键盘#!/bin/bash GetKey() { aKey...
  • shell脚本实现猜数字游戏

    千次阅读 2019-05-29 15:13:35
    学习shell的时候将学习的部分内容整合了一下,写了个猜数字的小游戏,以下是代码,如果有问题欢迎大家指正 在这里使用系统变量$RADNUM产生随机数,$RANDOM的范围在[0,32767]这里以取模的形式控制需要生成的随机数的...
  • 原本书上这个例子是教调试脚本的,它故意给出的脚本中有几个错误,教我们认识系统提示的错误,并修改运行。但比较难写出来,所以把修改好了的脚本放上来,这个脚本比较有趣味的
  • 使用bash shell脚本

    2021-04-05 13:30:02
    今天写一个石头剪刀布的小游戏2.添加为if语句3.添加随机数取模、计算 前言 提示:前两天比较忙,忙着学习与或非这些,简直绕来绕去的,现在搞到了if语句,第一次写脚本简直就是一脸蒙皮,无从下手,最后还是需要翻...
  • Shell脚本实现俄罗斯方块小游戏(转自:http://blog.51cto.com/lizhenliang/1687612) #!/bin/bash APP_NAME="${0##*[\\/]}" APP_VERSION="1.0" #颜色定义 iSumColor=7 #颜色总数 cRed=1 #红色 cGreen=2 #绿色 ...
  • 首先要介绍一下,shell带有内置函数RANDOM,可以随机生成随机数,其范围为:0~32767 因此如果你想要生成一个1~100之间的数字,那么只需让结果模100加一即可,即$((RANDOM %100+1)) 完整的猜数字游戏代码如下: ...
  • 这里的guem可以随便写,比如A、B之类...编辑脚本 #!/bin/bash init() { echo " 猜数字游戏!!! " } game() { number=$[$RANDOM%100] while : do read -p "输入你要猜测的数字: " n1 n2=`echo $n1 | sed 's/[0-9]//g'...
  • shell脚本猜数字小游戏要求:给用户三次机会,猜10以内的任意数字分析:10以内的随机数要用到RANDOM,循环给予用户三次机会,用if做判断是否等于RANDOM的值#脚本如下#!/bin/bash ###################### #shell脚本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 454
精华内容 181
关键字:

shell游戏脚本