Tank Shell游戏编写之五:在场地内控制坦克移动(完整代码展示)

 

完整代码如下(主运行代码有部分注释):

# arg1=point1 arg2=point2, arg2=[UP|DOWN|LEFT|RIGHT]
# eg: 10 20 UP
f_print_tank(){
    v_hp1=$1
    v_hp2=$2
    v_direc=$3
    if [[ $v_direc == 'UP' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+1));$((v_hp2-1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+1));$((v_hp2+1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+2));$((v_hp2-1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+2));$((v_hp2+1))H\033[42m \033[0m"
    fi
    if [[ $v_direc == 'DOWN' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-1));$((v_hp2-1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-1));$((v_hp2+1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-2));$((v_hp2-1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-2));$((v_hp2+1))H\033[42m \033[0m"
    fi
    if [[ $v_direc == 'LEFT' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-1));$((v_hp2+1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-1));$((v_hp2+2))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+1));$((v_hp2+1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+1));$((v_hp2+2))H\033[42m \033[0m"
    fi        
    if [[ $v_direc == 'RIGHT' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-1));$((v_hp2-1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1-1));$((v_hp2-2))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+1));$((v_hp2-1))H\033[42m \033[0m"
        echo -e "\033[$((v_hp1+1));$((v_hp2-2))H\033[42m \033[0m"
    fi
}

f_clean_tank(){
    v_hp1=$1
    v_hp2=$2
    v_direc=$3
    if [[ $v_direc == 'UP' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H "
        echo -e "\033[$((v_hp1+1));$((v_hp2-1))H "
        echo -e "\033[$((v_hp1+1));$((v_hp2+1))H "
        echo -e "\033[$((v_hp1+2));$((v_hp2-1))H "
        echo -e "\033[$((v_hp1+2));$((v_hp2+1))H "
    fi
    if [[ $v_direc == 'DOWN' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H "
        echo -e "\033[$((v_hp1-1));$((v_hp2-1))H "
        echo -e "\033[$((v_hp1-1));$((v_hp2+1))H "
        echo -e "\033[$((v_hp1-2));$((v_hp2-1))H "
        echo -e "\033[$((v_hp1-2));$((v_hp2+1))H "
        fi
    if [[ $v_direc == 'LEFT' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H "
        echo -e "\033[$((v_hp1-1));$((v_hp2+1))H "
        echo -e "\033[$((v_hp1-1));$((v_hp2+2))H "
        echo -e "\033[$((v_hp1+1));$((v_hp2+1))H "
        echo -e "\033[$((v_hp1+1));$((v_hp2+2))H "
    fi        
    if [[ $v_direc == 'RIGHT' ]]
    then
        echo -e "\033[$((v_hp1+0));$((v_hp2+0))H "
        echo -e "\033[$((v_hp1-1));$((v_hp2-1))H "
        echo -e "\033[$((v_hp1-1));$((v_hp2-2))H "
        echo -e "\033[$((v_hp1+1));$((v_hp2-1))H "
        echo -e "\033[$((v_hp1+1));$((v_hp2-2))H "
    fi
}
f_turn_up(){ 
    v_hp1=${v_tank_head_points[0]}
    v_hp2=${v_tank_head_points[1]}
    v_direc=$v_tank_direction
    
    f_clean_tank $v_hp1 $v_hp2 $v_direc    
    
    [[ $v_direc == 'UP'    ]] && [[ $v_hp1 -ge $((v_range_lines[0]+1)) ]] && v_hp1=$((v_hp1 - 1))
    [[ $v_direc == 'DOWN'  ]] && v_hp1=$((v_hp1 - 2))
    [[ $v_direc == 'LEFT'  ]] && v_hp1=$((v_hp1 - 1)) && v_hp2=$((v_hp2 + 1))
    [[ $v_direc == 'RIGHT' ]] && v_hp1=$((v_hp1 - 1)) && v_hp2=$((v_hp2 - 1))
    
    f_print_tank $v_hp1 $v_hp2 'UP'
    
    v_tank_head_points=($v_hp1 $v_hp2)
    v_tank_direction='UP'
}

f_turn_down(){
        v_hp1=${v_tank_head_points[0]}
        v_hp2=${v_tank_head_points[1]}
        v_direc=$v_tank_direction

        f_clean_tank $v_hp1 $v_hp2 $v_direc

    [[ $v_direc == 'UP'    ]] && v_hp1=$((v_hp1 + 2))
    [[ $v_direc == 'DOWN'  ]] && [[ $v_hp1 -lt ${v_range_lines[1]} ]] && v_hp1=$((v_hp1 + 1))
    [[ $v_direc == 'LEFT'  ]] && v_hp1=$((v_hp1 + 1)) && v_hp2=$((v_hp2 + 1))
    [[ $v_direc == 'RIGHT' ]] && v_hp1=$((v_hp1 + 1)) && v_hp2=$((v_hp2 - 1))
        
    f_print_tank $v_hp1 $v_hp2 'DOWN'

    v_tank_head_points=($v_hp1 $v_hp2)
    v_tank_direction='DOWN'
}

f_turn_left(){
        v_hp1=${v_tank_head_points[0]}
        v_hp2=${v_tank_head_points[1]}
        v_direc=$v_tank_direction

        f_clean_tank $v_hp1 $v_hp2 $v_direc

        [[ $v_direc == 'UP'    ]] && v_hp1=$((v_hp1 + 1)) && v_hp2=$((v_hp2 - 1))
        [[ $v_direc == 'DOWN'  ]] && v_hp1=$((v_hp1 - 1)) && v_hp2=$((v_hp2 - 1))
        [[ $v_direc == 'LEFT'  ]] && [[ $v_hp2 -gt ${v_range_cols[0]} ]] &&v_hp2=$((v_hp2 - 1))
        [[ $v_direc == 'RIGHT' ]] && v_hp2=$((v_hp2 - 2))
        
        f_print_tank $v_hp1 $v_hp2 'LEFT'

        v_tank_head_points=($v_hp1 $v_hp2)
        v_tank_direction='LEFT'
}
f_turn_right(){
        v_hp1=${v_tank_head_points[0]}
        v_hp2=${v_tank_head_points[1]}
        v_direc=$v_tank_direction

        f_clean_tank $v_hp1 $v_hp2 $v_direc

        [[ $v_direc == 'UP'    ]] && v_hp1=$((v_hp1 + 1)) && v_hp2=$((v_hp2 + 1))
        [[ $v_direc == 'DOWN'  ]] && v_hp1=$((v_hp1 - 1)) && v_hp2=$((v_hp2 + 1))
        [[ $v_direc == 'LEFT'  ]] && v_hp2=$((v_hp2 + 2))
        [[ $v_direc == 'RIGHT' ]] && [[ $v_hp2 -lt ${v_range_cols[1]} ]] &&v_hp2=$((v_hp2 + 1))

        f_print_tank $v_hp1 $v_hp2 'RIGHT'

        v_tank_head_points=($v_hp1 $v_hp2)
        v_tank_direction='RIGHT'
}


f_print_field(){
    v_wall_up=$((v_range_lines[0]-1))
    v_wall_down=$((v_range_lines[1]+1))
    v_wall_left=$((v_range_cols[0]-1))
    v_wall_right=$((v_range_cols[1]+1))

    for ((i=v_wall_left; i<=v_wall_right; i++))
    do 
        echo -e "\033[$v_wall_up;${i}H\033[45m \033[0m"
        echo -e "\033[$v_wall_down;${i}H\033[45m \033[0m"
    done
    
    for ((i=v_wall_up; i<v_wall_down; i++))
    do
        echo -e "\033[$i;${v_wall_left}H\033[45m \033[0m"
        echo -e "\033[$i;${v_wall_right}H\033[45m \033[0m"
    done
}

tput civis   
v_range_lines=(5 30)   # 定义坦克活动范围
v_range_cols=(40 100)
f_print_field # 根据坦克活动范围,圈场地画围墙

# 在活动范围内的中心位置初始化一个坦克 v_tank_head_points
=( $(((v_range_lines[1]-v_range_lines[0])/2+v_range_lines[0]-1)) $(((v_range_cols[1]-v_range_cols[0])/2+v_range_cols[0])) ) v_tank_direction='UP' f_print_tank ${v_tank_head_points[0]} ${v_tank_head_points[1]} $v_tank_direction v_special_char=`echo -e "\033"` while : do read -s -n 1 v_pressed_key v_pressed_key=`echo $v_pressed_key | tr 'a-z' 'A-Z'` [[ $v_pressed_key == 'C' ]] && break # 按 C 键退出, 如果Ctrl+C强制退出会造成没有光标显示,可手动执行 tput cnorm 解决 if [[ $v_pressed_key == $v_special_char ]]; then read -s -n 2 v_pressed_key [[ ${v_pressed_key:1:1} == 'A' ]] && f_turn_up [[ ${v_pressed_key:1:1} == 'B' ]] && f_turn_down [[ ${v_pressed_key:1:1} == 'D' ]] && f_turn_left [[ ${v_pressed_key:1:1} == 'C' ]] && f_turn_right fi [[ $v_pressed_key = 'W' ]] && f_turn_up [[ $v_pressed_key = 'S' ]] && f_turn_down [[ $v_pressed_key = 'A' ]] && f_turn_left [[ $v_pressed_key = 'D' ]] && f_turn_right done tput cnorm

 注:复制代码时,主代码部分的中文注释可能会影响脚本格式,注意清理,或发送邮件到 [email protected]获取源代码文件。

展示:

猜你喜欢

转载自www.cnblogs.com/gipagod/p/9120617.html
今日推荐