shell版俄罗斯方块 分类: shell版俄罗斯方块 2015-07-26 19:41 8人阅读 评论(0) 收藏
shell能是命令行解释器,shell脚本是命令的有序结合。在网上看到一位哥们用shell语言写了一个游戏,俄罗斯方块,佩服呀。为了弥补童年的不足,我们一起用shell语言开始编写我们自己的俄罗斯方块吧。
我们先来回顾一下,俄罗斯都有哪些方块吧。
box0=(0 0 0 1 1 0 1 1)
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
box4=(0 1 0 2 1 1 2 1 1
0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2 )
box5=(0 1 1 1 2 1 2 2 1
0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
box6=(0
1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2 )
从上面我们可以看出,每幅图下面都有一个box = ()东东,这个是什么呢?它是shell中的数组,后面括号里面放的是它的元素,即坐标点.
一起来看看shell中数组的语法吧
Bash中,数组变量的赋值有两种方法:
(1)name=(value1 ... valuen)此时小标从0开始
(2)name[index]=value
下面以一个简单的脚本来说明,脚本内容如下
#!/bin/bash
#定义数组
A=(a b c def)
#把数组按字符串显示输出
echo ${A[@]}或echo ${A[*]}
显示:a b c def
#数组的长度表示${#A[*]}
len=${#A[*]}或者len=${#A[@]}
echo ${#A[*]}
显示: 4
#改变数组元素的值
A[3] ="hello word"
echo ${A[*]}
显示:a b c hello word
#循环输出数组
len=${#A[@]}
for ((i = 0;i < len;i ++))
do
echo -n "${A[i]}"
done
________________________________
(( i = 0 ))
while (( i < len ))
do
echo "${A[i]}"
(( i = i + 1))
done
#循环输出数组元素的另一种写法,注意,${A[*]}不能写成$A,$A默认是第一个元素,如果A="a b c ded",就可以写$A
for value in ${A[*]}
do
echo $value
done
现在坐标点有了,那怎样把这些坐标点显示在屏幕上?这里我们要看一下shell中echo的用法
echo的基本语法不在进行讲解,我们来看一些其他的
echo 要变换颜色的时候,要使用-e
格式:echo -e "\033[背景颜色;字体颜色m字符串\033[0m"
eg:
echo -e "\033[41;36m something here \033[0m"
其中41的位置代表底色,36的位置是代表字的颜色
那些ascii code是对颜色调用的始末
\033[;m ... \033[0m
例子:
让字体变为红色并且不停的闪烁
echo -e "\033[31m\033[05m请确认是否要停止当前的sequid进程,输入[Y|N]\033[0m"
字背景颜色范围:40 -- 49
40:黑 41:深红 42:绿 43:黄 44:蓝 45:紫 46:深绿 47:白色
字颜色:30 -- 39
30:黑 31:红 32:绿 33:黄 34:蓝 35:紫 36:深绿 37:白
ANSI控制码的说明
\033[0m 关闭所有属性 \033[1m设置高亮度 \033[4m下划线 \033[y;xH设置光标位置
到这里我们把我们要在屏幕显示的坐标点都显示出来吧:
效果:
到此我们终于可以在屏幕上画出东东了。
前面一节,我们在屏幕上画出了俄罗斯方块,现在我们让它动起来,呵呵,动起来...
思想就是通过改变x,y的坐标,在屏幕的不同地方绘制图形。
方法是通过方向键(A S D W)来改变x,y的坐标。
先来看看shell中的信号处理吧
一、trap捕捉到信号之后,可以有三种反应方式
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二、trap对上面三种方式提供了三种基本形式
第一种形式的trap命令在shell接受到signal list清单中数值相同的信号时,将执行双引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap "" signal-list
注意:
(1)对信号11(段违例)不能捕捉,因为shell本身需要捕捉该信号去进行内存的转储
(2)在trap中可以定义对信号0的处理(实际上没有这个信号),shell程序在其终止(如执行exit语句时) 发出该信号
(3)在捕捉到signal-list中指定的信号并执行完相应的命令之后,如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令
另外,在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是单引号括起来的话,那么shell不会对commands中的变量和命令进行替换,否则commands中的变量和命令将用当时具体的值来替换。
- #!/bin/bash
- SigA=20
- SigS=21
- SigD=22
- SigW=23
- sig=0
- function Register_Signal()
- {
- trap "sig=$SigA;" $SigA
- trap "sig=$SigS;" $SigS
- trap "sig=$SigD;" $SigD
- trap "sig=$SigW;" $SigW
- }
- function Recive_Signal()
- {
- Register_Signal
- while true
- do
- sigThis=$sig
- case "$sigThis" in
- "$SigA")
- echo "A"
- sig=0
- ;;
- "$SigS")
- echo "S"
- sig=0
- ;;
- "$SigD")
- echo "D"
- sig=0
- ;;
- "$SigW")
- echo "W"
- sig=0
- ;;
- esac
- done
- }
- function Kill_Signal()
- {
- local sigThis
- while :
- do
- read -s -n 1 key
- case "$key" in
- "W"|"w")
- kill -$SigW $1
- ;;
- "S"|"s")
- kill -$SigS $1
- ;;
- "A"|"a")
- kill -$SigA $1
- ;;
- "D"|"d")
- kill -$SigD $1
- ;;
- "Q"|"q")
- kill -9 $1
- exit
- esac
- done
- }
- if [[ "$1" == "--show" ]]
- then
- Recive_Signal
- else
- bash $0 --show &
- Kill_Signal $!
- fi
这段shell脚本的功能是:按下A S D W键会打印出对应的字母,按下 Q键退出
上一节我们学了一下shell脚本中信号的用法,这一节我们在屏幕上画出一个方块,并且让它动起来.
box0=(0 0 0 1 1 0 1 1)
现在我们就让box0在我们屏幕的任意地方动起来
实现功能:
A -> 左移 D->右移 W->向上 S->向下
思路就是通过改变x,y的坐标,在屏幕不同的地方,把box0画出来
-
#!/bin/bash
-
-
#信号
-
SigA=20
-
SigS=21
-
SigD=22
-
SigW=23
-
sig=0
-
-
#方块在屏幕上的坐标点
-
box0=(0 0 0 1 1 0 1 1)
-
-
#边缘距离
-
top=3
-
left=3
-
-
#当前x,y坐标
-
currentX=15
-
currentY=2
-
-
function Draw_Box()
-
{
-
local i j x y
-
-
if (($1 == 0))
-
then
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = left + 3 * (currentX + ${box0[i]})))
-
((y = top + currentY + ${box0[i+1]}))
-
-
echo -e "\033[${y};${x}H "
-
done
-
else
-
echo -e "\033[31m\033[1m"
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = left + 3 * (currentX + ${box0[i]})))
-
((y = top + currentY + ${box0[i+1]}))
-
-
echo -e "\033[${y};${x}H[*]"
-
done
-
fi
-
-
echo -e "\033[0m"
-
}
-
-
function move_left()
-
{
-
-
if ((currentX == 0 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentX -- ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
-
function move_right()
-
{
-
-
if ((currentX > 20 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentX ++ ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
-
function move_up()
-
{
-
-
if ((currentY == 0 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentY -- ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
-
function move_down()
-
{
-
-
if ((currenty > 20 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentY ++ ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
-
function Register_Signal()
-
{
-
trap "sig=$SigA;" $SigA
-
trap "sig=$SigS;" $SigS
-
trap "sig=$SigD;" $SigD
-
trap "sig=$SigW;" $SigW
-
}
-
-
function Recive_Signal()
-
{
-
Register_Signal
-
-
Draw_Box 1
-
-
while true
-
do
-
sigThis=$sig
-
-
case "$sigThis" in
-
"$SigA")
-
move_left
-
sig=0
-
;;
-
-
"$SigS")
-
move_down
-
sig=0
-
;;
-
-
"$SigD")
-
move_right
-
sig=0
-
;;
-
-
"$SigW")
-
move_up
-
sig=0
-
;;
-
esac
-
-
done
-
}
-
-
function Kill_Signal()
-
{
-
local sigThis
-
-
while :
-
do
-
read -s -n 1 key
-
-
case "$key" in
-
-
"W"|"w")
-
kill -$SigW $1
-
;;
-
"S"|"s")
-
kill -$SigS $1
-
;;
-
"A"|"a")
-
kill -$SigA $1
-
;;
-
"D"|"d")
-
kill -$SigD $1
-
;;
-
"Q"|"q")
-
kill -9 $1
-
exit
-
esac
-
-
done
-
}
-
-
if [[ "$1" == "--show" ]]
-
then
-
Recive_Signal
-
else
-
bash $0 --show &
-
Kill_Signal $!
- fi
就到这吧,下一节我们随机产生方块,让后让它改变形状。
现在,我们知道,怎样在屏幕上画方块,怎样让方块移动,今天我们将实现,系统随机产生方块,并且让其动起来,嗯,动起来....
现在看看在shell中产生随机数的方法
一、通过时间获得随机数(date)
可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。
例子:
date +%s
注意:date 空格 +%s
如果用它做随机数,相同一秒的数据是一样的。多线程里面基本不能满足要求了。
date +%N
这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞
date +%s%N
这个可以说比较完美,加入时间戳,又加上纳秒
接下来我们看怎么获得数据内怎么样获得随机数
程序运行的结果:
二、通过内部系统变量($RANDOM)
其实,linux已经提供有个系统环境变量了,直接就是随机数
echo $RANDOM
通过它,我们可以获得的数据是一个小于或等于5位的整数
学完了随机数,我们让它帮助我们产生随机方块吧。
-
#!/bin/bash
-
-
#七中不同的方块的定义
-
#通过旋转,每种方块的显示的样式可能有几种
-
box0=(0 0 0 1 1 0 1 1)
-
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
-
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
-
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
-
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
-
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
-
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
-
-
#把所有盒子放在box中
-
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
-
-
#每个盒子在box中的偏移
-
boxOffset=(0 1 3 5 7 11 15)
-
-
#旋转次数
-
rotateCount=(1 2 2 2 4 4 4)
-
-
#颜色数组
-
colourArry=(31 32 33 34 35 36 37)
-
-
#选装类型
-
rotateType=-1
-
-
#盒子标号
-
boxNum=-1
-
-
#新盒子
-
newBox=()
-
-
#边缘距离
-
top=3
-
left=3
-
-
#当前x,y坐标
-
currentX=15
-
currentY=2
-
-
function Draw_Box()
-
{
-
local i j x y
-
-
if (($1 == 0))
-
then
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = left + 3 * (currentX + ${newBox[i]})))
-
((y = top + currentY + ${newBox[i+1]}))
-
-
echo -e "\033[${y};${x}H "
-
done
-
else
-
echo -e "\033[${colourArry[$colourNum]}m\033[1m"
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = left + 3 * (currentX + ${newBox[i]})))
-
((y = top + currentY + ${newBox[i+1]}))
-
-
echo -e "\033[${y};${x}H[*]"
-
done
-
fi
-
-
echo -e "\033[0m"
-
}
-
-
-
function Random_Box()
-
{
-
#随机产生盒子号
-
(( boxNum = $RANDOM % 7 ))
-
#随机长生盒子的类型
-
((rotateType = $RANDOM % ${rotateCount[boxNum]}))
-
#随机产生颜色
-
((colourNum = $RANDOM % ${#colourArry[*]}))
-
-
#找到所在box中的起始位置
-
((j = ${boxOffset[boxNum]} * 8 + rotateType * 8))
-
-
for(( i = 0 ;i < 8;i ++))
-
do
-
((newBox[i] = ${box[j+i]}))
-
done
-
}
-
-
while :
-
do
-
Random_Box
-
Draw_Box 1
-
sleep 1
-
Draw_Box 0
- done
前面我们已经可以随机产生俄罗斯方块了,今天我们让它随键盘而改变
-
#!/bin/bash
-
-
#七中不同的方块的定义
-
#通过旋转,每种方块的显示的样式可能有几种
-
box0=(0 0 0 1 1 0 1 1)
-
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
-
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
-
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
-
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
-
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
-
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
-
-
#把所有盒子放在box中
-
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
-
-
#每个盒子在box中的偏移
-
boxOffset=(0 1 3 5 7 11 15)
-
-
#旋转次数
-
rotateCount=(1 2 2 2 4 4 4)
-
-
#颜色数组
-
colourArry=(31 32 33 34 35 36 37)
-
-
#选装类型
-
rotateType=-1
-
-
#盒子标号
-
boxNum=-1
-
-
#新盒子
-
newBox=()
-
-
#边缘距离
-
top=3
-
left=3
-
-
#当前x,y坐标
-
currentX=15
-
currentY=2
-
-
#信号
-
SigA=20
-
SigS=21
-
SigD=22
-
SigW=23
-
sig=0
-
-
#随机产生盒子
-
function Random_Box()
-
{
-
#随机产生盒子号
-
(( boxNum = $RANDOM % 7 ))
-
#随机长生盒子的类型
-
((rotateType = $RANDOM % ${rotateCount[boxNum]}))
-
#随机产生颜色
-
((colourNum = $RANDOM % ${#colourArry[*]}))
-
-
#找到所在box中的起始位置
-
((j = ${boxOffset[boxNum]} * 8 + rotateType * 8))
-
-
for(( i = 0 ;i < 8;i ++))
-
do
-
((newBox[i] = ${box[j+i]}))
-
done
-
}
-
-
-
function Draw_Box()
-
{
-
local i j x y
-
-
-
if (($1 == 0))
-
then
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = left + 3 * (currentX + ${newBox[i]})))
-
((y = top + currentY + ${newBox[i+1]}))
-
-
echo -e "\033[${y};${x}H "
-
done
-
else
-
echo -e "\033[${colourArry[$colourNum]}m\033[1m"
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = left + 3 * (currentX + ${newBox[i]})))
-
((y = top + currentY + ${newBox[i+1]}))
-
-
echo -e "\033[${y};${x}H[*]"
-
done
-
fi
-
-
echo -e "\033[0m"
-
}
-
-
function move_left()
-
{
-
local temp
-
-
if (( currentX == 0 ))
-
then
-
return 1
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentX -- ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0
-
}
-
-
-
function move_right()
-
{
-
-
if ((currentX > 20 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentX ++ ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
#记录已经旋转的方块次数
-
tempCount=0
-
-
#按下w键旋转处理
-
function box_rotate()
-
{
-
local start_post
-
-
((tempCount ++))
-
#echo ${rotateCount[boxNum]}
-
if ((tempCount >= ${rotateCount[boxNum]}))
-
then
-
((tempCount = 0))
-
fi
-
-
#每个盒子在box中的始位置
-
((start_post = ${boxOffset[boxNum]} * 8 + tempCount * 8))
-
-
for ((i = 0;i < 8;i ++))
-
do
-
((newBox[i] = ${box[start_post+i]}))
-
done
-
-
return 0
-
}
-
-
function move_rotate()
-
{
-
-
if ((currentY == 0 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变当前方块的形状
-
box_rotate
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
-
function move_down()
-
{
-
-
if ((currenty > 20 ))
-
then
-
return 1;
-
fi
-
-
#先清除以前的方块
-
Draw_Box 0
-
-
#改变x坐标
-
(( currentY ++ ))
-
-
#画出新的方块
-
Draw_Box 1
-
-
return 0;
-
}
-
-
-
function Register_Signal()
-
{
-
trap "sig=$SigA;" $SigA
-
trap "sig=$SigS;" $SigS
-
trap "sig=$SigD;" $SigD
-
trap "sig=$SigW;" $SigW
-
}
-
-
function Recive_Signal()
-
{
-
-
Random_Box
-
Draw_Box 1
-
Register_Signal
-
-
while true
-
do
-
sigThis=$sig
-
-
case "$sigThis" in
-
"$SigA")
-
move_left
-
sig=0
-
;;
-
-
"$SigS")
-
move_down
-
sig=0
-
;;
-
-
"$SigD")
-
move_right
-
sig=0
-
;;
-
-
"$SigW")
-
move_rotate
-
sig=0
-
;;
-
esac
-
-
done
-
}
-
-
function Kill_Signal()
-
{
-
local sigThis
-
-
while :
-
do
-
read -s -n 1 key
-
-
case "$key" in
-
-
"W"|"w")
-
kill -$SigW $1
-
;;
-
"S"|"s")
-
kill -$SigS $1
-
;;
-
"A"|"a")
-
kill -$SigA $1
-
;;
-
"D"|"d")
-
kill -$SigD $1
-
;;
-
"Q"|"q")
-
kill -9 $1
-
exit
-
esac
-
-
done
-
}
-
-
if [[ "$1" == "--show" ]]
-
then
-
Recive_Signal
-
else
-
bash $0 --show &
-
Kill_Signal $!
- fi
效果图:
红色部分是我们今天写的代码,思路是使用随机产生的盒子号确定此盒子在box中的位置,然后从此位置开始,把它的所有造型在屏幕上挨个画出来。
到现在为止,我们可以随机产生俄罗斯方块,并且可以移动和改变,下一节我们在屏幕上画出一个矩阵,让盒子从矩阵的顶部自动下落,到矩阵的底部停止。
我们现在屏幕上画出一个矩阵,这个很简单
-
#!/bin/bash
-
-
clear
-
-
#边缘距离
-
left=10
-
top=5
-
-
#矩阵的长和宽
-
widthSize=25
-
hightSize=25
-
-
#画出矩阵
-
function draw_rectangle()
-
{
-
local x y
-
-
echo -e "\033[32m\033[46m\033[1m"
-
-
for ((i = 0
;i < widthSize;i ++))
-
do
-
((x = left + i))
-
((y = top + hightSize - 1))
-
-
echo -e "\033[${top};${x}H="
-
echo -e "\033[${y};${x}H="
-
-
done
-
-
for ((i = 0
;i < hightSize;i ++))
-
do
-
((x = left + widthSize - 1))
-
((y = top + i))
-
-
echo -e "\033[${y};${left}H||"
-
echo -e "\033[${y};${x}H||"
-
-
done
-
-
echo -e "\033[0m"
-
}
-
- draw_rectangle
效果图:
矩阵有了,接下来就是让盒子从矩阵的顶部下落下来到底部停止
-
#!/bin/bash
-
-
#七中不同的方块的定义
-
#通过旋转,每种方块的显示的样式可能有几种
-
box0=(0 0 0 1 1 0 1 1)
-
box1=(0 2 1 2 2 2 3 2 1 0 1 1 1 2 1 3)
-
box2=(0 0 0 1 1 1 1 2 0 1 1 0 1 1 2 0)
-
box3=(0 1 0 2 1 0 1 1 0 0 1 0 1 1 2 1)
-
box4=(0 1 0 2 1 1 2 1 1 0 1 1 1 2 2 2 0 1 1 1 2 0 2 1 0 0 1 0 1 1 1 2)
-
box5=(0 1 1 1 2 1 2 2 1 0 1 1 1 2 2 0 0 0 0 1 1 1 2 1 0 2 1 0 1 1 1 2)
-
box6=(0 1 1 1 1 2 2 1 1 0 1 1 1 2 2 1 0 1 1 0 1 1 2 1 0 1 1 0 1 1 1 2)
-
-
#把所有盒子放在box中
-
box=(${box0[@]} ${box1[@]} ${box2[@]} ${box3[@]} ${box4[@]} ${box5[@]} ${box6[@]})
-
-
#每个盒子在box中的偏移
-
boxOffset=(0 1 3 5 7 11 15)
-
-
#旋转次数
-
rotateCount=(1 2 2 2 4 4 4)
-
-
#颜色数组
-
colourArry=(31 32 33 34 35 36 37)
-
-
#选装类型
-
rotateType=-1
-
-
#盒子标号
-
boxNum=-1
-
-
#新盒子
-
newBox=()
-
-
#边缘距离
-
left=10
-
top=5
-
-
#矩阵的长和宽
-
widthSize=28
-
hightSize=26
-
-
#确定从矩阵那个地方出来
-
function ensure_postion()
-
{
-
local sumx=0 i j
-
-
((minx = ${newBox[0]}))
-
((miny = ${newBox[1]}))
-
((maxy = miny ))
-
-
for ((i = 2;
i < ${#newBox[*]};i += 2))
-
do
-
#确定最小的x坐标
-
if ((minx > ${newBox[i]}))
-
then
-
((minx = ${newBox[i]}))
-
fi
-
-
#确定最小的y坐标
-
if ((miny > ${newBox[i+1]}))
-
then
-
((miny = ${newBox[i+1]}))
-
fi
-
-
if ((${newBox[i]} == ${newBox[i-2]}))
-
then
-
continue
-
fi
-
-
((sumx ++))
-
-
done
-
-
if ((sumx == 0))
-
then
-
((sumx = 1))
-
fi
-
-
#当前x,y坐标
-
((currentX = left + widthSize / 2 - sumx * 2 - minx))
-
((currentY = top + 1 - miny))
-
-
return 0
-
}
-
-
#画出矩阵
-
function draw_rectangle()
-
{
-
local x y
-
-
echo -e "\033[32m\033[46m\033[1m"
-
-
for ((i = 0
;i < widthSize;i ++))
-
do
-
((x = left + i))
-
((y = top + hightSize - 1))
-
-
echo -e "\033[${top};${x}H="
-
echo -e "\033[${y};${x}H="
-
-
done
-
-
for ((i = 0
;i < hightSize;i ++))
-
do
-
((x = left + widthSize - 1))
-
((y = top + i))
-
-
echo -e "\033[${y};${left}H||"
-
echo -e "\033[${y};${x}H||"
-
-
done
-
-
echo -e "\033[0m"
-
}
-
-
-
#画出方块
-
function Draw_Box()
-
{
-
local i j x y
-
-
if (($1 == 0))
-
then
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = currentX + 3 * ${newBox[i]}))
-
((y = currentY + ${newBox[i+1]}))
-
-
echo -e "\033[${y};${x}H "
-
done
-
else
-
echo -e "\033[${colourArry[$colourNum]}m\033[1m"
-
for ((i = 0;i < 8;i += 2))
-
do
-
((x = currentX + 3 * ${newBox[i]}))
-
((y = currentY + ${newBox[i+1]}))
-
-
echo -e "\033[${y};${x}H[*]"
-
done
-
fi
-
-
echo -e "\033[0m"
-
}
-
-
#随机产生方块
-
function Random_Box()
-
{
-
#随机产生盒子号
-
(( boxNum = $RANDOM % 7 ))
-
#随机长生盒子的类型
-
((rotateType = $RANDOM % ${rotateCount[boxNum]}))
-
#随机产生颜色
-
((colourNum = $RANDOM % ${#colourArry[*]}))
-
-
#找到所在box中的起始位置
-
((j = ${boxOffset[boxNum]} * 8 + rotateType * 8))
-
-
for(( i = 0
;i < 8;i ++))
-
do
-
((newBox[i] = ${box[j+i]}))
-
done
-
}
-
-
#判断能否下移
-
function move_test()
-
{
-
local vary=$1 i
-
-
#当前的y坐标加上newBox里面的坐标,其值是否大于28
-
for ((i = 0;i < ${#newBox[@]}; i += 2))
-
do
-
if ((vary + ${newBox[i+1]} > 28))
-
then
-
return 0
-
fi
-
done
-
-
return 1
-
}
-
-
-
draw_rectangle
-
Random_Box
-
ensure_postion
-
-
while :
-
do
-
Draw_Box 1
-
-
sleep 0.1
-
Draw_Box 0
-
-
((currentY ++))
-
-
if move_test currentY
-
then
-
Draw_Box 1
-
sleep 2
-
Draw_Box 0
-
Random_Box
-
ensure_postion
-
fi
-
-
done
-
- echo
下一次,我们实现通过键盘改变方块形状和移动方块,并且实现累加
原文:chengyaogen.blog.chinaunix.net