Linux程序员福利 - 追女友神奇(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轴信息

1
2
3
4
5
6
7
# 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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 该函数用来控制字符串的打印位置
# 参数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. 循环输出问题

1
2
3
4
while [ ${seq} -lt ${#poetry[@]} ]
do
    ...
done

4. 更多详情请参考程序内更详细的注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 循环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. 完整的程序如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/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. 相关的问题和答案文件设计如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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:

1
# unzip girlLove.zip

3. 进入girlLove目录执行./girlLove.sh命令

1
2
# 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命令

 

1
./girlLove.sh

3. DIY自己的问题和答案

只需要修改girlLove.txt文件即可,需要修改:question(问题), bakans(选项), answer(答案), tips(提示)。注意修改的时候数目要一致。poetry变量行数需要等于问题个数+1,如果不满足需要自行DIY poetry变量行数。

四、运行效果

girllove.gif

 

五、压缩包文件截图

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

image.png

 

六、其他补充

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

 

posted on   demo例子集  阅读(1649)  评论(0编辑  收藏  举报

(评论功能已被禁用)
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示