Bash ASCII实现

4

我已经开始学习vim并且开始在bash中编写一个类似于1978年经典游戏《Space Invaders》的shell脚本游戏。我对ASCII艺术相对陌生,想知道是更好地通过编程定义内容,例如太空飞船,还是从文件中读取字符内容?如果是这样,你会推荐什么,并如何通过编程解决它呢?

#!/bin/bash

function getShip() { 
declare -r FILENAME=/Users/demetriusford/space_ship

for index in $FILENAME; do
  cat $index
done
}

在文件内部:
   *   /\   *
   !__/()\__!
   /==:  :==\
     (/\/\)
2个回答

2
尽管你可能会因为与编程语言和程序之间最糟糕的不匹配而赢得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

在循环中,我们只需清空先前的值并写入新值即可移动精灵。子弹位置也在此部分更新。请注意,我们不需要显式地清空飞船,因为它被空格包围,这样可以使边缘字符变为空白:
    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

你最终得到的是一个看起来还过得去的动画,考虑到平台的限制:
      *        *
^ /\ ^ !__/()\__! /==: :==\ (/\/\)

我对bash还比较新,我想知道是否有人做过类似的事情,并且有更有趣的方式来显示ASCII艺术,而不仅仅是在屏幕上回显。谢谢建议! - theGrayFox

0
在游戏中,通常有两种方法:
  • 矢量图形:通过线条、圆形、三角形等定义对象。
  • 图像:通过图像定义对象。

显然,在这两种情况下,对象定义是从文件中读取的(否则您必须重新编译以更改艺术)。使用矢量图形,您可以获得更好的分辨率,而使用图像,则可以拥有更美丽的艺术效果。请注意,在最终阶段,通常第一种方法也涉及图像(称为“纹理”)。

在ASCII艺术的情况下,也许图像(在文件中“绘制”的ASCII艺术)更好,因为无论如何您都没有太多分辨率,并且通过定义线条和圆形很难得到美丽的ASCII艺术。

P.S. 用于游戏的bash脚本既有趣又非常不寻常!


感谢您的反馈,我真的很想在终端上做点什么来学习bash,并且制作一些有趣的东西,而不仅仅是输入与菜单选项相对应的数值。 - theGrayFox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接