当前位置: 首页 > Linux

Bash提示:用于打印彩色俄罗斯方块形状的Shell脚本

时间:2023-04-06 01:22:25 Linux

在Linuxbash中,您可以使用下面描述的shell脚本来显示单个彩色俄罗斯方块形状。硬编码彩色俄罗斯方块下面的代码使用ANSI转义码来设置终端字符的显示颜色以显示彩色俄罗斯方块内容。为了便于理解,在脚本代码的注释中解释了每个ANSI转义码的含义。关于ANSI转义码的详细说明,可以参考上一篇文章。假设有一个colorblocks.sh脚本,内容如下:#!/bin/bash#显示俄罗斯方块几种基本形状的色块#田字系域#"\e[43m"设置背景颜色characterstoyellow#"\e[0m"重置字符属性为默认值,恢复原来的颜色。echo-e"\e[43m[][]\n[][]\e[0m"#echo命令不带参数时,默认输出一个Linebreak.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-shapedsquare#"\e[44m"设置字符背景色为蓝色echo-e"\e[44m[]\n[][][]\e[0m"echo#一行方块#"\e[41m"设置字符背景colorisredecho-e"\e[41m[][][][]\e[0m"echo执行colorblocks.sh脚本结果如下:俄罗斯方块的基本形状是直接硬编码显示俄罗斯方块的几个基本形状,无法指定立方体的显示位置。如果要显示其他形状的正方形,只能硬编码显示,代码不能复用。事实上,俄罗斯方块水平方向的所有基本形状都可以通过以下形状中缺少一些小方块来获得:[][][][][][][][]俄罗斯方块垂直方向的所有基本形状都可以得到它是缺失一些小方块得到如下形状:[][][][][][][][]即俄罗斯方块的所有基本形状都可以用8个小方块表示。我们可以用不同的值来表示这8个小方块的状态,从而用数字表示对应的基本形状。例如,用1表示要显示一个小方块。使用0表示不显示小方块。那么横放的土形方块可以表示为01001110,即第一行只显示第二个小方块,其他小方块不显示。第二行显示前三个小方块,第四个小方块不显示。其他形状的正方形也可以类似表示。由于水平形状有两行,垂直形状有四行,因此需要一个额外的状态值来指示环绕状态。可以改为使用以下状态值来表示:1:表示显示小方块不换行2:表示不显示小方块不换行3:表示显示小方块和换行4表示不显示小方块和根据这个定义,对于水平放置的地球形正方形,换行符表示为21241112。将竖放的土块表示为14131422。通过控制换行符的位置,可以决定是横放还是竖放。在用数字表示俄罗斯方块的基本形状后,我们可以将这些形状放入一个数组中。通过遍历数组,判断每个小方块的状态值,就可以显示出对应形状的方块。以后要显示其他形状的正方形时,只需要将数字化的形状表示添加到数组中即可。以下脚本可以根据俄罗斯方块数组的数字化表示显示相应的块。脚本代码的关键点都添加了详细的注释,方便阅读和理解。假设有一个colorblocks_ext.sh脚本,内容如下:#!/bin/bash#这个数组用来指定不同方块的背景颜色#1对应红色。2对应绿色。3对应黄色#4对应蓝色。6对应青色。COLORS=(12346)#定义以下常量来解释这些值的含义#显示彩色方块“[]”不换行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"\)#vertical放置的俄罗斯方块的基本形状可以通过缺少下面形状中的一些小方块得到#[][]#[][]#[][]#[][]#不同形状的表示请参考上面水平形状的描述##第一个元素对应竖放的正方形square#第二个元素对应竖放的土形正方形#第三个元素对应竖放的Z形方块#第四个元素对应竖放的L形方块#第五个元素对应垂直单行块thenecho"Usage:$FUNCNAMElinecolumnbg_c??olorsquare_list"return1fi#第一个参数指定显示框的起始行localbase_line="$1"#第二个参数指定显示框的起始列localbase_column="$2"#第三个参数指定显示框的背景色localbg_c??olor="$3"#第四个参数指定显示框的形状localsquare_list="$4"localsquarei#使用"\e[line;columnH"转义code将光标移动到指定的起始位置#字符将从这个起始位置开始输出,并指定指定框的显示位置。printf"\e[${base_line};${base_column}H"#每个方框最多由8个小方块组成,遍历并显示每个小方块for((i=0;i<8;++i));do#从正方形列表中获取每个小正方形的形状。#具体shape值的含义如上面注释所示。square=${square_list:i:1}if[$((square%2))-ne0];then#如果小方块的值为奇数,表示显示一个彩色小方块printf"\e[4${bg_color}m[]\e[0m"else#如果小方块的值为偶数,表示显示一个空白的小方块printf""fi#如果小方块的值大于2,表示换行。#下面将光标移动到下一行。列数与初始列数相同。如果[$square-gt2];thenprintf"\e[$((++base_line));${base_column}H"fidone}#由于指定从第三行开始显示彩色块,#为了避免已有内容干扰显示,先清屏。clearecho"显示色块。"for((index=0;index<5;++index));do#从第三行开始显示所有水平块。每个块最多可以占用8个字符。#指定列数为10的倍数,不同块之间有两个空行print_block3$((index*10))${COLORS[index]}${HORIZONTAL_BLOCKS[index]}#显示所有垂直块从第六行开始。print_block6$((index*10))${COLORS[index]}${VERTICAL_BLOCKS[index]}doneechocolorblocks_ext.sh脚本执行结果如下:这里只展示了几个基本的形状。如果要显示其他形状,可以将具体的数字表示值添加到对应的数组中,就会显示出来。