暗无天日

=============>DarkSun的个人博客

使用shell编写打字游戏

获取随机数的方式

$RANDOM

变量内容的截取

${variable:position:length}

bash中的数组操作

定义数组

array_name=(value0 value1 value2 value3)

declare -a array_name

修改数组

array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen

读取数组

valuen=${array_name[n]}

获取数组长度

length=${#array_name[@]}

删除数组

unset array[1] # 删除数组中第一个元素 unset array # 删除整个数组

read

read -n 1 -t 2

脚本

定义游戏参数

width=70
height=10
interval=1

while getopts w:h:i: ARG
do
    case $ARG in
        w)
            width=$OPTARG
            ;;
        h)
            height=$OPTARG
            ;;
        i)
            interval=$OPTARG
            ;;
        *)
            echo "Unkown options"
            exit 1
    esac
done

shift $(($OPTIND-1))

定义初始内容

for (( i=0;i<$width;i++ ))
do
    blank_line="$blank_line "
done

for ((i=0;i<$height;i++))
do
    lines[$i]=$blank_line        # 全局变量
done

生成随机的字符

function generate_random_char()
{
    full_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    char_position=$(($RANDOM%62))
    char=${full_chars:$char_position:1}
    echo $char
}

function insert_random_char_into_line()
{
    local line=$1
    local position=$2
    local char=$3
    prefix_line=${line:0:$position}
    suffix_line=${line:$(($position+1))}
    echo "$prefix_line$char$suffix_line"
}

function generate_new_line()
{
    char=$(generate_random_char)
    position=$(($RANDOM%$width))
    new_line=$(insert_random_char_into_line "$blank_line" $position $char)
    echo "$new_line"
}

显示界面

function refresh_ui()
{
    clear
    for ((i=0;i<$height;i++))
    do
        echo "${lines[$i]}"
    done
}

读取输入的字符

function get_input()
{
    local input
    read -n 1 -t 0.1  input
    echo $input
}

消除匹配的字符

function remove_input_char() 
{
    local char=$1
    for((i=0;i<$height;i++))
    do
        line=${lines[$i]}
        line=$(echo "$line"|sed -e "s/$char/ /g")
        lines[$i]=$line
    done
}

屏幕下移

function screen_down()
{
    for ((i=$(($height-1));i>0;i--))
    do
        lines[$i]=${lines[$(($i-1))]}
    done
    lines[0]=$(generate_new_line)
    refresh_ui
}

整合起来

refresh_ui
while :
do
    old_date=$(date +"%s")
    input=$(get_input)
    if [ "$input" != "" ];then
        remove_input_char $input
        refresh_ui
    fi
    new_date=$(date +"%s")
    if [ $(($new_date-$old_date)) -ge $interval ];then
        screen_down
    fi
done

注意要点:

  1. 读取数组元素的语法是${array[0]}而不能写成$array[0]
  2. 字符串变量作为参数时,请一定记得放在""里面,否则前面的空格会丢失