[转帖]贪吃蛇小游戏_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3877 | 回复: 0   主题: [转帖]贪吃蛇小游戏        下一篇 
yang.liu
注册用户
等级:少校
经验:1182
发帖:77
精华:1
注册:2014-1-3
状态:离线
发送短消息息给yang.liu 加好友    发送短消息息给yang.liu 发消息
发表于: IP:您无权察看 2014-1-9 9:47:50 | [全部帖] [楼主帖] 楼主

  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.       
  38.       for((i=YSmall;i<=YBig;i++)) 
  39.       do
  40. echo -ne "\033[$i;${XSmall}H\033[42m[]\033[0m"
  41. echo -ne "\033[$i;${XBig}H\033[42m[]\033[0m"
  42.       done
  43.       echo
  44.       echo
  45. }
  46. function CordToKey(){ 
  47.       local x y Max
  48.       Max=100
  49.       x=$1
  50.       y=$2
  51.       ((x+=Max))
  52.       ((y+=Max))
  53.       echo $x$y
  54. }
  55. function Values(){ 
  56.       local i j
  57.       for((i=PadX;i<=PadX+Width;i++))
  58.       do
  59.       for((j=PadY;j<=PadY+Height;j++))
  60.       do
  61.       values[`CordToKey $i $j`]="$i|$j"
  62.       done
  63.       done
  64. }
  65. function GameOver(){
  66.       local x y
  67.       ((x=PadX+Width/2-5))
  68.       ((y=PadY+Height+2))
  69. echo -e "\033[$y;${x}H \033[32mGame Over!\033[0m\n\n"
  70.       kill $PPID
  71.       MoveXYExit
  72. }
  73. function NewP(){ 
  74.       local x y p v
  75.       while :
  76.       do
  77.       ((x=RANDOM%Width+PadX))
  78.       ((y=RANDOM%Height+PadY))
  79. v=${values[`CordToKey $x $y`]}
  80.       if [[ $v =~ "\|" ]];then
  81.       ((p=RANDOM%((PNum-1))+1))
  82. echo -ne "\033[$y;${x}H${PS[$p]}"
  83.       values[`CordToKey $x $y`]="$p"
  84.       break
  85.       fi
  86.       done
  87. }
  88. function Moving(){ 
  89.       local X Y oldX oldY v i j sx sy
  90.       X=$1; Y=$2; oldX=$3; oldY=$4; v=$5
  91. echo -ne "\033[$Y;${X}H$SnakeHead" 
  92.       values[`CordToKey $X $Y`]="snake" 
  93.       Snake $X $Y 
  94. echo -ne "\033[$oldY;${oldX}H$SnakeBody" 
  95. if [[ ${#v} != 1 ]];then 
  96. for((i=0;i<${#SnakeValue[*]};i+=2))
  97.       do
  98. if [ "${SnakeValue[$i]}" != "" ];then
  99.       ((j=i+1))
  100. sx=${SnakeValue[$i]}
  101. sy=${SnakeValue[$j]}
  102.       SnakeValue[$i]=""
  103.       SnakeValue[$j]=""
  104. echo -ne "\033[$sy;${sx}H " 
  105.       values[`CordToKey $sx $sy`]="$sx|$sy" 
  106.       break
  107.       fi
  108.       done
  109.       else
  110.       ((score+=v))
  111. echo -ne "\033[$ScoreY;${ScoreX}H \033[32m Score: $score \033[0m"
  112.       NewP
  113.       fi
  114.       
  115. }
  116. function Snake(){ 
  117. SnakeValue[${#SnakeValue[*]}]=$1
  118. SnakeValue[${#SnakeValue[*]}]=$2
  119. }
  120. function MoveXY(){ 
  121.       local sig oldX oldY v
  122.       Init
  123.       
  124.       trap "sig=26" 26
  125.       trap "sig=27" 27
  126.       trap "sig=28" 28
  127.       trap "sig=29" 29
  128.       trap "MoveXYExit" 30
  129.       
  130.       while :
  131.       do
  132.       oldX=$X
  133.       oldY=$Y
  134.       
  135.       case $sig in 
  136.       28)((maxX=Width+PadX-1))
  137.       ((X++))
  138. v=${values[`CordToKey $X $Y`]}
  139.       [[ $X -gt $maxX || "$v" == "snake" ]] && GameOver
  140.       ;;
  141.       29)((X--))
  142. v=${values[`CordToKey $X $Y`]}
  143.       [[ $X -lt $PadX || "$v" == "snake" ]] && GameOver
  144.       ;;
  145.       27)((maxY=Height+PadY-1))
  146.       ((Y++))
  147. v=${values[`CordToKey $X $Y`]}
  148.       [[ $Y -gt $maxY || "$v" == "snake" ]] && GameOver
  149.       ;;
  150.       26)((Y--))
  151. v=${values[`CordToKey $X $Y`]}
  152.       [[ $Y -lt $PadY || "$v" == "snake" ]] && GameOver
  153.       ;;
  154.       esac
  155.       Moving $X $Y $oldX $oldY $v
  156.       sleep .$Speed
  157.       done
  158. }
  159. function Init(){
  160.       SnakeValue=()
  161.       DrawBox
  162.       Values
  163.       X=$SnakeX
  164.       Y=$SnakeY
  165.       Snake $X $Y
  166. echo -ne "\033[$Y;${X}H$SnakeHead"
  167.       values[`CordToKey $X $Y`]="snake"
  168. echo -ne "\033[$ScoreY;${ScoreX}H \033[32m Score: $score \033[0m"
  169.       NewP
  170.       NewP
  171.       NewP
  172. }
  173. function MoveXYExit(){
  174.       local y
  175.       ((y=PadY+Height+2))
  176. echo -e "\033[?25h\033[${y};0H"
  177.       echo
  178.       exit
  179. }
  180. function MoveSnakeExit(){
  181.       kill -30 $pid
  182.       stty $sTTY
  183.       MoveXYExit
  184. }
  185. function MoveSnake(){
  186.       local key sig
  187.       pid=$1
  188.       sTTY=`stty -g`
  189.       echo -ne "\033[?25l" 
  190.       trap "MoveSnakeExit" INT TERM
  191.       while :
  192.       do
  193.       sig=0
  194.       read -s -n 1 key
  195.       [[ "$key" == "A" ]] && sig=26 
  196.       [[ "$key" == "B" ]] && sig=27 
  197.       [[ "$key" == "C" ]] && sig=28 
  198.       [[ "$key" == "D" ]] && sig=29 
  199.       [[ "$key" == "q" ]] && MoveSnakeExit 
  200.       [ $sig -ne 0 ] && kill -$sig $pid 
  201.       done
  202. }
  203. ## Main ##
  204. if [ "$1" == "MoveXY" ];then
  205. MoveXY
  206. else
  207. bash $0 MoveXY &
  208. MoveSnake $! 2>/dev/null
  209. fi



用法:用方向键移动蛇即可。
有个Bug:一开始蛇不会出现,按任意方向键蛇就可以出现了。
注意:不能回头。比如蛇往右移动时,则这时不能按往左的方向键。

北京联动北方科技有限公司



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论