根据之前的分析, 炮弹函数只需要获取到坦克的头坐标、朝向信息然后结合活动范围就能确定自己的运行轨迹
f_my_bullet(){ v_infor=(`cat $v_my_tank_head_infor`) #v_my_tank_head_infor 保存的是坦克的头坐标、朝向信息,格式:横坐标 纵坐标、方向 if [[ ${v_infor[2]} == 'UP' ]] then for((i=$((v_infor[0]-1)); i>=v_range_lines[0]; i--)) # 判断自己的运行轨迹,终点不能超过上边界 do echo -ne "\033[${i};${v_infor[1]}H\033[42m \033[0m" # 颜色打印 sleep 0.01 # 最好有些时间间隔,不然很难发现“炮弹”的移动轨迹 echo -ne "\033[${i};${v_infor[1]}H \033[0m" # 擦除旧的痕迹,不然显示出来的会是一条直线,而不是一个点在移动 done & # 一定要放到后台运行,不然会影响到前台操作 fi if [[ ${v_infor[2]} == 'DOWN' ]] then for((i=$((v_infor[0]+1)); i<=v_range_lines[1]; i++)) do echo -ne "\033[${i};${v_infor[1]}H\033[42m \033[0m" sleep 0.01 echo -ne "\033[${i};${v_infor[1]}H \033[0m" done & fi if [[ ${v_infor[2]} == 'LEFT' ]] then for((i=$((v_infor[1]-1)); i>=v_range_cols[0]; i--)) do echo -ne "\033[${v_infor[0]};${i}H\033[42m \033[0m" sleep 0.01 echo -ne "\033[${v_infor[0]};${i}H \033[0m" done & fi if [[ ${v_infor[2]} == 'RIGHT' ]] then for((i=$((v_infor[1]+1)); i<=v_range_cols[1]; i++)) do echo -ne "\033[${v_infor[0]};${i}H\033[42m \033[0m" sleep 0.01 echo -ne "\033[${v_infor[0]};${i}H \033[0m" done & fi }
键盘接收回车键时发送炮弹:
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 [[ "$v_pressed_key" == "" ]] && f_my_bullet # 新增的代码,接收“回车”键 if [[ $v_pressed_key == $v_special_char ]]; then read -s -n 2 v_pressed_key [[ ${v_pressed_key:1:1} == 'A' ]] && f_turn_direction 'UP' [[ ${v_pressed_key:1:1} == 'B' ]] && f_turn_direction 'DOWN' [[ ${v_pressed_key:1:1} == 'D' ]] && f_turn_direction 'LEFT' [[ ${v_pressed_key:1:1} == 'C' ]] && f_turn_direction 'RIGHT' fi [[ $v_pressed_key = 'W' ]] && f_turn_direction 'UP' [[ $v_pressed_key = 'S' ]] && f_turn_direction 'DOWN' [[ $v_pressed_key = 'A' ]] && f_turn_direction 'LEFT' [[ $v_pressed_key = 'D' ]] && f_turn_direction 'RIGHT' done
展示: