linux - Bash ASCII 实现

标签 linux bash shell unix

<分区>

我已经开始学习 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

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

      *        * 

        ^   /\   ^ 
        !__/()\__! 
        /==:  :==\ 
          (/\/\) 

关于linux - Bash ASCII 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13674455/

相关文章:

c++ - 我如何使用 intel 编译器和 intel mpi 安装 boost?

linux - 代理设置问题

linux - 如何在 "set -o posix"之后取消 posix 模式?

linux - 如何 gzip bash 中所有子目录中的所有文件

linux - 为什么结束时间与此 shell 脚本中的开始时间相同?

linux 脚本 git pull error : cannot open . git/FETCH_HEAD: Permission Denied

linux - 从 azure 上的 Linux 服务器创建 docker 镜像

mysql - 使用bash脚本重命名mysql中的表

linux - 使用 awk 排除无法正常工作的文件夹

linux - 可以编写脚本在本地机器上打开多个终端并通过 ssh 连接到不同的服务器吗?