【SHELL】推箱子游戏

好久没写到一个让自已比较满意的代码了。这个代码比较满意了,不过看起来会比较费劲些: 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值