1. 程式人生 > >Linux程序員福利 - 追女友神奇(Linux終端運行炫酷程序)

Linux程序員福利 - 追女友神奇(Linux終端運行炫酷程序)

head turn 提示 continue 文件中 字符串 展示 ref UNC

概述

作為IT人員,給同事的感覺呆板,不會會浪漫,不懂情趣。其實不然,我們可以用我們的技能創造出IT人員獨有的浪漫。girlLove腳本就可以實現IT人員的浪漫。girlLove本質上是一個簡易的問答系統,通過設置不同的問題和答案來實現“浪漫”效果。讀者通過改寫該腳本,可以很輕松的實現一個基於Linux終端的調查系統或考試系統等。

詳細

代碼下載:http://www.demodashi.com/demo/12738.html

一、功能簡介

作為IT人員,給同事的感覺呆板,不會會浪漫,不懂情趣。其實不然,我們可以用我們的技能創造出IT人員獨有的浪漫。girlLove腳本就可以實現IT人員的浪漫。girlLove本質上是一個簡易的問答系統,通過設置不同的問題和答案來實現“浪漫”效果。讀者通過改寫該腳本,可以很輕松的實現一個基於Linux終端的調查系統或考試系統等。

二、實現方法

girlLlove腳本可以展示如下幾個部分:文字特效(poetry),問題(question),問題選項(bakans),答案(answer)和提示(tips)。這些內容都保存在shell數組(girlLove.txt文件)中,並且是一一對應的關系,在主程序girlLove.sh中通過while循環一個一個的展示出來。以上各部分的具體內容都可以在girlLove.txt文件中設定,設定的選項數量和用戶的屏幕相關,如果讀者顯示屏幕過小,則選項數量多了有可能產生位置偏移等影響。

1. 終端上的字是輸出在指定位置的,通過以下代碼記錄終端的X/Y軸信息

# pos_stdy:輸出位置為 2/3 x 終端Y軸長度;pos_stdx:輸出位置為 1/2 x 終端X軸長度
pos_stdy="$(($(stty size|cut -d‘ ‘ -f1) / 3 * 2))"
pos_stdx="$(($(stty size|cut -d‘ ‘ -f2) / 2))"
 
# total_stdx:終端X軸長度,total_stdy:終端Y軸長度
total_stdy="$(($(stty size|cut -d‘ ‘ -f1)))"
total_stdx="$(($(stty size|cut -d‘ ‘ -f2)))"

2. print_xy函數用來根據自己設定的算法控制字符輸出位置

# 該函數用來控制字符串的打印位置
# 參數1:要打印的字符串;參數2:根據參數2來選擇不同的位置計算公式,不同類型的字符串,位置計算公式不同;
# 參數3:用來控制字符在Y軸的打印位置;參數4:用來控制字符在X軸的打印位置;
function print_xy()
{
    if [ $# -eq 0 ]; then
        return 1
    fi
 
    len=`expr ${#1} / 2`
    if [ $# -lt 2 ]; then
        pos="\e[${pos_stdy};$((${pos_stdx} - ${len}))H"
 
    elif [ $2 = "-" ]; then
        pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - ${len}))H"
 
    elif [ $2 = "+" ]; then
        pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - ${len}))H"
 
    elif [ $2 = "lu" ]; then
        pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - $4))H"
 
    elif [ $2 = "ld" ]; then
        pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - $4))H"
    fi
 
    echo -ne "${pos}$1"
}

3. 循環輸出問題

while [ ${seq} -lt ${#poetry[@]} ]
do
    ...
done

4. 更多詳情請參考程序內更詳細的註釋

# 循環18個問題,為求效果,問題數要比$poetry變量行數多1
while [ ${seq} -lt ${#poetry[@]} ]
do
    sleep 0
    isanswer=0
 
    # 打印問題
    print_xy "問: ${question[$seq]}" ld 2 $offset
 
    # 打印問題選項
    print_xy "${bakans[$seq]}" + 3
 
    # 打印回答欄
    print_xy "答: " ld 4 $offset
 
    # 讀取終端輸入到變量ans
    read ans
    ....

5. 完整的程序如下

#!/bin/sh

: << EOF
使用方法:
./girlLove.sh 女朋友名字
EOF

# 設置女朋友的名字,用來在終端展示
name="$1"

# 讀入girlLove.txt文件中所設置的變量
. ./girlLove.txt

# 腳本結束語
declaration="$name 讓我守護你一輩子!"

# pos_stdy:輸出位置為 2/3 x 終端Y軸長度;pos_stdx:輸出位置為 1/2 x 終端X軸長度
pos_stdy="$(($(stty size|cut -d‘ ‘ -f1) / 3 * 2))"
pos_stdx="$(($(stty size|cut -d‘ ‘ -f2) / 2))"

# total_stdx:終端X軸長度,total_stdy:終端Y軸長度
total_stdy="$(($(stty size|cut -d‘ ‘ -f1)))"
total_stdx="$(($(stty size|cut -d‘ ‘ -f2)))"

# 開始答題時,給出的提示信息(屏幕最底部的提示信息)
info="$name 這就是送你的禮物了 選擇1-4並按下回車開始答題吧"

# 進度條前面顯示的提示信息
head="$name 當前的答題進度: "

# 在終端輸出declaration變量中設置的信息,通過while循環和for循環實現動畫效果
function waiting()
{
    i=1

    # 通過while循環實現 ////// 轉圈的動畫效果
    while [ $i -gt 0 ]
    do
        for j in ‘-‘ ‘\\‘ ‘|‘ ‘/‘
        do
            # 打印前面6個/符號 + declaration變量中的內容
            echo -ne "\033[1m\033[$(($(stty size|cut -d‘ ‘ -f1) / 3 * 2));$(($(stty size|cut -d‘ ‘ -f2) / 2 - ${#declaration} - 6))H$j$j$j$j$j$j\033[4m\033[32m${declaration}"

            # 打印後面六個/符號
            echo -ne "\033[24m\033[?25l$j$j$j$j$j$j"
            usleep 100000
        done
        ((i++))
    done
}

# 該函數用來控制字符串的打印位置
# 參數1:要打印的字符串;參數2:根據參數2來選擇不同的位置計算公式,不同類型的字符串,位置計算公式不同;
# 參數3:用來控制字符在Y軸的打印位置;參數4:用來控制字符在X軸的打印位置;
function print_xy()
{
    if [ $# -eq 0 ]; then
        return 1
    fi

    len=`expr ${#1} / 2`
    if [ $# -lt 2 ]; then
        pos="\e[${pos_stdy};$((${pos_stdx} - ${len}))H"

    elif [ $2 = "-" ]; then
        pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - ${len}))H"

    elif [ $2 = "+" ]; then
        pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - ${len}))H"

    elif [ $2 = "lu" ]; then
        pos="\e[$((${pos_stdy} - $3));$((${pos_stdx} - $4))H"

    elif [ $2 = "ld" ]; then
        pos="\e[$((${pos_stdy} + $3));$((${pos_stdx} - $4))H"

    fi

    echo -ne "${pos}$1"
}

# 調用clear清屏
clear

# 在1/2 X軸,2/3 Y軸的位置處打印如下字符串(格式化界面)
print_xy "*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*"

# 在終端底部中間位置處打印$info信息
printf "\r\e[${total_stdy};$(((${total_stdx} - ${#info}*2)/2))H${info}"

offset=14
seq=0

# 循環18個問題,為求效果,問題數要比$poetry變量行數多1
while [ ${seq} -lt ${#poetry[@]} ]
do
    sleep 0
    isanswer=0

    # 打印問題
    print_xy "問: ${question[$seq]}" ld 2 $offset

    # 打印問題選項
    print_xy "${bakans[$seq]}" + 3

    # 打印回答欄
    print_xy "答: " ld 4 $offset

    # 讀取終端輸入到變量ans
    read ans

    # 光標上移3行,並清除從光標到行尾的內容(清除問題行字符)
    echo -e "\033[3A\r\033[K"

    # 清除問題選項行字符
    echo -e "\033[K"

    # 清除回答欄字符
    echo -e "\033[K"

    # 如果輸入的值和預設的答案不同,則繼續循環該問題
    if [ "$ans" != "${answer[$seq]}" ]; then

        # 打印 -----,格式化界面。----- 下面會顯示該問題的tip
        print_xy "---------------------------------------" + 5

        # 顯示該問題的tip
        print_xy "${tips[$seq]}" + 7

        # 等待1s
        sleep 1

        # 將光標移到行首,並清除光標到行尾的字符
        echo -e "\r\033[K"

        # 光標上移3行,並清除光標到行尾的字符
        echo -e "\033[3A\r\033[K"
        continue
    fi

    # 問題序號 + 1
    seq=`expr ${seq} + 1`

    # 獲取poetry的倒數第seq + 1行
    curseq=`expr ${#poetry[@]} - ${seq}`

    ......

# 設置紅色背景
printf "\e[41m"

# 清屏
clear

# 輸出declaration變量的信息
waiting

6. 相關的問題和答案文件設計如下:

poetry=( 
"㊣━━^-^o中華人民共和國o^-^━━㊣  " "┃ 謹祝:                     ┃  " "┃    $name 小盆友 天天開心!   ┃  " "┃                  XXX 頒 ┃" "㊣━━^-^o中華人民共和國o^-^━━㊣" "                         " "嘟嘟oοО○●哇靠!!!快讓開】 " "  ╭══╮老婆!開車羅\`坐好啊 " " ╭╯五檔║老公!開慢點\`我興奮  " " ╰⊙═⊙╯。oо○ 壓死了不賠!" )

question=(  "坐在你旁邊的是你什麽人?"             "你老公老家是哪個鎮的?"             "老公會做下列哪種飯?"             "麗麗最愛看電視劇還是電影?"             "question 5"             "question 6"             "question 7"             "question 8"             "question 9"             "question 10"             "question 11")
bakans=(  "1 男朋友;2 對象;3 老公 4 以上都不是" 	      "1 香花;2 毛堂;3 九重;4 以上都不是"           "1 粥;2 泡面;3 米飯 4 以上都是"           "1 電視劇;2 電影"           "1 option1 2 option2 3 option3 4 option4"           "1 option1 2 option2 3 option3 4 option4"           "1 option1 2 option2 3 option3 4 option4"           "1 option1 2 option2 3 option3 4 option4"  ...

三、安裝方法

1、準備工作

  • 1臺Linux服務器

2、安裝步驟

1. 下載附件:

girlLove.zip

2. 解壓girlLove.zip:

# unzip girlLove.zip

3. 進入girlLove目錄執行./girlLove.sh命令

# cd girlLove
# ./girlLove.sh

答案:3,3,4,1,1,1,1,1,1,1

3、使用方法

1. 修改girlLove.txt裏面的:question(問題), bakans(選項), answer(答案), tips(提示)

2. 執行girlLove.sh命令

./girlLove.sh

3. DIY自己的問題和答案

只需要修改girlLove.txt文件即可,需要修改:question(問題), bakans(選項), answer(答案), tips(提示)。註意修改的時候數目要一致。poetry變量行數需要等於問題個數+1,如果不滿足需要自行DIY poetry變量行數。

四、運行效果

技術分享圖片

五、壓縮包文件截圖

整個程序只有三個文件,如下圖所示:

技術分享圖片

六、其他補充

代碼下載:http://www.demodashi.com/demo/12738.html

註:本文著作權歸作者,由demo大師發表,拒絕轉載,轉載需要作者授權

Linux程序員福利 - 追女友神奇(Linux終端運行炫酷程序)