zoukankan      html  css  js  c++  java
  • Linux程序员福利

    概述

    作为IT人员,给同事的感觉呆板,不会会浪漫,不懂情趣。其实不然,我们可以用我们的技能创造出IT人员独有的浪漫。girlLove脚本就可以实现IT人员的浪漫。girlLove本质上是一个简易的问答系统,通过设置不同的问题和答案来实现“浪漫”效果。读者通过改写该脚本,可以很轻松的实现一个基于Linux终端的调查系统或考试系统等。

    详细

     

     

    一、功能简介

    作为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 "33[1m33[$(($(stty size|cut -d' ' -f1) / 3 * 2));$(($(stty size|cut -d' ' -f2) / 2 - ${#declaration} - 6))H$j$j$j$j$j$j33[4m33[32m${declaration}"
    
                # 打印后面六个/符号
                echo -ne "33[24m33[?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 "
    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 "33[3A
    33[K"
    
        # 清除问题选项行字符
        echo -e "33[K"
    
        # 清除回答栏字符
        echo -e "33[K"
    
        # 如果输入的值和预设的答案不同,则继续循环该问题
        if [ "$ans" != "${answer[$seq]}" ]; then
    
            # 打印 -----,格式化界面。----- 下面会显示该问题的tip
            print_xy "---------------------------------------" + 5
    
            # 显示该问题的tip
            print_xy "${tips[$seq]}" + 7
    
            # 等待1s
            sleep 1
    
            # 将光标移到行首,并清除光标到行尾的字符
            echo -e "
    33[K"
    
            # 光标上移3行,并清除光标到行尾的字符
            echo -e "33[3A
    33[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变量行数。

    四、运行效果

    girllove.gif

     

    五、压缩包文件截图

    整个程序只有三个文件,如下图所示:

    image.png

     

    六、其他补充

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    git 学习
    ruby on rails 把阿里云上的图片资源转移到七牛云上写的一个task 文件 自动转移
    修改mysql的默认编码
    ruby on rails 安装中遇到的一些问题
    unity打包资源格式全解析
    unity打包全过程解析
    mmorpg手游中的战斗系统
    在线调试lua原型设计
    lua特性纪要
    软件开发中的哲学问题
  • 原文地址:https://www.cnblogs.com/demodashi/p/9452894.html
Copyright © 2011-2022 走看看