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
}

文件内部:

   *   /\   *
   !__/()\__!
   /==:  :==\
     (/\/\)
4

2 回答 2

2

尽管你有可能赢得 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

考虑到平台的限制,你最终得到的是一个看起来可以忍受的动画:

      * *

        ^ /\ ^
        !__/()\__!
        /==: :==\
          (/\/\)
于 2012-12-02T22:15:26.160 回答
0

在游戏中,通常有两种方法:

  • 矢量图形:通过线、圆、三角形等定义对象。
  • 图像:通过图像定义对象。

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

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

游戏的 PS bash 脚本既有趣又非常不寻常!

于 2012-12-02T22:15:34.603 回答