免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7757 | 回复: 16

Shell 游戏:彩色连珠 [复制链接]

论坛徽章:
0
发表于 2011-07-24 19:46 |显示全部楼层
本帖最后由 baoyu05 于 2011-07-25 02:17 编辑
  1. #!/bin/sh
  2. ######此处可修改相应的值######
  3. Width=20
  4. Height=15
  5. PadX=21
  6. PadY=5
  7. number=5       # 连续几个就可以消掉     
  8. PerNum=3       # 每次生成几个珠子   
  9. ((ScoreX=PadX+15))
  10. ((ScoreY=PadY-2))

  11. ###############

  12. P1="\033[31mO\033[0m"
  13. P2="\033[32mO\033[0m"
  14. P3="\033[33mO\033[0m"
  15. P4="\033[34mO\033[0m"
  16. P5="\033[35mO\033[0m"
  17. P6="\033[36mO\033[0m"
  18. P7="\033[37mO\033[0m"
  19. Pearls=($P1 $P2 $P3 $P4 $P5 $P6 $P7)
  20. PearlNum=${#Pearls[*]}
  21. score=0
  22. clear

  23. function DrawBox(){     
  24.    function DrawCell(){
  25.       local cell num  i
  26.       cell=$1; num=$2; str=""
  27.       for((i=1;i<=$num;i++));  do str=$str$cell; done
  28.       echo "$str"
  29.    }
  30.    Bank=`DrawCell ' '  $PadX  `         
  31.    Line=`DrawCell "|-" $Width `         
  32.    for((i=1;i<=$PadY;i++));do echo ;done  
  33.    for((j=1;j<=$Height;j++)); do echo  "$Bank$Line"; done
  34.    echo -ne "\033[$ScoreY;${ScoreX}HScore: $score"
  35. }

  36. function CordToKey(){
  37.    local x y Max
  38.    Max=100
  39.    x=$1
  40.    y=$2
  41.    ((x+=Max))
  42.    ((y+=Max))
  43.    echo $x$y
  44. }
  45. function Value(){
  46.    local i j
  47.    for((i=$PadX+1;i<=$PadX+Width*2;i+=2))
  48.    do
  49.       for((j=$PadY;j<=$PadY+$Height;j++))
  50.       do
  51.         values[`CordToKey $i $j`]="$i|$j"
  52.       done
  53.    done
  54. }

  55. function FindPearl(){
  56.     local  PosX PosY XBig YBig XSmall YSmall  type numx numy i j hold bx by dnum
  57.     PosX=$1   
  58.     PosY=$2   
  59.     type=$3   
  60.     hold=()
  61.     ((dnum=number*2))  
  62.     FoundedPearl=()

  63.     ((numx=((number-1))*2))
  64.     ((numy=number-1))      

  65.     ((XSmall=PosX-numx))
  66.     ((XBig=PosX+numx))
  67.     ((YSmall=PosY-numy))
  68.     ((YBig=PosY+numy))

  69.     function PealDispel(){
  70.         local  x y same
  71.         x=$1
  72.         y=$2
  73.         same=0
  74.         [[ ${values[`CordToKey $x $y`]} == $type ]] && same=1
  75.         [[ $same == 1 ]] && { hold[${#hold[*]}]=$x; hold[${#hold[*]}]=$y; }
  76.         [[ $same == 0 && ${#hold[*]} -lt   $dnum ]] && hold=()
  77.         [[ $same == 0 && ${#hold[*]} -ge $dnum ]] && break
  78.     }

  79.     hold=()
  80.     for((i=$XSmall;i<=$XBig;i+=2))                       
  81.     do
  82.         PealDispel $i $PosY
  83.     done
  84.     FoundedPearl=(${FoundedPearl[*]} ${hold[*]})

  85.     hold=()
  86.     for((i=$XSmall,j=$YBig;i<=$XBig,j>=$YSmall;i+=2,j--))
  87.     do
  88.         PealDispel  $i $j
  89.     done
  90.     FoundedPearl=(${FoundedPearl[*]} ${hold[*]})
  91.     hold=()

  92.     for((j=$YSmall;j<=$YBig;j++))                        
  93.     do
  94.         PealDispel  $PosX $j
  95.     done
  96.     FoundedPearl=(${FoundedPearl[*]} ${hold[*]})

  97.     hold=()
  98.     for((i=$XSmall,j=$YSmall;i<=$XBig,j<=$YBig;i+=2,j++))
  99.     do
  100.         PealDispel $i $j
  101.     done
  102.     FoundedPearl=(${FoundedPearl[*]} ${hold[*]})

  103.     if [[ ${#FoundedPearl[*]} -ge  $dnum ]];then

  104.       for((m=0;m<${#FoundedPearl[*]};m+=2))            
  105.       do
  106.           ((n=m+1))
  107.           echo -ne "\033[${FoundedPearl[$n]};${FoundedPearl[$m]}H\033[41m${Pearls[$type]}\033[0m"
  108.       done
  109.       sleep .2

  110.       for((f=0;f<${#FoundedPearl[*]};f+=2))            
  111.       do
  112.           ((h=f+1))
  113.           bx=${FoundedPearl[$f]}
  114.           by=${FoundedPearl[$h]}
  115.           echo -e "\033[$by;${bx}H|"
  116.           values[`CordToKey $bx $by`]="$bx|$by"
  117.       done
  118.       ((score+=${#FoundedPearl[*]}/2-number+1))
  119.       echo -ne "\033[$ScoreY;${ScoreX}HScore: $score"
  120.    fi

  121. }


  122. function NewPearl(){
  123.     local newX newY loop key
  124.     loop=0
  125.     GameOver
  126.     while :
  127.     do
  128.        ((newX=$RANDOM%Width*2+PadX+1))
  129.        ((newY=$RANDOM%Height+PadY+1))
  130.        key=`CordToKey $newX $newY`
  131.        if [[ ${#values[$key]} -ne 1 ]];then
  132.            ((loop++))
  133.            ((pnum=$RANDOM%$PearlNum))      
  134.            p=${Pearls[$pnum]}               
  135.            values[$key]="$pnum"            
  136.            echo -ne "\033[$newY;${newX}H$p"
  137.            FindPearl $newX $newY $pnum      
  138.            sleep .1
  139.        else
  140.            continue
  141.        fi
  142.        if((loop==PerNum));then              
  143.            X=$newX                          
  144.            Y=$newY
  145.            echo -ne "\033[$Y;${X}H"
  146.            break;
  147.        fi
  148.     done
  149. }

  150. function IfNew(){
  151.     local ifP
  152.     ifP=${values[`CordToKey $X $Y`]}
  153.     if [[ $NewP == 1 && ${#ifP} != 1 ]];then     
  154.        NewPearl
  155.     elif [[ $NewP == 1 && ${#ifP} == 1 ]];then   
  156.        downP=$ifP                              
  157.        MoveingP="${Pearls[$ifP]}"              
  158.        values[`CordToKey $X $Y`]="$X|$Y"      
  159.        MoveP=1
  160.        NewP=0
  161.     elif [[ $NewP == 0 && ${#ifP} != 1 ]];then   
  162.        echo -ne "\033[$Y;${X}H$MoveingP"
  163.        values[`CordToKey $X $Y`]=$downP
  164.        FindPearl $X $Y $downP                    
  165.        NewP=1
  166.        MoveP=0
  167.        sleep .2
  168.        NewPearl
  169.     fi
  170. }

  171. function GameOver(){
  172.      local num i x y v
  173.      num=1
  174.      for i in ${values[*]}
  175.      do
  176.         [[ $i =~ "\|" ]] && ((num++))
  177.      done
  178.      if ((num<PerNum+Height+Width));then
  179.         ((x=PadX+Width/2))
  180.         ((y=PadY+Height+2))
  181.         echo -e "\033[$y;${x}H \033[32mGame Over!\033[0m"
  182.         sleep .5
  183.         exit
  184.      fi
  185. }

  186. function MoveXY(){
  187.     local  Direction oldX oldY length
  188.     Direction=$1
  189.     oldX=$X
  190.     oldY=$Y
  191.     case $Direction in
  192.        x++)((maxX=Width*2+PadX))
  193.            ((X+=2))
  194.            length=${values[`CordToKey $X $Y`]}
  195.            if [[ $X -ge $maxX ]] || [[ ${#length} == 1 && $MoveP == 1 ]];then
  196.               ((X-=2))
  197.               continue
  198.            fi
  199.            ;;
  200.        x--)((X-=2))
  201.            length=${values[`CordToKey $X $Y`]}
  202.            if [[ $X -le $PadX ]] || [[ ${#length} == 1 && $MoveP == 1 ]];then
  203.               ((X+=2))
  204.               continue
  205.            fi
  206.            ;;
  207.        y++)((maxY=Height+PadY+1))
  208.            ((Y++))
  209.            length=${values[`CordToKey $X $Y`]}
  210.            if [[ $Y -ge $maxY ]] || [[ ${#length} == 1 && $MoveP == 1 ]] ;then
  211.               ((Y--))
  212.               continue
  213.            fi
  214.           ;;
  215.        y--)((Y--))
  216.            length=${values[`CordToKey $X $Y`]}
  217.            if [[ $Y -le $PadY ]] || [[ ${#length} == 1 && $MoveP == 1 ]];then
  218.               ((Y++))
  219.               continue
  220.            fi
  221.           ;;
  222.     esac
  223.     [ $MoveP == 0 ] && echo -ne "\033[$Y;${X}H"
  224.     [ $MoveP == 1 ] && {                       
  225.         echo -ne "\033[$oldY;${oldX}H|"
  226.         echo -ne "\033[$Y;${X}H$MoveingP"
  227.     }
  228. }

  229. function Move(){
  230.     local key curP
  231.     DrawBox
  232.     Value
  233.     NewPearl
  234.     NewP=1   
  235.     MoveP=0   
  236.     while :
  237.     do
  238.        read -s -n 1 key
  239.        [[ "$key" == "A" ]] && MoveXY y--
  240.        [[ "$key" == "B" ]] && MoveXY y++
  241.        [[ "$key" == "C" ]] && MoveXY x++
  242.        [[ "$key" == "D" ]] && MoveXY x--
  243.        [[ "[$key]" == "[]" ]] && IfNew
  244.    done
  245. }
  246. Move
复制代码
相同颜色的珠子,移动排成一条直线(水平方向,值方向,斜线方向,反斜线方向),即可消除并得分。消掉越多得分越多。
空格:选择珠子,再敲空格则落下珠子
方向键:移动光标和珠子

游戏截图

游戏截图

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-24 23:20 |显示全部楼层
回复 1# baoyu05

先赞一个!!

    第31行代码报错:
s.sh: line 31: ((: i<=: syntax error: operand expected (error token is "=")

另外,我运行了下,有的圈圈跑到网格右边的空白处了,

论坛徽章:
0
发表于 2011-07-24 23:26 |显示全部楼层
回复 2# yinyuemi


    汗,你是什么环境?
[root@fc9 ~]# bash --version
bash --version
GNU bash, version 3.2.33(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
echo -ne "\033]0;${USER}@${HOSTNAME%%.*}{PWD/#$HOME/~}"; echo -ne "\007"
[root@fc9 ~]#

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-24 23:27 |显示全部楼层
回复  yinyuemi


    汗,你是什么环境?
[root@fc9 ~]# bash --version
bash --version
GNU bash, ...
baoyu05 发表于 2011-07-24 23:26



    bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

论坛徽章:
0
发表于 2011-07-24 23:38 |显示全部楼层
回复 4# yinyuemi


我不清楚是不是版本的问题

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-07-24 23:46 |显示全部楼层
本帖最后由 yinyuemi 于 2011-07-25 00:05 编辑

回复 5# baoyu05


    第34行的改成下面的可以了
   Bank=`DrawCell " " $PadX  `
-----------------------

    晕,是我copy代码时出的错,你的程序没问题,擦。

论坛徽章:
1
双子座
日期:2013-10-17 00:46:45
发表于 2011-07-25 00:49 |显示全部楼层
额。。。试了几台机器都是一执行脚本立马就 game over !了,也没有报错。。。

论坛徽章:
0
发表于 2011-07-25 02:23 |显示全部楼层
回复 7# xrzs1986


    不会吧?
是不是你改了参数,并且改的不合理.
截图我看看

论坛徽章:
0
发表于 2011-07-25 17:19 |显示全部楼层
我试了几个机器也是game over,没有报错

GNU bash, version 3.2.51(1)-release (i586-suse-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

论坛徽章:
0
发表于 2011-07-25 19:29 |显示全部楼层
回复 1# baoyu05


    奇怪为什么都有问题呢?我自己玩都没有问题
未命名.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP