尽管你有可能赢得 2013 年“编程语言和程序之间最严重的不匹配”奖,但与竞争者如用 x86 编写的会计软件包、基于 COBOL 的操作系统或任何用 Pascal 编写的东西竞争 :-) ,您可能会发现直接在 bash 脚本中编写该形状更容易。
似乎没有迫切需要将形状与代码本身分开。
首先,这里有一个小脚本,它使用tput
(curses 和 terminfo 数据库)沿窗口底部为您的船设置动画。
这不完全是World of Warcraft
,但它应该是一个很好的起点。首先,我们将设置永远不会改变的东西,船和子弹字符串,以及各种屏幕坐标的东西:
#!/bin/bash
bull1=' * * '
bull2=' '
ship1=' ^ /\ ^ '
ship2=' !__/()\__! '
ship3=' /==: :==\ '
ship4=' (/\/\) '
tput clear
((line1 = $(tput lines) - 6))
((line2 = line1 + 1))
((line3 = line2 + 1))
((line4 = line3 + 1))
((maxcol = $(tput cols) - 15))
然后我们将初始化相关变量并进入一个无限循环:
((bullline = 1))
((bullcol = 1))
((curcol = 1))
((coldir = 1))
while true ; do
在循环内部,我们只需通过清空先前的值并写入新值来移动精灵。项目符号位置也在本节中更新。请注意,我们不需要显式地空白船舶,因为它被空格包围,无论如何都会使边缘字符空白:
tput cup $bullline $bullcol ; echo "$bull2"
if [[ $bullline -le 2 ]] ; then
((bullline = line1 - 1))
((bullcol = curcol))
else
((bullline = bullline - 2))
fi
tput cup $bullline $bullcol ; echo "$bull1"
tput cup $line1 $curcol ; echo "$ship1"
tput cup $line2 $curcol ; echo "$ship2"
tput cup $line3 $curcol ; echo "$ship3"
tput cup $line4 $curcol ; echo "$ship4"
然后我们简单地更新船的变量,让它左右移动,最后延迟一点,让动画更流畅:
((curcol = curcol + coldir))
if [[ $curcol -eq $maxcol ]] ; then
((coldir = -coldir))
else
if [[ $curcol -eq 1 ]] ; then
((coldir = -coldir))
fi
fi
sleep 0.1
done
考虑到平台的限制,你最终得到的是一个看起来可以忍受的动画:
* *
^ /\ ^
!__/()\__!
/==: :==\
(/\/\)