免费注册 查看新帖 |

Chinaunix

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

Shell 游戏:贪吃蛇 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-01 10:05 |只看该作者 |倒序浏览
  1. #!/bin/sh

  2. ## 区域内部的可活动的范围。此处可修改相应的值
  3. Width=50   # 偶数
  4. Height=15
  5. PadX=10
  6. PadY=5
  7. Speed="2"  # 1-9,值越小,速度越快

  8. ## 蛇起始位置
  9. ((SnakeX=PadX+Width/2))
  10. ((SnakeY=PadY+Height/2))
  11. ((ScoreX=PadX+Width/2-10))
  12. ((ScoreY=PadY-3))
  13. score=0
  14. SnakeHead="\033[41m@\033[0m"
  15. SnakeBody="\033[41m \033[0m"


  16. P1="\033[31mO\033[0m"
  17. P2="\033[32mO\033[0m"
  18. P3="\033[33mO\033[0m"
  19. P4="\033[34mO\033[0m"
  20. P5="\033[35mO\033[0m"
  21. P6="\033[36mO\033[0m"
  22. P7="\033[37mO\033[0m"

  23. PS=(" " $P1 $P2 $P3 $P4 $P5 $P6 $P7)
  24. PNum=${#PS[*]}


  25. clear
  26. function DrawBox(){
  27.    local XSmall XBig YSmall YBig
  28.    ((XSmall=PadX-2))
  29.    ((YSmall=PadY-1))
  30.    ((XBig=PadX+Width))
  31.    ((YBig=PadY+Height))
  32.    for((i=XSmall;i<=XBig;i+=2))  
  33.    do
  34.       echo -ne "\033[$YSmall;${i}H\033[42m[]\033[0m"
  35.       echo -ne "\033[$YBig;${i}H\033[42m[]\033[0m"
  36.    done

  37.    for((i=YSmall;i<=YBig;i++))   
  38.    do
  39.       echo -ne "\033[$i;${XSmall}H\033[42m[]\033[0m"
  40.       echo -ne "\033[$i;${XBig}H\033[42m[]\033[0m"
  41.    done
  42.    echo
  43.    echo
  44. }


  45. function CordToKey(){
  46.    local x y Max
  47.    Max=100
  48.    x=$1
  49.    y=$2
  50.    ((x+=Max))
  51.    ((y+=Max))
  52.    echo $x$y
  53. }

  54. function Values(){
  55.    local i j
  56.    for((i=PadX;i<=PadX+Width;i++))
  57.    do
  58.       for((j=PadY;j<=PadY+Height;j++))
  59.       do
  60.         values[`CordToKey $i $j`]="$i|$j"
  61.       done
  62.    done
  63. }

  64. function GameOver(){
  65.    local x y
  66.    ((x=PadX+Width/2-5))
  67.    ((y=PadY+Height+2))
  68.    echo -e "\033[$y;${x}H \033[32mGame Over!\033[0m\n\n"
  69.    kill  $PPID
  70.    MoveXYExit
  71. }

  72. function NewP(){                             
  73.    local x y p v
  74.    while :
  75.    do
  76.       ((x=RANDOM%Width+PadX))
  77.       ((y=RANDOM%Height+PadY))
  78.       v=${values[`CordToKey $x $y`]}
  79.       if [[ $v =~ "\|" ]];then
  80.          ((p=RANDOM%((PNum-1))+1))
  81.          echo -ne "\033[$y;${x}H${PS[$p]}"
  82.          values[`CordToKey $x $y`]="$p"
  83.          break
  84.       fi
  85.    done
  86. }

  87. function Moving(){                             
  88.    local X Y oldX oldY v i j sx sy
  89.    X=$1; Y=$2; oldX=$3; oldY=$4; v=$5
  90.    echo -ne "\033[$Y;${X}H$SnakeHead"         
  91.    values[`CordToKey $X $Y`]="snake"         
  92.    Snake $X $Y                             
  93.    echo -ne "\033[$oldY;${oldX}H$SnakeBody"   
  94.    if [[ ${#v} != 1 ]];then                  
  95.        for((i=0;i<${#SnakeValue[*]};i+=2))
  96.        do
  97.           if [ "${SnakeValue[$i]}" != "" ];then
  98.              ((j=i+1))
  99.              sx=${SnakeValue[$i]}
  100.              sy=${SnakeValue[$j]}
  101.              SnakeValue[$i]=""
  102.              SnakeValue[$j]=""
  103.              echo -ne "\033[$sy;${sx}H "         
  104.              values[`CordToKey $sx $sy`]="$sx|$sy"
  105.              break
  106.           fi
  107.        done
  108.    else
  109.        ((score+=v))
  110.        echo -ne "\033[$ScoreY;${ScoreX}H \033[32m Score: $score \033[0m"
  111.        NewP
  112.    fi

  113. }

  114. function Snake(){   
  115.     SnakeValue[${#SnakeValue[*]}]=$1
  116.     SnakeValue[${#SnakeValue[*]}]=$2
  117. }

  118. function MoveXY(){
  119.     local  sig oldX oldY v
  120.     Init

  121.     trap "sig=26" 26
  122.     trap "sig=27" 27
  123.     trap "sig=28" 28
  124.     trap "sig=29" 29
  125.     trap "MoveXYExit" 30

  126.     while :
  127.     do
  128.        oldX=$X
  129.        oldY=$Y

  130.        case $sig in   
  131.           28)((maxX=Width+PadX-1))
  132.               ((X++))
  133.               v=${values[`CordToKey $X $Y`]}
  134.               [[ $X -gt $maxX || "$v" == "snake" ]] && GameOver
  135.               ;;
  136.           29)((X--))
  137.               v=${values[`CordToKey $X $Y`]}
  138.               [[ $X -lt $PadX || "$v" == "snake" ]] && GameOver
  139.               ;;
  140.           27)((maxY=Height+PadY-1))
  141.               ((Y++))
  142.               v=${values[`CordToKey $X $Y`]}
  143.               [[ $Y -gt $maxY || "$v" == "snake" ]] && GameOver
  144.              ;;
  145.           26)((Y--))
  146.               v=${values[`CordToKey $X $Y`]}
  147.               [[ $Y -lt $PadY || "$v" == "snake" ]] && GameOver
  148.              ;;
  149.        esac
  150.        Moving $X $Y $oldX $oldY $v
  151.        sleep .$Speed
  152.     done
  153. }

  154. function Init(){
  155.     SnakeValue=()
  156.     DrawBox
  157.     Values
  158.     X=$SnakeX
  159.     Y=$SnakeY
  160.     Snake $X $Y
  161.     echo -ne "\033[$Y;${X}H$SnakeHead"
  162.     values[`CordToKey $X $Y`]="snake"
  163.     echo -ne "\033[$ScoreY;${ScoreX}H \033[32m Score: $score \033[0m"
  164.     NewP
  165.     NewP
  166.     NewP
  167. }

  168. function MoveXYExit(){
  169.     local y
  170.     ((y=PadY+Height+2))
  171.     echo -e "\033[?25h\033[${y};0H"
  172.     echo
  173.     exit
  174. }

  175. function MoveSnakeExit(){
  176.     kill -30 $pid
  177.     stty $sTTY
  178.     MoveXYExit
  179. }

  180. function MoveSnake(){
  181.     local key  sig
  182.     pid=$1
  183.     sTTY=`stty -g`
  184.     echo -ne "\033[?25l"   
  185.     trap "MoveSnakeExit" INT TERM
  186.     while :
  187.     do
  188.        sig=0
  189.        read -s -n 1 key
  190.        [[ "$key" == "A" ]] && sig=26   
  191.        [[ "$key" == "B" ]] && sig=27   
  192.        [[ "$key" == "C" ]] && sig=28   
  193.        [[ "$key" == "D" ]] && sig=29     
  194.        [[ "$key" == "q" ]] && MoveSnakeExit
  195.        [ $sig -ne 0 ] && kill -$sig  $pid
  196.    done
  197. }

  198. ## Main ##
  199. if [ "$1" == "MoveXY" ];then
  200.    MoveXY
  201. else
  202.    bash $0 MoveXY &
  203.    MoveSnake $!  2>/dev/null
  204. fi
复制代码
用法:用方向键移动蛇即可。
有个Bug:一开始蛇不会出现,按任意方向键蛇就可以出现了。
注意:不能回头。比如蛇往右移动时,则这时不能按往左的方向键。

tcs.jpg (25.73 KB, 下载次数: 243)

tcs.jpg

评分

参与人数 1可用积分 +10 收起 理由
xiaopan3322 + 10 感谢分享,运行完美,不介意我转载吧?

查看全部评分

论坛徽章:
0
2 [报告]
发表于 2011-08-01 10:24 |只看该作者
好东西,楼主不介意我转吧

论坛徽章:
0
3 [报告]
发表于 2011-08-01 10:30 |只看该作者
好东西,楼主不介意我转吧
where27 发表于 2011-08-01 10:24



    群里问了一些人,他们有的运行不了。你试试有没有问题

论坛徽章:
0
4 [报告]
发表于 2011-08-01 10:39 |只看该作者
回复 3# baoyu05


    能运行,只有颜色显示有问题,显示不了彩色

论坛徽章:
0
5 [报告]
发表于 2011-08-01 10:40 |只看该作者
{:3_183:}

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


测试环境:
bash --version
GNU bash, version 3.2.51(24)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.

因为没有clear命令,改为下面的echo,

    echo -e "\e[2J\e[1;1H".

主界面出来了,不过没法启动蛇头,按照你的提示,也没有出现

论坛徽章:
0
7 [报告]
发表于 2011-08-01 10:56 |只看该作者
回复  baoyu05


测试环境:
bash --version
GNU bash, version 3.2.51(24)-release (i686-pc-cygwin ...
yinyuemi 发表于 2011-08-01 10:44



总是有人运行不了,悲剧。我的bash   
[root@fc9 ~]# bash -version
GNU bash, version 3.2.33(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.

论坛徽章:
0
8 [报告]
发表于 2011-08-01 10:57 |只看该作者
我用的suse linux
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux)
Copyright (C) 2005 Free Software Foundation, Inc.

没问题得。强大。NB。

论坛徽章:
0
9 [报告]
发表于 2011-08-01 21:50 |只看该作者
回复  baoyu05


测试环境:
bash --version
GNU bash, version 3.2.51(24)-release (i686-pc-cygwin ...
yinyuemi 发表于 2011-08-01 10:44

你把第一行改成   #!/bin/bash 试一下,不知道你机器上的sh是不是符号链结

论坛徽章:
0
10 [报告]
发表于 2011-08-01 21:52 |只看该作者
金牙哥好猛
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP