我已经开始学习 vim,并开始使用 bash 编写类似于 1978 年经典游戏《太空入侵者》的游戏的 shell 脚本。我对 ASCII 艺术比较陌生,我想知道以编程方式定义内容(例如宇宙飞船)或从文件中读取字符内容是否更好?如果是这样,您会推荐什么?您将如何以编程方式解决它?
#!/bin/bash
function getShip() {
declare -r FILENAME=/Users/demetriusford/space_ship
for index in $FILENAME; do
cat $index
done
}
文件内部:
* /\ *
!__/()\__!
/==: :==\
(/\/\)
尽管您有可能赢得 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 ; do
在循环中,我们通过清空先前的值并写入新值来简单地移动 Sprite 。本节中的项目符号位置也进行了更新。请注意,我们不需要显式地空白飞船,因为它被空格包围,无论如何都会空白边缘字符:
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
考虑到平台的限制,您最终得到的是一个看起来可以忍受的动画:
* *
^ /\ ^
!__/()\__!
/==: :==\
(/\/\)