题目:魔幻盒子
1 系统设计
1.1 设计要求
1.1.1 设计任务
以VM ware虚拟机软件和Red hat 9.0操作系统为平台,使用shell脚本编写程序,用ASCII码字符设计一个长、宽可变的四边形。要求使用linux shell编写程序脚本(Bash风格),并提供友好的的交互界面。
1.1.2 性能指标要求
- 基本要求
- 四边形的绘图(40点*30点)
- 边的ASCII字符可以在按下某按键的情况下可以修改(如从“-”-> “*”)
- 四边形的四个角要求用不同的ASCII字符
- 四边形的大小可变
- 四边形中间输出自己的姓名与学号
- 在按下某按键的情况下四边形的颜色可变
2、发挥部分
在按下某按键实现四边形的立体化。
1.2 设计思路及设计框图
1.2.1设计思路
一开始选这个题目时,可以说是完全不懂。但是,通过这学期所学的嵌入式Ubuntu应用编程实战这本书以及按照老师给的要求去查资料,开始慢慢的了解实训所需要做的大概是怎么一回事,在linux系统中,利用画图函数draw_char控制ASCII码字符画出一个长宽可变,边框符号可变,颜色可变和输出自己学号姓名的四边形,同时这个四边形实现立体化。
在画图开始时,先把之前所画的四边形清除,所以必须先进行清屏。接着按照要求要使所画的四边形的初始大小为40点*30点,所以给四边形的长和宽定义俩个初始量,分别为40和30,并且四边形的大小可变,就需要给四边形的长和宽俩个变量赋值,每画一个四边形就需要重新给长和宽赋值。然后改变四边形的边的ASCII字符,只需要给四条边定义四个不同的变量。而改变四边形的颜色,只需要调用哪个颜色的函数,然后通过输入选择数字来改变四边形的颜色。为控制不同的变化,则需要设定不同的case语句或if语句来进行相应的变化。要想实现四边形的立体化,需要在之前画好的四边形的基础上在画三条斜线,一条横线和一条竖线共五条线来实现四边形的立体化。
同时设置变量来实现四边形立体化后改变大小。
1.2.2总体设计框图
2 各个模块程序的设计
2.1 初始化定义
clear #清屏
R=5 #定义起始横坐标
C=10 #定义起始纵坐标
H=30 #定义初始四边形的宽
W=40 #定义初始四边形的长
col=0 #定义初始四边形的颜色
HORZ="-" #定义初始四边形边ASCII字符
VERT="|"
D=0
let W=$W+$W #四边形长宽比为1:1.9
draw_box $R $C $H $W $col $HORZ $VERT
2.2draw_box画图函数
draw_box(){
BOX_HEIGHT=`expr $3 - 1`
BOX_WIDTH=`expr $4 - 1`
T_ROWS=`tput lines` #获取终端的宽 行列宽长
T_COLS=`tput cols` #获取终端的长
plot_char(){
echo -e "E[${1};${2}H"$3 #启用转义序列,将光标移动到$1和$2所定位处,输出$3
} #设置颜色的格式: e[背景色;前景色;高亮m
echo -ne "E[3${5}m" #盒子的颜色不换行输出可带参数-e 打开反斜杠ESC转义-E 取消反斜杠ESC转义
count=1 #画第一条竖线
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
done
count=1 #画第二条竖线
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
done
count=1 #画第一条横线
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
done
count=1 #画第二条横线
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
Done
2.3立体化程序
draw_box(){
BOX_HEIGHT=`expr $3 - 1`
BOX_WIDTH=`expr $4 - 1`
T_ROWS=`tput lines`
T_COLS=`tput cols`
plot_char(){
echo -e "E[${1};${2}H"$3
}
echo -ne "E[3${5}m"
count=1 #画第一条竖线
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
done
count=1 #画第二条竖线
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
done
count=1 #画第一条横线
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
done
count=1 #画第二条横线
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
done
while [[ "$D" -gt 0 ]]; do #判断是否实现立体化
count=1 #画第一条斜线
temp=$2
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1 #画第二条斜线
temp=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1 #画第三条斜线
r=`expr $1 + $BOX_HEIGHT`
temp=`expr $2 + $BOX_WIDTH`
for (( r; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1 #画横线
r=`expr $1 - 4`
temp=`expr $2 + 4`
for (( temp; count<=$BOX_WIDTH; temp++)); do
plot_char $r $temp $HORZ
let count=count+1
done
count=1 #画竖线
r=`expr $1 - 4`
temp=`expr $2 + 4 + $BOX_WIDTH`
for (( r; count<=$BOX_HEIGHT; r++)); do
plot_char $r $temp $VERT
let count=count+1
done
plot_char `expr $1 - 4` `expr $2 + 4` E
plot_char `expr $1 - 4` `expr $2 + $BOX_WIDTH + 4` F
plot_char `expr $1 - 4 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH + 4` G
let D=D-1
done
echo -ne "E[0m"
P_ROWS=`expr $T_ROWS - 1`
echo -e "E[${P_ROWS};1H"
}
2.4四边形四个角的ASCII字符和名字学号
plot_char $1 $2 A
plot_char $1 `expr $2 + $BOX_WIDTH` B
plot_char `expr $1 + $BOX_HEIGHT` $2 C
plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` D
plot_char `expr $1 + $3 / 2 - 1` `expr $2 + $4 / 2 - 5` 1852200224
plot_char `expr $1 + $3 / 2 + 1` `expr $2 + $4 / 2 - 5` lanweihai
2.5输出语句部分
while [[ $n -eq 1 ]]; do
echo "please input the number:"
echo "1. please input the HEIGHT and WIDTH:" #改变四边形的长和宽
echo "2. please input the HORZ and VERT:" #改变四边形边的ASCII字符
echo "3. please input the color:" #改变四边形的颜色
echo "d. D=1" #判断是否实现立体
echo e. Exit #退出
echo "please input the number: "
read NUM
case $NUM in
$n1)
echo "please input the HEIGHT and WIDTH:"
read HEIGHT WIDTH
H=$HEIGHT W=$WIDTH
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n2)
echo "please input the HORZ and VERT:"
read HORZ VERT
HORZ=$HORZ VERT=$VERT
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n3)
echo "please input the color:"
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
echo -ne "E[3${5}m"
read COLOR_NUM
col=$COLOR_NUM
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$d)
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
read COLOR_NUM
col=$COLOR_NUM
D=1 ;;
$e) exit;;
esac
clear
draw_box $R $C $H $W $col $HORZ $VERT
3 调试过程
我在实训的过程中碰到许多问题,因为是刚学的嵌入式编程,对很多函数都不是很了解,出现了比较多的问题。比如经常会显示/bash错误。经过多次修改,知道了这个一般是我们在计算函数中,加了多余的空格或者其他的字符,或者是‘’符号中不小心添加了其他的字符,让计算函数出错。借鉴了以前学长的程序,在此基础的完成了基本功能和扩展功能。
4 功能测试
4.1 测试仪器与设备
PC机一台, VMwareWorkstion软件以及READHAT9.0操作系统。
4.2 性能指标测试
(1)实现了四边形40*30的绘图。
(2)边的ASCII字符可以随意改变。
(3)四边形的四个角分别用了不同的ASCII字符来表示
(4)四边形的长和宽可以任意改变大小
(5)四边形的中间输出了自己的学号和姓名。
(6)实现了四边形的立体化
(7)立体可以改变颜色
5 实训心得体会
本次做的嵌入式程序设计实训---魔幻盒子,是利用shell脚本基础功能实现的。经过了两周的嵌入式实训,让我对嵌入式Ubuntu应用编程实战这门课有了更深的认识,同时也是我学会了许多关于嵌入式shell语句的知识。这是第一次学习有关于嵌入式的课程,有很多不懂的地方,但通过各种渠道还是有了解到许多关于这方面的知识,做出来后也有一定的成就感。,
在做实训的过程中,我意识到了知识储备的重要性,只有对嵌入式知识有一定程度的了解,才能够探索更深层次的东西,并能够解决问题。经过嵌入式实训后,发现还有很多欠缺的知识,希望通过努力,让自己的知识储备能更厚实。
这次的嵌入式实训对我来说是一个全新的挑战,它是通过这学期所学的Liunx系统来设计和操作的,在写函数的时候,我遇到了很多问题,同时也了解了shell语句的严谨,稍微有点错误就会报错。以前一直觉得linux系统没什么作用,程序又难以理解,最重要的是不够人性化,不能使用鼠标进行操作。复制,移动等基本操作都要使用指令来完成,对我来说感到极其不适应。经过这次的实训,我对linux操作系统有了重新的认识,程序能直接在终端运行,无需通过第三方软件来实现,想要对系统进行修改也更方便容易。
这次的实训让自己再一次的感受到了自己在程序设计上的知识储备不足,在今后的学习中,我要更加注重理论知识的学习,希望能懂得更多的知识,并且要理解透彻,能够把知识为我所用。我会努力加油的!感谢老师和同学给予我的帮助!
附录
附录1:仿真波形图
初始四边形(40*30)
改变四边形的大小(20*30)
改变四边形的边的ASCII字符
改变四边形的颜色
四边形立体化并改变颜色
附录2:程序清单
#!/bin/bash
draw_box(){
BOX_HEIGHT=`expr $3 - 1`
BOX_WIDTH=`expr $4 - 1`
T_ROWS=`tput lines`
T_COLS=`tput cols`
plot_char(){
echo -e "E[${1};${2}H"$3
}
echo -ne "E[3${5}m"
count=1
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $2 $VERT
let count=count+1
Done
count=1
c=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=$BOX_HEIGHT; r++)); do
plot_char $r $c $VERT
let count=count+1
Done
count=1
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $1 $c $HORZ
let count=count+1
Done
count=1
r=`expr $1 + $BOX_HEIGHT`
for (( c=$2; count<=$BOX_WIDTH; c++)); do
plot_char $r $c $HORZ
let count=count+1
done
while [[ "$D" -gt 0 ]]; do
count=1
temp=$2
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1
temp=`expr $2 + $BOX_WIDTH`
for (( r=$1; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1
r=`expr $1 + $BOX_HEIGHT`
temp=`expr $2 + $BOX_WIDTH`
for (( r; count<=4; r--)); do
plot_char $r $temp $VERT
let count=count+1
let temp=temp+1
done
count=1
r=`expr $1 - 4`
temp=`expr $2 + 4`
for (( temp; count<=$BOX_WIDTH; temp++)); do
plot_char $r $temp $HORZ
let count=count+1
done
count=1
r=`expr $1 - 4`
temp=`expr $2 + 4 + $BOX_WIDTH`
for (( r; count<=$BOX_HEIGHT; r++)); do
plot_char $r $temp $VERT
let count=count+1
done
plot_char `expr $1 - 4` `expr $2 + 4` E
plot_char `expr $1 - 4` `expr $2 + $BOX_WIDTH + 4` F
plot_char `expr $1 - 4 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH + 4` G
let D=D-1
done
plot_char $1 $2 A
plot_char $1 `expr $2 + $BOX_WIDTH` B
plot_char `expr $1 + $BOX_HEIGHT` $2 C
plot_char `expr $1 + $BOX_HEIGHT` `expr $2 + $BOX_WIDTH` D
plot_char `expr $1 + $3 / 2 - 1` `expr $2 + $4 / 2 - 5` 1852200224
plot_char `expr $1 + $3 / 2 + 1` `expr $2 + $4 / 2 - 5` lanweihai
echo -ne "E[0m"
P_ROWS=`expr $T_ROWS - 1`
echo -e "E[${P_ROWS};1H"
}
clear
R=5
C=10
H=30
W=40
col=0
HORZ="-"
VERT="|"
D=0
let W=$W+$W
draw_box $R $C $H $W $col $HORZ $VERT
n1=1
n2=2
n3=3 d='d'
e='e'
n=1;
while [[ $n -eq 1 ]]; do
echo "please input the number:"
echo "1. please input the HEIGHT and WIDTH:"
echo "2. please input the HORZ and VERT:"
echo "3. please input the color:"
echo "d. D=1"
echo e. exit
echo "please input the number: "
read NUM
case $NUM in
$n1)
echo "please input the HEIGHT and WIDTH:"
read HEIGHT WIDTH
H=$HEIGHT W=$WIDTH
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n2)
echo "please input the HORZ and VERT:"
read HORZ VERT
HORZ=$HORZ VERT=$VERT
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$n3)
echo "please input the color:"
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
echo -ne "E[3${5}m"
read COLOR_NUM
col=$COLOR_NUM
clear
draw_box $R $C $H $W $col $HORZ $VERT ;;
$d)
echo "1.red 2.green 3.yellow 4.blue 5.yred 6.bluness 7.white "
read COLOR_NUM
col=$COLOR_NUM
D=1 ;;
$e) exit;;
esac
clear
draw_box $R $C $H $W $col $HORZ $VERT
done;
exit 0
需要完整的资料可在资源里下载。
需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。
纷传点击用微信打开即可,过程有点繁琐请见谅。