关于linux:Bash技巧打印彩色俄罗斯方块各个形状的Shell脚本

51次阅读

共计 3293 个字符,预计需要花费 9 分钟才能阅读完成。

在 Linux bash 中,能够应用上面介绍的 shell 脚本来显示各个黑白的俄罗斯方块形态。

硬编码显示黑白的俄罗斯方块

上面的代码应用 ANSI 本义码来设置终端字符的显示色彩,从而显示出黑白的方块内容。

在脚本代码的正文中阐明了各个 ANSI 本义码的含意,不便了解。

对于 ANSI 本义码的具体阐明,能够参考后面的文章。

假如有一个 colorblocks.sh 脚本,内容如下:

#!/bin/bash
# 显示俄罗斯方块几种根本形态的黑白方块

# 田字形方块
# "\e[43m" 设置字符的背景色为黄色
# "\e[0m" 重置字符属性为默认值, 复原原来的色彩.
echo -e "\e[43m[][]\n[][]\e[0m"
# echo 命令不带参数时, 默认输入一个换行符.
echo

# 土字形方块
# "\e46m" 设置字符的背景色为青色
echo -e "\e[46m[]\n[][][]\e[0m"
echo

# Z 字形方块
# "\e[42m" 设置字符的背景色为绿色
echo -e "\e[42m[][]\n\e[0m  \e[42m[][]\e[0m"
echo

# L 字形方块
# "\e[44m" 设置字符的背景色为蓝色
echo -e "\e[44m[]\n[][][]\e[0m"
echo

# 一字形方块
# "\e[41m" 设置字符的背景色为红色
echo -e "\e[41m[][][][]\e[0m"
echo

执行 colorblocks.sh 脚本的后果如下:

数字化示意俄罗斯方块的根本形态

下面的 colorblocks.sh 脚本间接硬编码显示俄罗斯方块的几种根本形态,无奈指定方块的显示地位。

如果要显示其余形态的方块,也只能硬编码显示,代码无奈复用。

实际上,所有横放的俄罗斯方块根本形态都能够由上面的形态短少局部小方块所失去:

[][][][]
[][][][]

所有竖放的俄罗斯方块根本形态都能够由上面的形态短少局部小方块所失去:

[][]
[][]
[][]
[][]

即,用 8 个小方块都能够示意所有的俄罗斯方块根本形态。

咱们能够用不同的值来示意这 8 个小方块的状态,从而数字化示意对应的根本形态。

例如,用 1 示意要显示某个小方块。用 0 示意不显示某个小方块。

那么,横放的土字形方块能够示意为 0 1 0 0 1 1 1 0。

即,第一行只显示第两个小方块,其余小方块不显示。

第二行显示后面三个小方块,第四个小方块不显示。

其余形态的方块能够相似示意。

因为横放的形态有两行,竖放的形态有四行,还须要另外的状态值来示意换行状态。

能够改成用上面的状态值来进行示意:

  • 1:示意显示小方块,且不换行
  • 2:示意不显示小方块,且不换行
  • 3:示意显示小方块,且换行
  • 4 示意不显示小方块,且换行

基于这个定义,把横放的土字形方块示意为 21241112。

把竖放的土字形方块示意为 14131422。

通过管制换行的地位来决定是横放、还是竖放。

应用数字化示意俄罗斯方块的根本形态后,能够把这些形态放到一个数组外面。

通过遍历数组,判断每个小方块的状态值,就能够显示出对应形态的方块。

后续要显示其余形态的方块时,只须要把数字化的形态示意增加到数组即可

上面的脚本能够基于数字化示意的俄罗斯方块数组来显示对应的方块。

脚本代码的关键点都增加了具体的正文,便于浏览了解。

假如有一个 colorblocks_ext.sh 脚本,内容如下:

#!/bin/bash

# 这个数组用于指定不同方块的背景色
# 1 对应红色. 2 对应绿色. 3 对应黄色
# 4 对应蓝色. 6 对应青色.
COLORS=(1 2 3 4 6)

# 定义上面常量以便阐明这些取值的含意
# 显示黑白方块 "[]", 且不换行
SQUARE=1
# 显示空白方块 " ", 且不换行
EMPTY=2
# 显示黑白方块 "[]", 且换行
SQUARE_LF=3
# 显示空白方块 " ", 且换行
EMPTY_LF=4

# 横放的俄罗斯方块根本形态有上面几种
# [][]       []      [][]      []        [][][][]
# [][]     [][][]      [][]    [][][]
# 这些形态都能够由上面形态短少局部小方块所失去
# [][][][]
# [][][][]
# 在代码中, 能够应用不同的值来示意这 8 个小方块的状态,
# 失去对应的方块形态, 不便代码解决. 例如, 基于下面定义
# 的 4 个常量值, 能够把土字形方块示意为: 21241112. 即,
# 第一行的第一个小方块不显示, 显示第二个小方块, 第三、# 第四个小方块不显示. 第一行在第四个小方块之后换行.
# 第二行的前三个小方块要显示, 第四个小方块不显示.
# 其余形态的方块能够相似示意. 具体如上面的数组所示.
#
# 第一个元素对应横放的田字形方块
# 第二个元素对应横放的土字形方块
# 第三个元素对应横放的 Z 字形方块
# 第四个元素对应横放的 L 字形方块
# 第五个元素对应横放的一字形方块
# 1、2、3、4 的含意如下面正文所示
HORIZONTAL_BLOCKS=(\
    "11241122" \
    "21241112" \
    "11242112" \
    "12241112" \
    "11132222" \
)

# 竖放的俄罗斯方块根本形态能够由上面形态短少局部小方块所失去
# [][]
# [][]
# [][]
# [][]
# 不同形态的示意办法能够参考下面横放形态的阐明.
#
# 第一个元素对应竖放的田字形方块
# 第二个元素对应竖放的土字形方块
# 第三个元素对应竖放的 Z 字形方块
# 第四个元素对应竖放的 L 字形方块
# 第五个元素对应竖放的一字形方块
VERTICAL_BLOCKS=(\
    "11241122" \
    "14131422" \
    "23131422" \
    "13141422" \
    "14141414" \
)

function print_block()
{if [ $# -ne 4]; then
        echo "Usage: $FUNCNAME line column bg_color square_list"
        return 1
    fi
    # 第一个参数指定显示方块的起始行
    local base_line="$1"
    # 第二个参数指定显示方块的起始列
    local base_column="$2"
    # 第三个参数指定显示方块的背景色
    local bg_color="$3"
    # 第四个参数指定显示方块的形态
    local square_list="$4"
    local square i

    # 应用 "\e[line;columnH" 本义码把光标挪动到指定起始地位
    # 后续会从这个起始地位开始输入字符, 指定方块的显示地位.
    printf "\e[${base_line};${base_column}H"

    # 每个方块最多有 8 个小方块组成, 遍历显示每一个小方块
    for ((i = 0; i < 8; ++i)); do
        # 从方块形态列表中获取每一个小方块的形态.
        # 具体形态的取值含意如下面正文所示.
        square=${square_list:i:1}
        if [$((square % 2)) -ne 0 ]; then
            # 如果小方块的值是奇数, 示意要显示黑白小方块
            printf "\e[4${bg_color}m[]\e[0m"
        else
            # 如果小方块的值是偶数, 示意要显示空白小方块
            printf " "
        fi

        # 如果小方块的值大于 2, 示意要换行.
        # 上面把光标挪动到下一行. 列数放弃起始列数不变.
        if [$square -gt 2]; then
            printf "\e[$((++base_line));${base_column}H"
        fi
    done
}

# 因为前面指定从第三行开始显示黑白方块,
# 为了防止已有内容烦扰显示, 先清屏.
clear
echo "Display color blocks."

for ((index = 0; index < 5; ++index)); do
    # 从第三行开始显示横放的所有方块. 每个方块最多占据 8 个字符.
    # 指定的列数为 10 的倍数, 不同方块之间空两行
    print_block 3 $((index*10)) ${COLORS[index]} ${HORIZONTAL_BLOCKS[index]}
    # 从第六行开始显示竖放的所有方块.
    print_block 6 $((index*10)) ${COLORS[index]} ${VERTICAL_BLOCKS[index]}
done

echo

执行 colorblocks_ext.sh 脚本的后果如下:

这里只列举了几种根本形态。

如果要显示其余形态,能够把具体的数字化示意值增加到对应的数组外面,就能显示进去。

正文完
 0