LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 818|回复: 3

bash TT

[复制链接]
发表于 2005-12-14 18:22:00 | 显示全部楼层 |阅读模式
From r2007@bbs.chinaunix.net

bash版的打字练习
还有一些小问题,欢迎debug
用法: ./scriptname filename
如果不带参数也可^_^
Ctrl+x退出  空格 暂停\继续



  1. #!/bin/bash
  2. file=$1
  3. if ! [ -f "${file:=$0}" ]
  4. then
  5.   echo "Usage: $(basename $0) filename"
  6.   exit 1
  7. fi
  8. org_tty=$(stty -g);IFS=""
  9. fifo=$$.pipe
  10. mkfifo $fifo && exec 4<>$fifo && rm $fifo || exit 1
  11. function display {
  12.   echo -n "$cls"
  13.   echo -n "${bold}TT v1.0 S:$score T:$(( hit + miss )) H:$hit M:$miss${normal}"
  14.   next_index=0; safe=1
  15.   for (( i = 1 ; i<lines ; i++ ))
  16.   do
  17.     if [ "${s[i]}" ]
  18.     then
  19.       (( y[i]++ ))
  20.       if (( lock[i] > 0 ))
  21.       then
  22.         (( lock[i] -= 2 ))
  23.         if (( lock[i] > 0 ))
  24.         then
  25.           safe=0
  26.           tput cup "${y[i]}" "${x[i]}"
  27.           echo -n "$bold${s[i]}$normal"
  28.           tput cup $(( y[i] + lock[i] )) "${x[i]}"
  29.           echo -n "${bold}^$normal"
  30.         else
  31.           (( hit++ ))
  32.           (( score += ${#s[i]} ))
  33.           s[i]="";next_index=$i
  34.         fi
  35.       else
  36.       if (( y[i] >= lines - 1 ))
  37.       then
  38.         (( miss++ ))
  39.         base=${base::${x[i]}}${base0::${#s[i]}}${base:$(( x[i] + ${#s[i]} ))}
  40.         if [ "$base" = "$base0" ]
  41.         then
  42.           live=0
  43.           base=$base1
  44.         fi
  45.         s[i]="";next_index=$i
  46.       else
  47.         safe=0
  48.         tput cup "${y[i]}" "${x[i]}"
  49.         echo -n "${s[i]}"
  50.       fi
  51.       fi
  52.     else
  53.       next_index=$i
  54.     fi
  55.   done
  56.   if (( live )) && (( eof )) && (( safe ))
  57.   then
  58.     tput cup 1 0
  59.     echo -n 'You Win!'
  60.   fi
  61.   if (( aim > 0 ))
  62.   then
  63.     tput cup "${y[aim]}" "${x[aim]}"
  64.     echo "$bold$match$normal"
  65.   fi
  66.   tput cup $(( lines-1 )) 0
  67.   echo -n $base
  68.   while read -srn1 c
  69.   do
  70.     case "$c" in
  71.     $'\377' ) (( ! pause )) && break;;
  72.     $'\030' ) exit;;
  73.     " " ) pause=$(( ! pause ));;
  74.     [[:alnum:]] )
  75.       if (( aim ))
  76.       then
  77.         match=$match$c
  78.         len=$(expr ${s[aim]} : $match)
  79.         if (( len > 0))
  80.         then
  81.           (( type++ ))
  82.           tput cup ${y[aim]} $(( x[aim] + len -1 ))
  83.           echo -n "$bold$c$normal"
  84.           if (( len == ${#s[aim]} ))
  85.           then
  86.             lock[aim]=$(( lines - y[aim] ))
  87.             tput cup ${y[aim]} ${x[aim]}
  88.             echo -n "$bold${s[aim]}$normal"
  89.             aim=0
  90.           fi
  91.         else
  92.           tput cup ${y[aim]} ${x[aim]}
  93.           echo -n "${s[aim]}"
  94.           aim=0
  95.           for (( i = 1 ; i<lines ; i++ ))
  96.           do
  97.             if (( lock[i] <=0 )) && [ "${s[i]}" ]
  98.             then
  99.               len=$(expr ${s[i]} : $match)
  100.               if (( len > 0 ))
  101.               then
  102.                 aim=$i;
  103.                 tput cup ${y[aim]} ${x[aim]}
  104.                 echo -n "$bold${s[aim]}$normal"
  105.                 if (( len == ${#s[aim]} ))
  106.                 then
  107.                   lock[aim]=$(( lines - y[aim] ))
  108.                   aim=0
  109.                 fi
  110.               fi
  111.             fi
  112.           done
  113.           if (( aim > 0))
  114.           then
  115.             (( type++ ))
  116.             tput cup "${y[aim]}" "${x[aim]}"
  117.             echo "$bold$match$normal"            
  118.           else
  119.             (( typo++ ))
  120.           fi
  121.         fi
  122.       else
  123.         for (( i = 1 ; i<lines ; i++ ))
  124.         do
  125.           if (( lock[i] <= 0 )) && [ "${s[i]:0:1}" = $c ]
  126.           then
  127.             if (( ${#s[i]} == 1 ))
  128.             then
  129.               lock[i]=$(( lines - y[aim] ))
  130.             else
  131.               aim=$i
  132.               match=$c
  133.             fi
  134.             (( type++ ))
  135.             tput cup ${y[i]} ${x[i]}
  136.             echo -n "$bold$c$normal"         
  137.             break
  138.           fi
  139.         done
  140.         (( aim <= 0 )) && (( typo++ ))
  141.       fi
  142.       ;;
  143.     * ) (( typo++ )) ;;
  144.     esac
  145.   done <&4
  146. }
  147. function tt {
  148.   cols=$(tput cols);lines=$(tput lines)
  149.   cls=$(tput clear)
  150.   bold=$(tput smso);normal=$(tput rmso)
  151.   for (( i = 0 ; i < $cols ; i++ ))
  152.   do
  153.     base=${base}^
  154.     base0=${base0}-
  155.     base1=${base1}o
  156.   done
  157.   base1="Game O${base1:10}ver!"
  158.   next_index=1
  159.   tput civis
  160.   live=1
  161.   { tr -cs '[:alnum:]' '[\n*]' <$file
  162.     echo '~'
  163.     for (( i = 1 ; i < $lines ; i++ ))
  164.     do echo
  165.     done } | while (( live )) && read word
  166.   do
  167.     if [ "$word" = '~' ]
  168.     then
  169.       eof=1; word=""
  170.     fi
  171.     range=$(( cols - ${#word} + 1 ))
  172.     if (( range > 0 )) && (( next_index > 0 ))
  173.     then
  174.        x[next_index]=$(( RANDOM % range ))
  175.        y[next_index]=0
  176.        s[next_index]=$word
  177.     fi
  178.     display
  179.   done
  180. }
  181. tt &
  182. tt_pid=$!
  183. while sleep 1;do echo -ne "\377";done >&4 &
  184. timer_pid=$!
  185. trap 'kill -1 $timer_pid  &>\dev\null;wait;stty "$org_tty";tput reset;exit' 0 1 2 3 15
  186. #stty -echo -icanon
  187. while read -srn1 key && [ "$key" != $'\030' ]
  188. do
  189.   echo -n "$key" >&4
  190. done
  191. echo -n "$key" >&4
复制代码
发表于 2005-12-14 19:21:45 | 显示全部楼层
呵呵,转的真快呀
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-15 08:43:05 | 显示全部楼层
也不问问谁的手脚
回复 支持 反对

使用道具 举报

发表于 2005-12-15 16:50:06 | 显示全部楼层
Post by Yuri
也不问问谁的手脚

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表