shell脚本俄罗斯方块小游戏

这是一个使用shell脚本实现的简单俄罗斯方块小游戏。脚本中定义了颜色、位置、大小、控制信号、方块样式以及游戏运行时的数据。游戏由两个进程组成,一个接收输入,一个处理游戏流程和显示界面。玩家可以通过键盘控制方块的移动和旋转,当方块到达底部或与其他方块相撞时,会被固定在棋盘上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell脚本俄罗斯方块小游戏

#!/bin/bash

APP_NAME="${0##*[\/]}"
APP_VERSION=“1.0”

#颜色定义
iSumColor=7 #颜色总数
cRed=1 #红色
cGreen=2 #绿色
cYellow=3 #黄色
cBlue=4 #蓝色
cFuchsia=5 #紫红色
cCyan=6 #青色(蓝绿色)
cWhite=7 #白色

#位置与大小
marginLeft=3 #边框左边距
marginTop=2 #边框上边距
((mapLeft=marginLeft+2)) #棋盘左边距
((mapTop=$marginTop+1)) #棋盘上边距
mapWidth=10 #棋盘宽度
mapHeight=15 #棋盘高度

#颜色设置
cBorder= c G r e e n c S c o r e = cGreen cScore= cGreencScore=cFuchsia
cScoreValue=$cCyan

#控制信号
#游戏使用两个进程,一个用于接收输入,一个用于游戏流程和显示界面;
#当前者接收到上下左右等按键时,通过向后者发送signal的方式通知后者。
sigRotate=25 #向上键
sigLeft=26
sigRight=27
sigDown=28
sigAllDown=29 #空格键
sigExit=30

#方块定义,7大类19种样式
#前8位为方块坐标,后2位为方块刚出现的时候的位置
box0_0=(0 0 0 1 1 0 1 1 0 4)

box1_0=(0 1 1 1 2 1 3 1 0 3)
box1_1=(1 0 1 1 1 2 1 3 -1 3)

box2_0=(0 0 1 0 1 1 2 1 0 4)
box2_1=(0 1 0 2 1 0 1 1 0 3)

box3_0=(0 1 1 0 1 1 2 0 0 4)
box3_1=(0 0 0 1 1 1 1 2 0 4)

box4_0=(0 2 1 0 1 1 1 2 0 3)
box4_1=(0 1 1 1 2 1 2 2 0 3)
box4_2=(1 0 1 1 1 2 2 0 -1 3)
box4_3=(0 0 0 1 1 1 2 1 0 4)

box5_0=(0 0 1 0 1 1 1 2 0 3)
box5_1=(0 1 0 2 1 1 2 1 0 3)
box5_2=(1 0 1 1 1 2 2 2 -1 3)
box5_3=(0 1 1 1 2 0 2 1 0 4)

box6_0=(0 1 1 0 1 1 1 2 0 3)
box6_1=(0 1 1 1 1 2 2 1 0 3)
box6_2=(1 0 1 1 1 2 2 1 -1 3)
box6_3=(0 1 1 0 1 1 2 1 0 4)

iSumType=7 #方块类型总数
boxStyle=(1 2 2 2 4 4 4) #各种方块旋转后可能的样式数目

iScoreEachLevel=50 #提升一个级别需要的分数
#运行时数据
sig=0 #接收到的signal
iScore=0 #总分
iLevel=0 #速度级
boxNext=() #下一个方块
iboxNextColor=0 #下一个方块的颜色
iboxNextType=0 #下一个方块的种类
iboxNextStyle=0 #下一个方块的样式
boxCur=() #当前方块的位置定义
iBoxCurColor=0 #当前方块的颜色
iBoxCurType=0 #当前方块的种类
iBoxCurStyle=0 #当前方块的样式
boxCurX=-1 #当前方块的x坐标位置
boxCurY=-1 #当前方块的y坐标位置
map=() #棋盘图表

#初始化所有背景方块为-1, 表示没有方块
for ((i = 0; i < mapHeight * mapWidth; i++))
do
map[$i]=-1
done

#接收输入的进程的主函数
function RunAsKeyReceiver()
{
local pidDisplayer key aKey sig cESC sTTY

pidDisplayer=$1
aKey=(0 0 0)

cESC=`echo -ne "\033"`
cSpace=`echo -ne "\040"`

#保存终端属性。在read -s读取终端键时,终端的属性会被暂时改变。
#如果在read -s时程序被不幸杀掉,可能会导致终端混乱,
#需要在程序退出时恢复终端属性。
sTTY=`stty -g`

#捕捉退出信号
trap "MyExit;" INT QUIT
trap "MyExitNoSub;" $sigExit

#隐藏光标
echo -ne "\033[?25l"

while :
do
	#读取输入。注-s不回显,-n读到一个字符立即返回
	read -s -n 1 key

	aKey[0]=${aKey[1]}
	aKey[1]=${aKey[2]}
	aKey[2]=$key
	sig=0

	#判断输入了何种键
	if [[ $key == $cESC && ${aKey[1]} == $cESC ]]
	then
		#ESC键
		MyExit
	elif [[ ${aKey[0]} == $cESC && ${aKey[1]} == "[" ]]
	then
		if [[ $key == "A" ]]; then sig=$sigRotate	#<向上键>
		elif [[ $key == "B" ]]; then sig=$sigDown	#<向下键>
		elif [[ $key == "D" ]]; then sig=$sigLeft	#<向左键>
		elif [[ $key == "C" ]]; then sig=$sigRight	#<向右键>
		fi
	elif [[ $key == "W" || $key == "w" ]]; then sig=$sigRotate	#W, w
	elif [[ $key == "S" || $key == "s" ]]; then sig=$sigDown	#S, s
	elif [[ $key == "A" || $key == "a" ]]; then sig=$sigLeft	#A, a
	elif [[ $key == "D" || $key == "d" ]]; then sig=$sigRight	#D, d
	elif [[ "[$key]" == "[]" ]]; then sig=$sigAllDown	#空格键
	elif [[ $key == "Q" || $key == "q" ]]			#Q, q
	then
		MyExit
	fi

	if [[ $sig != 0 ]]
	then
		#向另一进程发送消息
		kill -$sig $pidDisplayer
	fi
done

}

#退出前的恢复
MyExitNoSub()
{
local y

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值