免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8191 | 回复: 10
打印 上一主题 下一主题

Shell游戏:迷宫 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-10 01:36 |只看该作者 |倒序浏览
本帖最后由 baoyu05 于 2011-08-10 10:35 编辑
  1. #!/bin/bash


  2. Width=30  
  3. Height=15  
  4. PadX=10
  5. PadY=5


  6. P="\033[32mO\033[0m"
  7. PB="\033[4m\033[32mO\033[0m\033[0m"
  8. clear

  9. function DrawBox(){     
  10.    local i j inx iny outx outy
  11.    function DrawCell(){
  12.       local cell num  i
  13.       cell=$1; num=$2; str=""
  14.       for((i=1;i<=$num;i++));  do str=$str$cell; done
  15.       echo "$str"
  16.    }

  17.    Bank=`DrawCell ' '  $PadX  `           
  18.    Line=`DrawCell "|_" $Width `         
  19.    FirstLine=`DrawCell " _" $Width `
  20.    for((i=1;i<=$PadY;i++));do echo ;done  
  21.    echo "$Bank$FirstLine"                 
  22.    for((j=1;j<=$Height;j++)); do echo  "$Bank$Line|"; done

  23.    echo -ne "\033[$((PadY+2));$((PadX+1))H "
  24.    echo -ne "\033[$((PadY+Height+1));$((PadX+Width*2+1))H "
  25. }

  26. function CordToKey(){
  27.    local x y Max
  28.    Max=100
  29.    x=$1
  30.    y=$2
  31.    ((x+=Max))
  32.    ((y+=Max))
  33.    echo $x$y
  34. }

  35. function Values(){
  36.    local i j
  37.    for((i=PadX+2;i<=PadX+Width*2;i+=2))
  38.    do
  39.       for((j=PadY+2;j<=PadY+Height+1;j++))
  40.       do
  41.         values[`CordToKey $i $j`]="$i|$j"
  42.         buttom[`CordToKey $i $j`]="_"
  43.       done
  44.    done
  45. }


  46. function DirectionCK(){      
  47.     local X Y D newX newY
  48.     X=$1; Y=$2  
  49.     D=()

  50.     ((newY=Y-1))
  51.     [[ ${values[`CordToKey $X $newY`]} =~ "\|" && $X -ne $((PadX+Width*2)) && $X -ne  $((PadX+2)) ]] && D[${#D[*]}]=up

  52.     ((newX=X-2))
  53.     [[ ${values[`CordToKey $newX $Y`]} =~ "\|" && $Y -ne $((PadY+2)) && $Y -ne $((PadY+Height+1)) ]] && D[${#D[*]}]=left

  54.     ((newY=Y+1))
  55.     [[ ${values[`CordToKey $X $newY`]} =~ "\|" ]] && D[${#D[*]}]=down

  56.     ((newX=X+2))
  57.     [[ ${values[`CordToKey $newX $Y`]} =~ "\|" ]] && D[${#D[*]}]=right

  58.      echo ${D[*]}
  59. }

  60. function DirectionBack(){   
  61.     local k D Dtion Dirtion Dirtions
  62.     while :
  63.     do
  64.        X=${PathX[$step]}
  65.        Y=${PathY[$step]}
  66.        D=${PathD[$step]}
  67.        [[ ${cicle[`CordToKey $X $Y`]} == 1 ]] && { ((step--));continue;}
  68.        Dtion=(`DirectionCK $X $Y`)
  69.        Dirtion=${Dtion[@]%$D}
  70.        Dirtions=(`echo $Dirtion`)
  71.        ClearBack $step
  72.        cicle[`CordToKey $X $Y`]=1
  73.        [[ ${#Dirtions[*]} -gt 0 ]] && break
  74.        ((step--))
  75.     done
  76.     Direction=(`echo ${Dirtions[*]}`)
  77.     ((step--))
  78. }

  79. function CreatePath(){
  80.    local Wx Wy
  81.    PathX=()     
  82.    PathY=()     
  83.    PathD=()     
  84.    CWallX=()   
  85.    CWallY=()   
  86.    ClearWalls=()
  87.    step=-1      
  88.    ((X=PadX+2))
  89.    ((Y=PadY+2))
  90.    while :
  91.    do
  92.       Direction=(`DirectionCK $X $Y`)

  93.       [[ ${#Direction[*]} -eq 0 ]] && {
  94.              DirectionBack;
  95.       }
  96.       direction=${Direction[$RANDOM%${#Direction[*]}]}
  97.       oldX=$X
  98.       oldY=$Y
  99.       Wx=$X
  100.       Wy=$Y
  101.       ((step++))
  102.       case $direction in
  103.          up)((Y--))
  104.             ((Wy=Y))
  105.             ;;
  106.          down)((Y++))
  107.             ((Wy=Y-1))
  108.             ;;
  109.          left)((X-=2))
  110.             ((Wx=X+1))
  111.             ;;
  112.          right)((X+=2))
  113.             ((Wx=X-1))
  114.             ;;
  115.        esac
  116.        values[`CordToKey $oldX $oldY`]="path"
  117.        values[`CordToKey $Wx $Wy`]="nowall"
  118.        PathX[$step]=$oldX
  119.        PathY[$step]=$oldY
  120.        PathD[$step]=$direction
  121.        CWallX[$step]=$Wx
  122.        CWallY[$step]=$Wy
  123.        [[ $X -eq $((PadX+Width*2)) && $Y -eq $((PadY+Height+1)) ]] && break
  124.    done
  125.    ((step++))
  126.    [[ $X -eq $((PadX+Width*2)) ]] &&  ((Wy=Y-1))
  127.    [[ $Y -eq $((PadY+Height+1)) ]] && ((Wx=X-1))
  128.    CWallX[$step]=$Wx
  129.    CWallY[$step]=$Wy
  130. }

  131. function SetButtom(){
  132.     local n x y d
  133.     for((n=0;n<${#PathD[*]};n++))
  134.     do
  135.        x=${PathX[$n]}
  136.        y=${PathY[$n]}
  137.        d=${PathD[$n]}
  138.        [[ $d == "down" ]] && buttom[`CordToKey $x $y`]=""
  139.        ((y--))
  140.        [[ $d == "up" ]] &&  buttom[`CordToKey $x $y`]=""
  141.      done
  142. }

  143. function SideRoadCK(){
  144.    local X Y D newX newY
  145.    X=$1; Y=$2  
  146.    D=()

  147.    ((newY=Y-1))
  148.    [[ ${values[`CordToKey $X $newY`]} =~ "\|" ]] && D[${#D[*]}]=up

  149.    ((newX=X-2))
  150.    [[ ${values[`CordToKey $newX $Y`]} =~ "\|"  ]] && D[${#D[*]}]=left

  151.    ((newY=Y+1))
  152.    [[ ${values[`CordToKey $X $newY`]} =~ "\|" ]] && D[${#D[*]}]=down

  153.    ((newX=X+2))
  154.    [[ ${values[`CordToKey $newX $Y`]} =~ "\|" ]] && D[${#D[*]}]=right

  155.    echo ${D[*]}
  156. }


  157. function CreateSideRoad(){
  158.    local  loop num i p X Y Direction direction Wx Wy  oldX oldY
  159.    loop=0
  160.    SidePath=()
  161.    SideWall=()
  162.    num=${#PathX[*]}
  163.    while :
  164.    do
  165.       ((p=$RANDOM%num))
  166.       X=${PathX[$p]}
  167.       Y=${PathY[$p]}
  168.       ((loop++))
  169.       while :
  170.       do
  171.          oldX=$X
  172.          oldY=$Y
  173.          Wx=$X
  174.          Wy=$Y
  175.          Direction=(`SideRoadCK $X $Y`)
  176.          [ ${#Direction[*]} -eq 0 ] && break
  177.          direction=${Direction[$RANDOM%${#Direction[*]}]}
  178.          case $direction in
  179.              up)((Y--))
  180.                 ((Wy=Y))
  181.                 buttom[`CordToKey $X $Y`]=""
  182.                 ;;
  183.              down)((Y++))
  184.                 ((Wy=Y-1))
  185.                 buttom[`CordToKey $oldX $oldY`]=""
  186.                 ;;
  187.              left)((X-=2))
  188.                 ((Wx=X+1))
  189.                 ;;
  190.              right)((X+=2))
  191.                 ((Wx=X-1))
  192.                 ;;
  193.          esac
  194.          values[`CordToKey $oldX $oldY`]="sideroad"
  195.          values[`CordToKey $Wx $Wy`]="nowall"
  196.          SidePath[${#SidePath[*]}]=$oldX
  197.          SidePath[${#SidePath[*]}]=$oldY
  198.          SideWall[${#SideWall[*]}]=$Wx
  199.          SideWall[${#SideWall[*]}]=$Wy
  200.       done
  201.       [ $loop -eq 30 ] && break
  202.    done

  203. }

  204. function ClearBack(){
  205.     local s X Y d
  206.     s=$1
  207.     X=${PathX[$s]}
  208.     Y=${PathY[$s]}
  209.     d=${PathD[$s]}
  210.     values[`CordToKey $X $Y`]="$X|$Y"
  211.     unset PathX[$s]
  212.     unset PathY[$s]
  213.     unset PathD[$s]
  214.     unset CWallX[$s]
  215.     unset CWallY[$s]
  216. }

  217. function ClearWall(){
  218.     local i x y
  219.     for((i=0;i<$step;i++))
  220.     do
  221.        x=${CWallX[$i]}
  222.        y=${CWallY[$i]}
  223.        echo -ne "\033[$y;${x}H "
  224.     done
  225. }

  226. function ClearSideWall(){
  227.    local i j x y
  228.    for((i=0;i<${#SideWall[*]};i+=2))
  229.    do
  230.        ((j=i+1))
  231.        x=${SideWall[$i]}
  232.        y=${SideWall[$j]}
  233.        echo -ne "\033[$y;${x}H "
  234.    done

  235. }


  236. function MoveP(){
  237.     local X Y oldX oldY  B
  238.     X=$1; Y=$2; oldX=$3; oldY=$4

  239.     B="\033[4m \033[0m"

  240.     if [[ ${buttom[`CordToKey $oldX $oldY`]} == "_" ]];then
  241.          echo -e "\033[$oldY;${oldX}H$B"
  242.     else
  243.          echo -e "\033[$oldY;${oldX}H "
  244.     fi

  245.     if [[ ${buttom[`CordToKey $X $Y`]} == "_" ]];then
  246.          echo -e "\033[$Y;${X}H$PB"
  247.     else
  248.          echo -e "\033[$Y;${X}H$P"
  249.     fi
  250.     if [[ $X -eq $((PadX+Width*2)) && $Y -eq $((PadY+Height+1)) ]];then
  251.         ((WinX=PadX+Width/2))
  252.         ((WinY=PadY+Height+3))
  253.         echo -e "\033[$WinY;${WinX}H\033[31mCongratulation,You Pass!\033[0m"
  254.         Exit
  255.     fi
  256. }

  257. function MoveXY(){
  258.    local  D Wx Wy oldX oldY v b
  259.    D=$1
  260.    oldX=$MX
  261.    oldY=$MY
  262.    Wx=$MX
  263.    Wy=$MY
  264.    case $D in
  265.       x++)((Wx=MX+1))
  266.           v=${values[`CordToKey $Wx $Wy`]}
  267.           [[ $v != "nowall" || $MX -gt $((PadX+Width*2)) ]] && continue
  268.           ((MX+=2))
  269.           ;;
  270.       x--)((Wx=MX-1))
  271.           v=${values[`CordToKey $Wx $Wy`]}
  272.           [[ $v != "nowall" || $MX -lt $((PadX+2)) ]] && continue
  273.           ((MX-=2))
  274.           ;;
  275.       y++)b=${buttom[`CordToKey $MX $MY`]}
  276.           [[ $b == "_" || $MY -gt $((PadY+Height+1)) ]] && continue
  277.           ((MY++))
  278.           ;;
  279.       y--)((Wy=MY-1))
  280.           b=${buttom[`CordToKey $MX $Wy`]}
  281.           [[ $b == "_" || $MY -le $((PadY+2)) ]] && continue
  282.           ((MY--))
  283.           ;;
  284.     esac
  285.     MoveP $MX $MY $oldX $oldY
  286. }

  287. function Moving(){
  288.    ((MX=PadX+2))
  289.    ((MY=PadY+2))
  290.    if [[ ${buttom[`CordToKey $MX $MY`]} == "_" ]];then
  291.         echo -ne "\033[$MY;${MX}H$PB"
  292.    else
  293.         echo -ne "\033[$MY;${MX}H$P"
  294.    fi
  295.    sTTY=`stty -g`
  296.    echo -ne "\033[?25l"
  297.    trap "Exit" INT TERM
  298.    while :
  299.    do
  300.       read -s -n 1 key
  301.       [[ "$key" == "A" ]] && MoveXY y--
  302.       [[ "$key" == "B" ]] && MoveXY y++
  303.       [[ "$key" == "C" ]] && MoveXY x++
  304.       [[ "$key" == "D" ]] && MoveXY x--
  305.    done

  306. }
  307. function Exit(){
  308.   local x y
  309.   ((y=PadY+Height+5))
  310.   echo -e "\033[?25h\033[${y};0H"
  311.   stty $sTTY
  312.   echo -ne "\033[$y;0H"
  313.   exit
  314. }

  315. Values
  316. DrawBox
  317. CreatePath
  318. SetButtom
  319. CreateSideRoad
  320. ClearWall
  321. ClearSideWall
  322. Moving

复制代码
玩法:用方向键把小球移到右下角出口处即可。
注:迷宫地图生成比较慢,大约5秒左右,请耐心等候。

mg.jpg (38.25 KB, 下载次数: 68)

mg.jpg

评分

参与人数 1可用积分 +10 收起 理由
expert1 + 10 hao

查看全部评分

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-08-10 03:30 |只看该作者
回复 1# baoyu05


   GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
测试通过,大牛!!!

f.PNG (7.53 KB, 下载次数: 61)

f.PNG

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
3 [报告]
发表于 2011-08-10 08:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2011-08-10 08:56 |只看该作者
NB,LZ连续搞了2个游戏。。

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2014-03-27 15:44:382015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2011-08-10 09:11 |只看该作者
大神下凡

论坛徽章:
0
6 [报告]
发表于 2011-08-10 09:15 |只看该作者
强人啊

论坛徽章:
0
7 [报告]
发表于 2011-08-10 14:09 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2011-08-11 09:47 |只看该作者
GNU Bash-3.2

论坛徽章:
0
9 [报告]
发表于 2015-01-16 15:43 |只看该作者
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

论坛徽章:
0
10 [报告]
发表于 2015-01-16 18:43 |只看该作者
牛逼。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP