博客导读网

一个让你随便看看的地方

俄罗斯方块shell(二)

推荐
ZhaoLiang's 笔记

#旋转方块
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="\40\40"
        else
                sBox="[]"
                s=$s"\33[1m\33[7m\33[3${cBoxCur}m\33[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]})))
                #\33[y;xH, 光标到(x, y)处
                s=$s"\33[${i};${t}H${sBox}"
        done
        s=$s"\33[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 "\33[${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 "\33[1m\33[7m\33[3${cBoxNew}m\33[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 "\33[${i};${t}H[]"
        done
        echo -ne "\33[0m"
}


#初始绘制
function InitDraw()
{
        clear
        RandomBox        #随机产生方块,这时右边预显示窗口中有方快了
        RandomBox        #再随机产生方块,右边预显示窗口中的方块被更新,原先的方块将开始下落
        local i t1 t2 t3

        #显示边框
        echo -ne "\33[1m"
        echo -ne "\33[3${cBorder}m\33[4${cBorder}m"
       
        ((t2 = iLeft + 1))
        ((t3 = iLeft + iTrayWidth * 2 + 3))
        for ((i = 0; i < iTrayHeight; i++))
        do
                ((t1 = i + iTop + 2))
                echo -ne "\33[${t1};${t2}H||"
                echo -ne "\33[${t1};${t3}H||"
        done
       
        ((t2 = iTop + iTrayHeight + 2))
        for ((i = 0; i < iTrayWidth + 2; i++))
        do
                ((t1 = i * 2 + iLeft + 1))
                echo -ne "\33[${iTrayTop};${t1}H=="
                echo -ne "\33[${t2};${t1}H=="
        done
        echo -ne "\33[0m"

       
        #显示"Score"和"Level"字样
        echo -ne "\33[1m"
        ((t1 = iLeft + iTrayWidth * 2 + 7))
        ((t2 = iTop + 10))
        echo -ne "\33[3${cScore}m\33[${t2};${t1}HScore"
        ((t2 = iTop + 11))
        echo -ne "\33[3${cScoreValue}m\33[${t2};${t1}H${iScore}"
        ((t2 = iTop + 13))
        echo -ne "\33[3${cScore}m\33[${t2};${t1}HLevel"
        ((t2 = iTop + 14))
        echo -ne "\33[3${cScoreValue}m\33[${t2};${t1}H${iLevel}"
        echo -ne "\33[0m"
}


#退出时显示GameOVer!
function ShowExit()
{
        local y
        ((y = iTrayHeight + iTrayTop + 3))
        echo -e "\33[${y};0HGameOver!\33[0m"
        exit
}

#游戏主程序在这儿开始.
if [[ $1 != "--show" ]]
then
        bash $0 --show&        #以参数--show将本程序再运行一遍
        RunAsKeyReceiver $!        #以上一行产生的进程的进程号作为参数
        exit
else
        #当发现具有参数--show时,运行显示函数
        RunAsDisplayer       
        exit
fi

阅读全文
类别:shell集 查看评论
原文地址:http://hi.baidu.com/upkiller/blog/item/680007cb74f7661abf09e6e6.html

ZhaoLiang's 笔记的其他文章
php+ImageMagick配置 linux network optimize with sysctl
zend框架目录结构 俄罗斯方块shell(一)
百度面试之LINUX运营维护和脚本编程的问题分析与解答 Linux的random总是装死
Squid透明代理手记 bind9配置dns转发缓存服务器
Shell下mutt与msmtp发送mail 整理一下杂七杂八的postfix+extmail的mail服务器架设维护笔记(1)
更多...

© 2010 博客导读网 BlogABC.NET 本站所有内容皆由网友推荐而来,所有博文的版权归原作者所有,如有冒犯,请邮件告知。uncracker#gmail.com