尽管你可能会因为与编程语言和程序之间最糟糕的不匹配而赢得2013年度奖项,例如在x86编写的会计软件,或基于COBOL的操作系统,或任何用Pascal编写的东西 :-),但你可能会发现直接在bash脚本中编码该形状更容易。
似乎没有迫切的需要将形状与代码本身分离。
首先,这里有一个小脚本,使用tput(curses和terminfo数据库)来沿着窗口底部动画显示你的飞船。
虽然它不是《魔兽世界》,但应该是一个很好的起点。首先,我们将设置永远不会改变的内容,如飞船和子弹字符串以及各种屏幕坐标内容:
#!/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
在循环中,我们只需清空先前的值并写入新值即可移动精灵。子弹位置也在此部分更新。请注意,我们不需要显式地清空飞船,因为它被空格包围,这样可以使边缘字符变为空白:
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
你最终得到的是一个看起来还过得去的动画,考虑到平台的限制:
* *
^ /\ ^
!__/()\__!
/==: :==\
(/\/\)