设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
Linux 综合讨论区 —— LinuxSir.cn
›
shell进阶应用、shell编程
›
bash TT
返回列表
查看:
815
|
回复:
3
bash TT
[复制链接]
Yuri
Yuri
当前离线
积分
3231
IP卡
狗仔卡
发表于 2005-12-14 18:22:00
|
显示全部楼层
|
阅读模式
From
r2007@bbs.chinaunix.net
bash版的打字练习
还有一些小问题,欢迎debug
用法: ./scriptname filename
如果不带参数也可^_^
Ctrl+x退出 空格 暂停\继续
#!/bin/bash
file=$1
if ! [ -f "${file:=$0}" ]
then
echo "Usage: $(basename $0) filename"
exit 1
fi
org_tty=$(stty -g);IFS=""
fifo=$$.pipe
mkfifo $fifo && exec 4<>$fifo && rm $fifo || exit 1
function display {
echo -n "$cls"
echo -n "${bold}TT v1.0 S:$score T:$(( hit + miss )) H:$hit M:$miss${normal}"
next_index=0; safe=1
for (( i = 1 ; i<lines ; i++ ))
do
if [ "${s[i]}" ]
then
(( y[i]++ ))
if (( lock[i] > 0 ))
then
(( lock[i] -= 2 ))
if (( lock[i] > 0 ))
then
safe=0
tput cup "${y[i]}" "${x[i]}"
echo -n "$bold${s[i]}$normal"
tput cup $(( y[i] + lock[i] )) "${x[i]}"
echo -n "${bold}^$normal"
else
(( hit++ ))
(( score += ${#s[i]} ))
s[i]="";next_index=$i
fi
else
if (( y[i] >= lines - 1 ))
then
(( miss++ ))
base=${base::${x[i]}}${base0::${#s[i]}}${base:$(( x[i] + ${#s[i]} ))}
if [ "$base" = "$base0" ]
then
live=0
base=$base1
fi
s[i]="";next_index=$i
else
safe=0
tput cup "${y[i]}" "${x[i]}"
echo -n "${s[i]}"
fi
fi
else
next_index=$i
fi
done
if (( live )) && (( eof )) && (( safe ))
then
tput cup 1 0
echo -n 'You Win!'
fi
if (( aim > 0 ))
then
tput cup "${y[aim]}" "${x[aim]}"
echo "$bold$match$normal"
fi
tput cup $(( lines-1 )) 0
echo -n $base
while read -srn1 c
do
case "$c" in
$'\377' ) (( ! pause )) && break;;
$'\030' ) exit;;
" " ) pause=$(( ! pause ));;
[[:alnum:]] )
if (( aim ))
then
match=$match$c
len=$(expr ${s[aim]} : $match)
if (( len > 0))
then
(( type++ ))
tput cup ${y[aim]} $(( x[aim] + len -1 ))
echo -n "$bold$c$normal"
if (( len == ${#s[aim]} ))
then
lock[aim]=$(( lines - y[aim] ))
tput cup ${y[aim]} ${x[aim]}
echo -n "$bold${s[aim]}$normal"
aim=0
fi
else
tput cup ${y[aim]} ${x[aim]}
echo -n "${s[aim]}"
aim=0
for (( i = 1 ; i<lines ; i++ ))
do
if (( lock[i] <=0 )) && [ "${s[i]}" ]
then
len=$(expr ${s[i]} : $match)
if (( len > 0 ))
then
aim=$i;
tput cup ${y[aim]} ${x[aim]}
echo -n "$bold${s[aim]}$normal"
if (( len == ${#s[aim]} ))
then
lock[aim]=$(( lines - y[aim] ))
aim=0
fi
fi
fi
done
if (( aim > 0))
then
(( type++ ))
tput cup "${y[aim]}" "${x[aim]}"
echo "$bold$match$normal"
else
(( typo++ ))
fi
fi
else
for (( i = 1 ; i<lines ; i++ ))
do
if (( lock[i] <= 0 )) && [ "${s[i]:0:1}" = $c ]
then
if (( ${#s[i]} == 1 ))
then
lock[i]=$(( lines - y[aim] ))
else
aim=$i
match=$c
fi
(( type++ ))
tput cup ${y[i]} ${x[i]}
echo -n "$bold$c$normal"
break
fi
done
(( aim <= 0 )) && (( typo++ ))
fi
;;
* ) (( typo++ )) ;;
esac
done <&4
}
function tt {
cols=$(tput cols);lines=$(tput lines)
cls=$(tput clear)
bold=$(tput smso);normal=$(tput rmso)
for (( i = 0 ; i < $cols ; i++ ))
do
base=${base}^
base0=${base0}-
base1=${base1}o
done
base1="Game O${base1:10}ver!"
next_index=1
tput civis
live=1
{ tr -cs '[:alnum:]' '[\n*]' <$file
echo '~'
for (( i = 1 ; i < $lines ; i++ ))
do echo
done } | while (( live )) && read word
do
if [ "$word" = '~' ]
then
eof=1; word=""
fi
range=$(( cols - ${#word} + 1 ))
if (( range > 0 )) && (( next_index > 0 ))
then
x[next_index]=$(( RANDOM % range ))
y[next_index]=0
s[next_index]=$word
fi
display
done
}
tt &
tt_pid=$!
while sleep 1;do echo -ne "\377";done >&4 &
timer_pid=$!
trap 'kill -1 $timer_pid &>\dev\null;wait;stty "$org_tty";tput reset;exit' 0 1 2 3 15
#stty -echo -icanon
while read -srn1 key && [ "$key" != $'\030' ]
do
echo -n "$key" >&4
done
echo -n "$key" >&4
复制代码
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
寂寞烈火
寂寞烈火
当前离线
积分
533
IP卡
狗仔卡
发表于 2005-12-14 19:21:45
|
显示全部楼层
呵呵,转的真快呀
回复
支持
反对
使用道具
举报
显身卡
Yuri
Yuri
当前离线
积分
3231
IP卡
狗仔卡
楼主
|
发表于 2005-12-15 08:43:05
|
显示全部楼层
也不问问谁的手脚
回复
支持
反对
使用道具
举报
显身卡
寂寞烈火
寂寞烈火
当前离线
积分
533
IP卡
狗仔卡
发表于 2005-12-15 16:50:06
|
显示全部楼层
Post by
Yuri
也不问问谁的手脚
回复
支持
反对
使用道具
举报
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表