Board logo

标题: [转载代码] Linux Shell脚本小游戏:是男人就下一百层 [打印本页]

作者: find    时间: 2012-1-16 11:40     标题: Linux Shell脚本小游戏:是男人就下一百层

说明:j,k 控制小人,q 退出,c 失败后继续;
== 表示楼梯(可踩),oo表示浮云(踩空),++表示针刺(每帧2点血伤害);
每8个楼梯得1分,若血不满,同时加2点血;
小人有10点血,被夹在顶层或坠落的话,死翘翘,游戏失败。
  1. #!/bin/bash
  2. # Stage
  3. Width=44
  4. Height=20
  5. BorderTop=2
  6. BorderLeft=6
  7. ((BorderRight=Width-8))
  8. ((BorderBtm=Height+2))
  9. Padding=""
  10. # Stair
  11. StairWidth=10
  12. StairX=(0)
  13. StairY=(0)
  14. StairZ=(0) # 1-=== 2-ooo 3-+++
  15. HeadItem=0
  16. StairNum=8
  17. StairSpace=0
  18. StairYSpeed=-1
  19. # Player
  20. Player=":)"
  21. PlayerWidth=2
  22. PlayerXPos=0
  23. ((PlayerYPos=Height+1))
  24. PlayerXSpeed=0
  25. PlayerYSpeed=-1
  26. Life=10
  27. # System
  28. ((InfoX=Width+5))
  29. Count=0
  30. CurCount=0
  31. Score=0
  32. Level=1
  33. SleepTime=100000
  34. Stty=" "
  35. sig=0
  36. # Color
  37. Normal="\033[0m"
  38. Red="\033[1;41m"
  39. Red2="\033[7;31;47m"
  40. Green="\033[1;37;42m"
  41. Brown="\033[1;43m"
  42. FRed="\033[1;31m"
  43. FBlue="\033[1;34m"
  44. FPurple="\033[1;35m"
  45. FChing="\033[1;36m"
  46. FBold="\033[1m"
  47. function DrawStage(){
  48.   local PaddingLen i
  49.   Item="$Normal    $Green[]$Normal"
  50.   ((PaddingLen=Width-4))
  51.   for((i=1;i<=PaddingLen;i+=2))
  52.   do
  53.     Padding=$Padding"  "
  54.   done
  55.   Item=$Item$Padding"$Green[]$Normal"
  56.   DrawBlood
  57.   tput cup 2 4
  58.   echo -e "$Green[]$Normal VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV $Green[]$Normal"
  59.   for((i=1;i<Height;i++))
  60.   do
  61.     echo -e "$Item"
  62.   done
  63.   tput cup 3 $InfoX
  64.   echo -e "$FPurple Score  $Normal"
  65.   tput cup 4 $InfoX
  66.   echo -e "$FBlue $Score  $Normal"
  67.   tput cup 5 $InfoX
  68.   echo -e "$FPurple Level  $Normal"
  69.   tput cup 6 $InfoX
  70.   echo -e "$FBlue $Level  $Normal"
  71.   tput cup 8 $InfoX
  72.   echo -e "$FPurple LEFT $Normal"
  73.   tput cup 9 $InfoX
  74.   echo -e "$FBlue J $Normal"
  75.   tput cup 10 $InfoX
  76.   echo -e "$FPurple RIGHT $Normal"
  77.   tput cup 11 $InfoX
  78.   echo -e "$FBlue K $Normal"
  79.   tput cup 12 $InfoX
  80.   echo -e "$FPurple EXIT $Normal"
  81.   tput cup 13 $InfoX
  82.   echo -e "$FBlue Q $Normal"
  83. }
  84. function ScoreRefresh(){
  85.   tput cup 4 $InfoX
  86.   echo -e "$FBlue $Score  $Normal"
  87. }
  88. function LevelRefresh(){
  89.   tput cup 6 $InfoX
  90.   echo -e "$FBlue $Level  $Normal"
  91. }
  92. function ScreenRefresh(){
  93.   local i
  94.   for((i=3;i<BorderBtm;i++))
  95.   do
  96.         tput cup $i 6
  97.     echo "$Padding"
  98.   done
  99. }
  100. function IsReduceLife(){
  101.   [[ $1 -eq 3 ]] && ((Life--)) && DrawBlood
  102. }
  103. function DrawBlood(){
  104.   local i blood=" "
  105.   for((i=0;i<Life;i++))
  106.   do
  107.         blood=$blood"  "
  108.   done
  109.   tput cup 0 4
  110.   echo "$Normal                        "
  111.   tput cup 0 4
  112.   echo -e "$Brown Life $Red2$blood$Normal"
  113. }
  114. function ProduceStair(){ # param:Index
  115.   ((StairX[$1]=RANDOM%15))
  116.   ((StairX[$1]=StairX[$1]*2+6))
  117.   ((StairY[$1]=BorderBtm))
  118.   ((StairZ[$1]=RANDOM%6))
  119.   [[ StairZ[$1] -eq 0 ]] || [[ StairZ[$1] -eq 4 ]] || [[ StairZ[$1] -eq 5 ]] && ((StairZ[$1]=1))
  120. }
  121. function DrawStair(){ # param: Index
  122.   tput cup ${StairY[$1]} ${StairX[$1]}
  123.   case ${StairZ[$1]} in
  124.   1)  echo -e "$FBold==========$Normal"
  125.   ;;
  126.   2)  echo -e $FChing"oooooooooo$Normal"
  127.   ;;
  128.   3)  echo -e "$FRed++++++++++$Normal"
  129.   ;;
  130.   esac
  131. }
  132. function DrawPlayer(){
  133.   tput cup $PlayerYPos $PlayerXPos
  134.   echo -e $Brown"$Player"$Normal
  135. }
  136. # debug
  137. function ArrayList(){
  138.   local i
  139.   echo =================
  140.   for((i=0;i<StairNum;i++))
  141.   do  
  142.     echo ${StairX[$i]} ${StairY[$i]} ${StairZ[$i]}
  143.   done
  144.   echo =================
  145. }
  146. function GameInit(){
  147.   clear
  148.   Stty=`stty -g`
  149.   echo -ne "\033[?25l"
  150.   stty -echo
  151.   DrawStage
  152.   ((StairX[0]=RANDOM%15))
  153.   ((StairX[0]=StairX[0]*2+6))
  154.   ((StairY[0]=BorderBtm))
  155.   ((StairZ[0]=1))
  156.   ((PlayerXPos=StairX[0]+4))
  157. }
  158. function GameExit(){
  159.   sleep 0.5
  160.   echo -e "\033[?25h\033[${y};0H"
  161.   stty $Stty
  162.   clear
  163.   exit 0
  164. }
  165. function GameOver(){
  166.   tput cup 10 18
  167.   echo -e "$Red   GAME  OVER   $Normal"
  168.   tput cup 11 18
  169.   echo -e "$Red                $Normal"
  170.   tput cup 12 18
  171.   echo -e "$Red Exit(q)        $Normal"
  172.   tput cup 13 18
  173.   echo -e "$Red Continue(c)    $Normal"
  174.   tput cup 14 18
  175.   echo -e "$Red                $Normal"
  176.   exit 0
  177. }
  178. function GameClear(){
  179.   tput cup 10 18
  180.   echo -e "$Red    ALL  CLEAR    $Normal"
  181.   tput cup 11 18
  182.   echo -e "$Red                  $Normal"
  183.   tput cup 12 18
  184.   echo -e "$Red YOU ARE SUPERMAN $Normal"
  185.   tput cup 13 18
  186.   echo -e "$Red CONGRATULATIONS! $Normal"
  187.   tput cup 14 18
  188.   echo -e "$Red                  $Normal"
  189.   exit 0
  190. }
  191. function GetCount(){
  192.   [[ StairX[$HeadItem] -eq 0 ]] && ProduceStair $HeadItem
  193.   ((HeadItem++))
  194.   [[ HeadItem -eq StairNum ]] && !((HeadItem=0)) && ((Score+=1)) && ScoreRefresh \
  195.   && [[ Score%5 -eq 0 ]] && ((Level++)) && ((SleepTime-=1000)) && LevelRefresh \
  196.   && [[ Life -lt 10 ]] && ((Life+=2)) && [[ Life -gt 10 ]] && ((Life=10)) && DrawBlood
  197.   ((Count=RANDOM%2))
  198.   [[ $Count -eq 0 ]] && ((Count=2))
  199.   [[ $Count -eq 1 ]] && ((Count=4))
  200. }
  201. function DataProcess(){
  202.   [[ Count -eq CurCount ]] && !((CurCount=0)) && GetCount
  203.   ((CurCount++))
  204.   [[ Life -eq 0 ]] && GameOver
  205.   [[ SleepTime -eq 0 ]] && GameClear
  206.   # Player Process
  207.   [[ PlayerXPos -eq BorderLeft ]] && [[ sig -eq 27 ]] && ((PlayerXSpeed=2)) && Player=":)"
  208.   [[ PlayerXPos -eq BorderLeft ]] && [[ sig -eq 26 ]] && ((PlayerXSpeed=0)) && ((sig=0))
  209.   [[ PlayerXPos -eq Width ]] && [[ sig -eq 26 ]] && ((PlayerXSpeed=-2)) && Player="(:"
  210.   [[ PlayerXPos -eq Width ]] && [[ sig -eq 27 ]] && (( PlayerXSpeed=0)) && ((sig=0))
  211.   ((PlayerXPos+=PlayerXSpeed))
  212.   ((PlayerYPos+=PlayerYSpeed))
  213.   [[ PlayerYPos -eq BorderTop ]] || [[ PlayerYPos -eq BorderBtm ]] && !((Life=0)) && DrawBlood && GameOver
  214.   DrawPlayer
  215.   # Stairs Process
  216.   for((i=0;i<StairNum;i++))
  217.   do
  218.         [[ StairX[$i] -ne 0 ]] && ((StairY[$i]-=1)) && [[ StairY[$i] -gt BorderTop ]] && DrawStair $i
  219.         [[ StairY[$i] -eq BorderTop ]] && !((StairX[$i]=0)) && !((StairY[$i]=0)) && !((StairZ[$i]=0))
  220.   done
  221.   # Collision Process
  222.   PlayerYSpeed=1
  223.   for((i=0;i<StairNum;i++))
  224.   do
  225.         [[ StairX[$i] -ne 0 ]] && [[ PlayerXPos -ge StairX[$i] ]] && [[ PlayerXPos -le StairX[$i]+8 ]] \
  226.         && [[ PlayerYPos+1 -eq StairY[$i] ]] && [[ StairZ[$i] -ne 2 ]] && ((PlayerYSpeed=-1)) \
  227.         && IsReduceLife ${StairZ[$i]} && break
  228.   done
  229. }
  230. function GameRun(){
  231.   trap "sig=26" 26
  232.   trap "sig=27" 27
  233.   trap "sig=28" 28
  234.   while :
  235.   do
  236.         case $sig in
  237.         26) ((PlayerXSpeed=-2)) && Player="(:"
  238.         ;;
  239.         27) ((PlayerXSpeed=2)) && Player=":)"
  240.         ;;
  241.         28)        exit 0
  242.         ;;
  243.         esac
  244.         #sig=0
  245.         ScreenRefresh
  246.         DataProcess
  247.         usleep $SleepTime
  248.   done
  249. }
  250. GameInit
  251. # background process
  252. {
  253.   GameRun
  254. } &
  255. # main function
  256. while read -s -n 1 Key
  257. do
  258.   case $Key in
  259.   [jJ]) kill -26 $! > /dev/null 2>&1
  260.   ;;
  261.   [kK]) kill -27 $! > /dev/null 2>&1
  262.   ;;
  263.   [cC]) if [ -z "`ps x | grep $! | grep -v "grep $!" | awk '{print $1}'`" ]
  264.                 then
  265.                 {
  266.                   GameRun
  267.                 } &
  268.             fi
  269.   ;;
  270.   [qQ]) kill -28 $! > /dev/null 2>&1
  271.             GameExit
  272.   ;;
  273.   *)
  274.   ;;
  275.   esac
  276. done
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2