好久没写到一个让自已比较满意的代码了。这个代码比较满意了,不过看起来会比较费劲些:
Map=(0 0 1 1 1 0 0 0 7
0 0 1 4 1 0 0 0 7
0 0 1 3 1 1 1 1 7
1 1 1 0 0 3 4 1 7
1 4 0 3 2 1 1 1 7
1 1 1 1 3 1 0 0 7
0 0 0 1 4 1 0 0 7
0 0 0 1 1 1 0 0 7)
CellType=(' ' '■' '♀' '☆' '◎' '♂' '★' "\n")
ShowMap()
{
for i in `seq 0 71` #显示所有的格子里边的内容
do
temp=${Map[i]}
if [ ${temp} -eq 2 -o ${temp} -eq 5 ]; then #找到自己
num=${i}
elif [ ${temp} -eq 3 ]; then
let boxcount+=1
fi
printf "${CellType[temp]}"
done
}
Move()
{
read -n 1 input
case $input in
"w") #上
NextPosition=num-9; NextPosition2=num-18;;
"s") #下
NextPosition=num+9; NextPosition2=num+18;;
"a") #左
NextPosition=num-1; NextPosition2=num-2;;
"d") #右
NextPosition=num+1; NextPosition2=num+2;;
esac
if [ "${Map[NextPosition]}" -eq 0 ]; then #如果上一列为空白
Map[NextPosition]=2 #则把上一列变为人
Map[num]=0 #当前位置变为空白
elif [ "${Map[NextPosition]}" -eq 3 ]; then #如果上一列为箱子
if [ "${Map[NextPosition2]}" -eq 0 ]; then #如果上上列为空白
Map[NextPosition]=2 #则把上一列变为人
Map[num]=0 #把当前列变为空白
Map[NextPosition2]=3 #把上上列变为箱子
elif [ "${Map[NextPosition2]}" -eq 4 ]; then #如果上上列为终点
Map[NextPosition]=2
Map[num]=0
Map[NextPosition2]=6
fi
elif [ "${Map[NextPosition]}" -eq 4 ]; then #如果上一列为终点
Map[NextPosition]=5
Map[num]=0
fi
}
while true #一直循环
do
clear #清除屏幕
echo "===================推箱子游戏=================="
echo "====规则:将☆全部推到◎处,即胜利, 推箱子: w:向上 s:向下 a:向左 d:向右 +回车===="
boxcount=0
ShowMap
Move
[ $boxcount -eq 0 ] && echo "you are win" && break
done
运行效果(当前是把箱子都推到目的地后,需要再移动一步就好),不是很完美。。:
20231206跟学生上完课后,把脚本优化了下,减少了些行数:
Map=(0 0 1 1 1 0 0 0 9
0 0 1 4 1 0 0 0 9
0 0 1 3 1 1 1 1 9
1 1 1 0 0 3 4 1 9
1 4 0 3 2 1 1 1 9
1 1 1 1 3 1 0 0 9
0 0 0 1 4 1 0 0 9
0 0 0 1 1 1 0 0 9)
ShowMap()
{
for i in `seq 0 71` #显示所有的格子里边的内容
do
if [ ${Map[i]} -eq 2 -o ${Map[i]} -eq 5 ]; then #找到自己
num=${i}
elif [ ${Map[i]} -eq 3 ]; then
let boxcount+=1
fi
case ${Map[i]} in
[0]) printf " ";; #空白
[1]) printf "■";; #墙
[2]) printf "♀";; #人
[3]) printf "☆";; #箱子
[4]) printf "◎";; #终点
[5]) printf "♂";; #人+终点
[6]) printf "★";; #箱子+终点
[9]) printf "\n";; #墙
esac
done
}
function Move()
{
read -n 1 input
case $input in
"w")
#上
if [ "${Map[num-9]}" -eq 0 ]; then #如果上一列为空白
Map[num-9]=2 #则把上一列变为人
Map[num]=0 #当前位置变为空白
elif [ "${Map[num-9]}" -eq 3 ]; then #如果上一列为箱子
if [ "${Map[num-18]}" -eq 0 ]; then #如果上上列为空白
Map[num-9]=2 #则把上一列变为人
Map[num]=0 #把当前列变为空白
Map[num-18]=3 #把上上列变为箱子
elif [ "${Map[num-18]}" -eq 4 ]; then #如果上上列为终点
Map[num-9]=2
Map[num]=0
Map[num-18]=6
fi
elif [ "${Map[num-9]}" -eq 4 ]; then #如果上一列为终点
Map[num-9]=5
Map[num]=0
fi
;;
"a")
#左
if [ "${Map[num-1]}" -eq 0 ]; then
Map[num-1]=2
Map[num]=0
elif [ "${Map[num-1]}" -eq 3 ]; then
if [ "${Map[num-2]}" -eq 0 ]; then
Map[num-1]=2
Map[num]=0
Map[num-2]=3
elif [ "${Map[num-2]}" -eq 4 ]; then
Map[num-1]=2
Map[num]=0
Map[num-2]=6
fi
elif [ "${Map[num-1]}" -eq 4 ]; then
Map[num-1]=5
Map[num]=0
fi
;;
"d")
#右
if [ "${Map[num+1]}" -eq 0 ]; then
Map[num+1]=2
Map[num]=0
elif [ "${Map[num+1]}" -eq 3 ]; then
if [ "${Map[num+2]}" -eq 0 ]; then
Map[num+1]=2
Map[num]=0
Map[num+2]=3
elif [ "${Map[num+2]}" -eq 4 ]; then
Map[num+1]=2
Map[num]=0
Map[num+2]=6
fi
elif [ "${Map[num+1]}" -eq 4 ]; then
Map[num+1]=5
Map[num]=0
fi
;;
"s")
#下
if [ "${Map[num+9]}" -eq 0 ]; then
Map[num+9]=2
Map[num]=0
elif [ "${Map[num+9]}" -eq 3 ]; then
if [ "${Map[num+18]}" -eq 0 ]; then
Map[num+9]=2
Map[num]=0
Map[num+18]=3
elif [ "${Map[num+18]}" -eq 4 ]; then
Map[num+9]=2
Map[num]=0
Map[num+18]=6
fi
elif [ "${Map[num+9]}" -eq 4 ]; then
Map[num+9]=5
Map[num]=0
fi
;;
esac
}
while true #一直循环
do
clear #清除屏幕
echo "===================推箱子游戏=================="
echo "====规则:将☆全部推到◎处,即胜利, 推箱子: w:向上 s:向下 a:向左 d:向右 +回车===="
boxcount=0
ShowMap
Move
[ $boxcount -eq 0 ] && echo "you are win" && break
done