免费注册 查看新帖 |

Chinaunix

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

Shell写的贪吃蛇游戏  关闭 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-10-15 18:48 |只看该作者 |倒序浏览
忙一下午,终于出来了 :wink:
在我的redhat8.0上运行通过。
游戏键:
    上:w, i
      下:s, k
      左:a, j
      右:d, l
      退出:q


  1. #!/bin/bash

  2. function DetectInput
  3. {
  4.         while [[ 1 ]]
  5.         do
  6.                 c=""
  7.                 read -n 1 c
  8.                 echo -ne "\r          \r"
  9.                 if [[ $c == "a" || $c == "j" || $c == "A" || $c == "J" ]]
  10.                 then
  11.                         kill -36 $pidShowSnake
  12.                 elif [[ $c == "w" || $c == "i" || $c == "W" || $c == "I" ]]
  13.                 then
  14.                         kill -37 $pidShowSnake
  15.                 elif [[ $c == "d" || $c == "l" || $c == "D" || $c == "L" ]]
  16.                 then
  17.                         kill -38 $pidShowSnake
  18.                 elif [[ $c == "s" || $c == "k" || $c == "S" || $c == "K" ]]
  19.                 then
  20.                         kill -39 $pidShowSnake
  21.                 elif [[ $c == "q" || $c == "Q" ]]
  22.                 then
  23.                         echo Quit.
  24.                         kill -40 $pidShowSnake
  25.                         exit
  26.                 fi
  27.         done
  28. }

  29. function AllExit
  30. {
  31.         kill -40 $pidShowSnake
  32.         exit
  33. }

  34. if [[ $1 != "--showsnake" ]]
  35. then
  36.         eval $0" --showsnake "$$"&"
  37.         trap "exit" TERM
  38.         trap "AllExit" INT
  39.         pidShowSnake=$!
  40.         DetectInput
  41.         exit
  42. else
  43.         pidCtlSnake=$2
  44. fi

  45. echo sub


  46. iSpeed=500        #time interval in millisecond
  47. iDirection=0        #1-left, 2-up, 3-right, 4-down
  48. iWidth=15
  49. iHeight=15
  50. iX=(6 7 8)
  51. iY=(7 7 7)
  52. iMap=()
  53. iS=0        #Start pointer in iX

  54. (( iTotalBox = iWidth * iHeight ))
  55. for (( i = 0; i < iTotalBox; i++ ))
  56. do
  57.         (( iMap[$i] = 0 ))
  58. done

  59. function RandomHeader
  60. {
  61.         (( iNew = RANDOM % ( iTotalBox - ${#iX[@]} ) ))
  62.         for (( iNewP = 0, i = 0; iNewP < iTotalBox && i < iNew; iNewP++))
  63.         do
  64.                 if (( ${iMap[$iNewP]} != 1 )); then (( i++ )); fi
  65.         done
  66.         while (( ${iMap[$iNewP]} == 1 )); do (( iNewP++ )); done

  67.         (( iNewX = iNewP % iWidth ))
  68.         (( iNewY = (iNewP - iNewX) / iWidth ))

  69.         echo -ne "\33[1m\33[35m"
  70.         (( pX = 2 * iNewX + iLeft + 1 ))
  71.         (( pY = iNewY + iTop + 1 ))
  72.         echo -ne "\33["$pY";"$pX"H[]"
  73.         echo -ne "\33["$iCursor";1H"
  74.         echo -ne "\33[0m"
  75.                
  76. }

  77. function InitDraw
  78. {
  79.         clear
  80.        
  81.         (( iTop = 1 ))
  82.         (( iBottom = iTop + iHeight + 1 ))
  83.         (( iLeft = 1 ))
  84.         (( iRight = iLeft + iWidth + iWidth + 1 ))
  85.         (( iCursor = iBottom + 1 ))
  86.        
  87.         echo -ne "\33[1m\33[32m"
  88.         for (( i = iLeft + 1; i < iWidth + iWidth + iLeft + 1; i++ ))
  89.         do
  90.                 echo -ne "\33["$iTop";"$i"H="
  91.                 echo -ne "\33["$iBottom";"$i"H="
  92.         done
  93.         for (( i = iTop; i < iHeight + iTop + 2; i++ ))
  94.         do
  95.                 echo -ne "\33["$i";"$iLeft"H|"
  96.                 echo -ne "\33["$i";"$iRight"H|"
  97.         done
  98.         echo -ne "\33["$iCursor";1H"
  99.         echo -ne "\33[0m"

  100.         echo -ne "\33[1m\33[33m"
  101.         for (( i = 0; i < ${#iX[@]}; i++ ))
  102.         do
  103.                 (( pX = 2 * ${iX[$i]} + iLeft + 1 ))
  104.                 (( pY = ${iY[$i]} + iTop + 1 ))
  105.                 (( pM = ${iY[$i]} * iWidth + ${iX[$i]} ))
  106.                 (( iMap[$pM] = 1 ))
  107.                 echo -ne "\33["$pY";"$pX"H[]"
  108.                 #echo ${iX[$i]}
  109.         done
  110.         echo -ne "\33["$iCursor";1H"
  111.         echo -ne "\33[0m"
  112.        
  113.         RandomHeader
  114. }


  115. function ShiftSnake
  116. {
  117.         (( iLastP = iS - 1 ))
  118.         if (( iLastP < 0 )); then ((iLastP = ${#iX[@]} - 1 )); fi
  119.                
  120.         if (( iDir == 1 ))        #left
  121.         then
  122.                 (( iHX = ${iX[$iLastP]} - 1 ))
  123.                 (( iHY = ${iY[$iLastP]} ))
  124.         elif (( iDir == 2 ))        #up
  125.         then
  126.                 (( iHX = ${iX[$iLastP]} ))
  127.                 (( iHY = ${iY[$iLastP]} - 1 ))
  128.         elif (( iDir == 3 ))        #right
  129.         then
  130.                 (( iHX = ${iX[$iLastP]} + 1 ))
  131.                 (( iHY = ${iY[$iLastP]} ))
  132.         elif (( iDir == 4 ))        #down
  133.         then
  134.                 (( iHX = ${iX[$iLastP]} ))
  135.                 (( iHY = ${iY[$iLastP]} + 1 ))       
  136.         fi
  137.        
  138.         bOver=0
  139.         if (( iHX < 0 || iHY < 0 || iHX >= iWidth || iHY >= iHeight )); then bOver=1;fi
  140.         if (( bOver == 0 )); then
  141.                 if (( ${iMap[iHY * iWidth + iHX]} == 1 )); then        bOver=1; fi
  142.         fi

  143.         if (( bOver == 1 ))
  144.         then
  145.                 kill $pidCtlSnake
  146.                 (( iBottom = iBottom + 1 ))
  147.                 echo -e "\33["$iBottom";0HGame over! (Score: "${#iX[@]}"00)\33[0m"
  148.                 exit 0;
  149.         fi
  150.        
  151.        
  152.         #check if catch the new box
  153.         if (( iHX == iNewX && iHY == iNewY ))
  154.         then
  155.                 for (( i = ${#iX[@]}; i > iS; i-- ))
  156.                 do
  157.                         (( iX[$i] = ${iX[$i - 1]} ))
  158.                         (( iY[$i] = ${iY[$i - 1]} ))
  159.                 done
  160.                 (( iX[$iS] = iHX ))
  161.                 (( iY[$iS] = iHY ))

  162.                 (( iNextP = iS + 1 ))
  163.                 if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi       
  164.                
  165.                 echo -ne "\a"
  166.                 RandomHeader
  167.         else
  168.                 (( iNextP = iS + 1 ))
  169.                 if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi       
  170.        
  171.                 #clear snake tailer
  172.                 (( pX = 2 * ${iX[$iS]} + iLeft + 1 ))
  173.                 (( pY = ${iY[$iS]} + iTop + 1 ))
  174.                 (( pM = ${iY[$iS]} * iWidth + ${iX[$iS]} ))
  175.                 (( iMap[$pM] = 0 ))
  176.                 echo -ne "\33["$pY";"$pX"H  "
  177.                 (( iX[$iS] = iHX ))
  178.                 (( iY[$iS] = iHY ))

  179.         fi

  180.         #draw snake header
  181.         echo -ne "\33[1m\33[33m"
  182.         (( pX = 2 * iHX + iLeft + 1 ))
  183.         (( pY = iHY + iTop + 1 ))
  184.         (( pM = iHY * iWidth + iHX ))
  185.         (( iMap[$pM] = 1 ))
  186.         echo -ne "\33["$pY";"$pX"H[]"
  187.         echo -ne "\33["$iCursor";1H"
  188.         echo -ne "\33[0m"

  189.         (( iS = iNextP ))
  190. }

  191. trap "if (( iDir != 3 && iDir != 0 )); then iDirection=1; fi" 36
  192. trap "if (( iDir != 4 )); then iDirection=2; fi" 37
  193. trap "if (( iDir != 1 )); then iDirection=3; fi" 38
  194. trap "if (( iDir != 2 )); then iDirection=4; fi" 39
  195. trap "exit" 40

  196. InitDraw

  197. (( iNanoSec = iSpeed * 1000000 ))
  198. iTime="1"`date +"%S%N"`
  199. while [[ 1 ]]
  200. do
  201.         usleep 100000
  202.         iTimeNew="1"`date +"%S%N"`
  203.        
  204.         #avoid iTimeNew < iTime when new minute comes
  205.         if (( iTimeNew < iTime ))
  206.         then
  207.                 (( iTime = iTime - 60000000000 ))
  208.         fi
  209.        
  210.         #detect the time interval
  211.         if (( iTimeNew - iTime < iNanoSec )); then continue; fi
  212.         iTime=$iTimeNew
  213.                
  214.         iDir=$iDirection
  215.        
  216.         if (( iDir != 0 ))
  217.         then
  218.                 ShiftSnake
  219.         fi
  220. done

复制代码

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-10-15 18:50 |只看该作者

Shell写的贪吃蛇游戏

14.gif (5.05 KB, 下载次数: 166)

14.gif

5.gif (4.88 KB, 下载次数: 111)

5.gif

论坛徽章:
0
3 [报告]
发表于 2003-10-15 20:23 |只看该作者

Shell写的贪吃蛇游戏

厉害!!

论坛徽章:
0
4 [报告]
发表于 2003-10-15 20:52 |只看该作者

Shell写的贪吃蛇游戏

我怎么运行不了呢?
在函数function AllExit()和function RandomHeader()之间的那段代码是什么意思?

论坛徽章:
0
5 [报告]
发表于 2003-10-16 08:54 |只看该作者

Shell写的贪吃蛇游戏

一运行就这样:
sub

|==============================|
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|                              |
|            [][][]./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 "
./snake: != 1 : syntax error: operand expected (error token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")token is "!= 1 ")
./snake: ((: 111%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")
./snake: ((: 112%N: division by 0 (error token is "N")

./snake: ((: 112%N: division by 0 (error token is "N")

论坛徽章:
0
6 [报告]
发表于 2003-10-16 09:06 |只看该作者

Shell写的贪吃蛇游戏

刚才修改了一下,解决了退出后屏幕变乱的问题。

我在linux8.0 + bash上调试的,
你的运行环境是什么,我去试一下。

论坛徽章:
0
7 [报告]
发表于 2003-10-16 09:47 |只看该作者

Shell写的贪吃蛇游戏

很好,由其是編程的巧妙, 利用kill singal和trap 完成輸入的控制, 不錯不錯.

论坛徽章:
0
8 [报告]
发表于 2003-10-16 09:48 |只看该作者

Shell写的贪吃蛇游戏

在函数function AllExit()和function RandomHeader()之间的那段代码是什么意思?


是这么想的:
根据命令行参数的不同,把这个shell作为两个程序运行。
一个用于读取键盘输入,
并向另一个发送36-40的信号,
通知他上下左右和退出的消息。
另一个是贪吃蛇的主执行程序。

论坛徽章:
0
9 [报告]
发表于 2003-10-16 11:15 |只看该作者

Shell写的贪吃蛇游戏

在solaris 8上运行,报read命令错误
tanchishe: read: illegal option: -n
read: usage: read [-r] [-p prompt] [-a array] [-e] [name ...]

论坛徽章:
0
10 [报告]
发表于 2003-10-16 11:27 |只看该作者

Shell写的贪吃蛇游戏

[quote]原帖由 "smileinwind"]][/quote 发表:


这应该是bash的用法,solaris 8有bash吗?我没有找到啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP