Linux程序员福利 - 追女友神奇(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 "\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变量行数。
四、运行效果
五、压缩包文件截图
整个程序只有三个文件,如下图所示:
六、其他补充
无
注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权
Linux程序员福利 - 追女友神奇(Linux终端运行炫酷程序)的更多相关文章
- J2EE程序员应该要掌握的linux知识
J2EE程序员应该要掌握的linux知识 大型J2EE应用都在建构在linux环境下的.开发环境下我们可以通过samba映射成本地的网络驱动器,直接在windows环境下进行编程调试.但是最后的发布还 ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(二)
上一篇我已经给大家介绍AntORM的框架[ASP.NET程序员福利]打造一款人见人爱的ORM(一),今天就来着重介绍一下如何使用这套框架 1>AntORM 所有成员 如果你只想操作一种数据库,可 ...
- 做10年Windows程序员与做10年Linux程序员的区别
如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...
- 做10年Windows程序员与做10年Linux程序员的区别(附无数评论)(开源软件相当于熟读唐诗三百首,不会作诗也会吟)
如果一个程序员从来没有在linux,unix下开发过程序,一直在windows下面开发程序, 同样是工作10年, 大部分情况下与在linux,unix下面开发10年的程序员水平会差别很大.我写这篇文章 ...
- Java程序员必须掌握的常用Linux命令。
Java程序员也是半个运维了,在日常开发中经常会接触到Linux环境操作.小公司的开发人员甚至是兼了全运维的工作,下面整理了一些常用的Linux操作命令. Linux常用指令 ls 显示文件或目录 - ...
- Python程序员为什么一定要掌握Linux?
不少Python新手经常问到学Python到底需不需要学习Linux? Python不是支持Windows和Linux操作系统吗?能在Windows下开发为什么还要学习Linux? 问这样的问题的朋友 ...
- 【ASP.NET程序员福利】打造一款人见人爱的ORM(一)
“很多人都不太认可以第三方ORM,因为考虑的点不够全面,没有大用户群体的ORM有保证,这点是不可否认确是事实.但是往往用户群体大的ORM又有不足之处,今天我们就来聊聊关于ORM的话题,打造 ...
- PHP程序员福利“看免费直播,学MySQL索引优化”
六星教育了解到,MySQL是目前所知PHP最流行的关系型数据库管理系统之一,它将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性.之所以它会成为主流使用数据库,这 ...
- 不懂前端的程序员不是好美工——UI框架metronic使用教程——程序员视角
本着不懂前端的程序员不是好美工的观点,所以作为一个仅懂一点前端的程序员,为了成为一个好美工,所以只能用些取巧的方法伪装一下. metronic一个基于bootstrap的响应式的后台管理平台的UI框架 ...
随机推荐
- 挑战python 之一马当先(python的广搜)
下过象棋的人都知道,马只能走'日'字形(包括旋转90°的日),现在想象一下,给你一个n行m列网格棋盘, 棋盘的左下角有一匹马,请你计算至少需要几步可以将它移动到棋盘的右上角,若无法走到,则输出-1. ...
- CSS 笔记——背景布局
4. 背景布局 -> 背景 (1)background 基本语法 background : background-color || background-image || background- ...
- 【Splay】bzoj3224 Tyvj 1728 普通平衡树
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> us ...
- 2.1(java编程思想笔记)位移操作
java位移操作主要有两种: 有符号位移:有符号位移会保留原有数字正负性,即正数依然是正数,负数依然是负数. 有符号位左移时,低位补0. 有符号右移时:当数字为正数,高位补0.当数字为负时高位补1. ...
- [转] hibernate Mysql 自增长 注解配置,表无关联的注解方式关联查询
不同数据库 自增长ID配置 正对不同的数据库可以同时使用 @Id @GeneratedValue(strategy = GenerationType.AUTO) 2 针 ...
- Codeforces Round #345 (Div. 1) E. Clockwork Bomb 并查集
E. Clockwork Bomb 题目连接: http://www.codeforces.com/contest/650/problem/E Description My name is James ...
- RSA加密破解
1Linux 下安装gmpy2 https://www.cnblogs.com/ESHLkangi/p/8576113.html 2.yafu安装使用方法 https://www.cnblogs.co ...
- Integer引用类型问题
public class TestMain { public static void main(String[] args) { Integer integer = 2; go(2); System. ...
- Phpstorm-sftp配置
保存就可以了 随便点一个文件,右键就可以了,保存,上传快捷键
- JS操作小数运算,结果莫名其妙出现多位小数问题
Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型 ...