貪吃蛇

這個是用shell腳步寫的貪吃蛇,覺的好就放在上面了。這個是我的同學寫的

  1. #!/bin/bash  
  2.    
  3. function DetectInput  
  4. {   
  5. while [[ 1 ]]; do  
  6.    
  7.   c="" 
  8.   read -n 1 c  
  9.   echo -ne "\r \r"  
  10.    
  11.   if [[ $c == "a" || $c == "j" || $c == "A" || $c == "J" ]]; then  
  12.     kill -36 $pidShowSnake  
  13.   elif [[ $c == "w" || $c == "i" || $c == "W" || $c == "I" ]]; then  
  14.     kill -37 $pidShowSnake  
  15.   elif [[ $c == "d" || $c == "l" || $c == "D" || $c == "L" ]]; then  
  16.     kill -38 $pidShowSnake  
  17.   elif [[ $c == "s" || $c == "k" || $c == "S" || $c == "K" ]]; then  
  18.     kill -39 $pidShowSnake  
  19.   elif [[ $c == "q" || $c == "Q" ]]; then  
  20.     echo Quit.  
  21.     kill -40 $pidShowSnake  
  22.     exit  
  23.   fi  
  24. done  
  25. }  
  26.    
  27. function AllExit  
  28. {  
  29.   kill -40 $pidShowSnake  
  30.   exit  
  31. }  
  32.    
  33. if [[ $1 != "--showsnake" ]]; then  
  34.   eval $0" --showsnake "$$"&"  
  35.   trap "exit" TERM  
  36.   trap "AllExit" INT  
  37.   pidShowSnake=$!  
  38.   DetectInput  
  39.   exit  
  40. else  
  41.   pidCtlSnake=$2  
  42. fi  
  43.    
  44. echo sub  
  45. iSpeed=500   
  46. #time interval in millisecond  
  47.    
  48. iDirection=0 
  49. #1-left, 2-up, 3-right, 4-down  
  50.    
  51. iWidth=15 
  52. iHeight=15 
  53. iX=(6 7 8)  
  54. iY=(7 7 7)  
  55. iMap=()  
  56. iS=0 
  57. #Start pointer in iX  
  58. (( iTotalBox = iWidth * iHeight ))  
  59.    
  60. for (( i = 0; i < iTotalBox; i++ ))  
  61. do  
  62.   (( iMap[$i] = 0 ))  
  63. done  
  64.    
  65. function RandomHeader  
  66. {  
  67.   (( iNew = RANDOM % ( iTotalBox - ${#iX[@]} ) ))  
  68.   for (( iNewP = 0i = 0; iNewP < iTotalBox && i < iNew; iNewP++))  
  69.   do  
  70.     if (( ${iMap[$iNewP]} != 1 )); then (( i++ )); fi  
  71.   done  
  72.    
  73.   while (( ${iMap[$iNewP]} == 1 )); do (( iNewP++ )); done  
  74.   (( iNewX = iNewP % iWidth ))  
  75.   (( iNewY = (iNewP - iNewX) / iWidth ))  
  76.   echo -ne "\033[1m\033[35m"  
  77.   (( pX = 2 * iNewX + iLeft + 1 ))  
  78.   (( pY = iNewY + iTop + 1 ))  
  79.    
  80.   echo -ne "\033["$pY";"$pX"H[]"  
  81.   echo -ne "\033["$iCursor";1H"  
  82.   echo -ne "\033[0m"  
  83. }  
  84.    
  85. function InitDraw  
  86. {  
  87.   clear  
  88.    
  89.   (( iTop = 1 ))  
  90.   (( iBottom = iTop + iHeight + 1 ))  
  91.   (( iLeft = 1 ))  
  92.   (( iRight = iLeft + iWidth + iWidth + 1 ))  
  93.   (( iCursor = iBottom + 1 ))  
  94.    
  95.   echo -ne "\033[1m\033[32m  
  96.    
  97.   for (( i = iLeft + 1; i < iWidth + iWidth + iLeft + 1; i++ )); do  
  98.     echo -ne "\033["$iTop";"$i"H="  
  99.     echo -ne "\033["$iBottom";"$i"H="  
  100.   done  
  101.    
  102.   for (( i = iTop; i < iHeight + iTop + 2; i++ ))  
  103.   do  
  104.     echo -ne "\033["$i";"$iLeft"H|"  
  105.     echo -ne "\033["$i";"$iRight"H|"  
  106.   done  
  107.    
  108.   echo -ne "\033["$iCursor";1H"  
  109.   echo -ne "\033[0m"  
  110.   echo -ne "\033[1m\033[33m"  
  111.    
  112.   for (( i = 0; i < ${#iX[@]}; i++ ))  
  113.   do  
  114.     (( pX = 2 * ${iX[$i]} + iLeft + 1 ))  
  115.     (( pY = ${iY[$i]} + iTop + 1 ))  
  116.     (( pM = ${iY[$i]} * iWidth + ${iX[$i]} ))  
  117.     (( iMap[$pM] = 1 ))  
  118.     echo -ne "\033["$pY";"$pX"H[]"  
  119. #echo ${iX[$i]}  
  120.   done  
  121.   echo -ne "\033["$iCursor";1H"  
  122.   echo -ne "\033[0m"  
  123.    
  124.   RandomHeader  
  125. }  
  126.    
  127. function ShiftSnake  
  128. {  
  129.   (( iLastP = iS - 1 ))  
  130.    
  131.   if (( iLastP < 0 )); then ((iLastP = ${#iX[@]} - 1 )); fi  
  132.    
  133.   if (( iDir == 1 )) #left  
  134.   then  
  135.     (( iHX = ${iX[$iLastP]} - 1 ))  
  136.     (( iHY = ${iY[$iLastP]} ))  
  137.   elif (( iDir == 2 )) #up  
  138.   then  
  139.     (( iHX = ${iX[$iLastP]} ))  
  140.     (( iHY = ${iY[$iLastP]} - 1 ))  
  141.   elif (( iDir == 3 )) #right  
  142.   then  
  143.     (( iHX = ${iX[$iLastP]} + 1 ))  
  144.     (( iHY = ${iY[$iLastP]} ))  
  145.   elif (( iDir == 4 )) #down  
  146.   then  
  147.     (( iHX = ${iX[$iLastP]} ))  
  148.     (( iHY = ${iY[$iLastP]} + 1 ))  
  149.   fi  
  150.    
  151.   bOver=0 
  152.    
  153.   if (( iHX < 0 || iHY < 0 || iHX >= iWidth || iHY >= iHeight )); then bOver=1;fi  
  154.   if (( bOver == 0 )); then  
  155.     if (( ${iMap[iHY * iWidth + iHX]} == 1 )); then bOver=1; fi  
  156.   fi  
  157.    
  158.   if (( bOver == 1 )); then  
  159.     kill $pidCtlSnake  
  160.     (( iBottomiBottom = iBottom + 1 ))  
  161.     echo -e "\033["$iBottom";0HGame over! (Score: "${#iX[@]}"00)\033[0m"  
  162.     exit 0;  
  163.   fi  
  164.    
  165. #check if catch the new box  
  166.   if (( iHX == iNewX && iHY == iNewY )); then  
  167.     for (( i = ${#iX[@]}; i > iS; i-- )); do  
  168.       (( iX[$i] = ${iX[$i - 1]} ))  
  169.       (( iY[$i] = ${iY[$i - 1]} ))  
  170.     done  
  171.    
  172.     (( iX[$iS] = iHX ))  
  173.     (( iY[$iS] = iHY ))  
  174.     (( iNextP = iS + 1 ))  
  175.    
  176.     if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi  
  177.     echo -ne "\a"  
  178.     RandomHeader  
  179.   else  
  180.     (( iNextP = iS + 1 ))  
  181.      
  182.    if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi  
  183.    #clear snake tailer  
  184.     (( pX = 2 * ${iX[$iS]} + iLeft + 1 ))  
  185.     (( pY = ${iY[$iS]} + iTop + 1 ))  
  186.     (( pM = ${iY[$iS]} * iWidth + ${iX[$iS]} ))  
  187.     (( iMap[$pM] = 0 ))  
  188.     echo -ne "\033["$pY";"$pX"H  "  
  189.     (( iX[$iS] = iHX ))  
  190.     (( iY[$iS] = iHY ))  
  191.   fi  
  192. #draw snake header  
  193.   echo -ne "\033[1m\033[33m"  
  194.   (( pX = 2 * iHX + iLeft + 1 ))  
  195.   (( pY = iHY + iTop + 1 ))  
  196.   (( pM = iHY * iWidth + iHX ))  
  197.   (( iMap[$pM] = 1 ))  
  198.   echo -ne "\033["$pY";"$pX"H[]"  
  199.   echo -ne "\033["$iCursor";1H"  
  200.   echo -ne "\033[0m"  
  201.   (( iS = iNextP ))  
  202. }  
  203.    
  204. trap "if (( iDir != 3 && iDir != 0 )); then iDirection=1; fi" 36  
  205. trap "if (( iDir != 4 )); then iDirection=2; fi" 37  
  206. trap "if (( iDir != 1 )); then iDirection=3; fi" 38  
  207. trap "if (( iDir != 2 )); then iDirection=4; fi" 39  
  208. trap "exit" 40  
  209.    
  210. InitDraw  
  211.    
  212. (( iNanoSec = iSpeed * 1000000 ))  
  213. iTime="1"`date +"%S%N"`  
  214.    
  215. while [[ 1 ]]; do  
  216.   usleep 100000  
  217.   iTimeNew="1"`date +"%S%N"`  
  218.   #avoid iTimeNew < iTime when new minute comes  
  219.    
  220.   if (( iTimeNew < iTime )); then  
  221.     (( iTimeiTime = iTime - 60000000000 ))  
  222.   fi  
  223.   #detect the time interval  
  224.    
  225.   if (( iTimeNew - iTime < iNanoSec )); then continue; fi  
  226.    
  227.   iTime=$iTimeNew  
  228.   iDir=$iDirection  
  229.    
  230.   if (( iDir != 0 )); then  
  231.     ShiftSnake  
  232.   fi  
  233.    
  234. done  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章