好久没写到一个让自已比较满意的代码了。这个代码比较满意了,不过看起来会比较费劲些:
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 "==推箱子游戏== 规则:将☆全推到◎处,即胜利, 移动: 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