游戏坦克大战
一个游戏不管好不好,开始界面一定不能太挫
不要以为这是静态的,会动的。。。。
代码:
DisFrame() { stop=false trap "stop=true" 10 while ! $stop do for ((i=1; i<=cols; i++)); do echo -ne "\033[1;${i}H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=2; i<=lines; i++)); do echo -ne "\033[${i};${cols}H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=cols-1; i>=1 ; i--)); do echo -ne "\033[${lines};${i}H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=lines-1; i>=2; i--)); do echo -ne "\033[${i};1H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=2; i<=cols-1; i++)); do echo -ne "\033[2;${i}H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=2; i<=lines-1; i++)); do echo -ne "\033[${i};$[cols-1]H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=cols-2; i>=2; i--)); do echo -ne "\033[$[lines-1];${i}H\033[4$((RANDOM%6+1))m \033[0m" done for ((i=lines-2; i>=2; i--)); do echo -ne "\033[${i};2H\033[4$((RANDOM%6+1))m \033[0m" done sleep 0.1 done } # $0 char sleep_time start_line end_line start_col upper/low upper/low left/right PrintChar2(){ aa='echo -ne "\033[${i};${5}H\033[1;${6}m$1\033[0m"; sleep $2' bb='[[ $i -ne $4 ]] && echo -ne "\033[${i};${5}H\033[1;${6}m \033[0m"' if [[ ${8} == "left" ]]; then [[ ${7} == "upper" ]] && for((i=$3; i<=$4; i++)); do eval "$aa; $bb"; done [[ ${7} == "low" ]] && for((i=$3; i>=$4; i--)); do eval "$aa; $bb"; done fi } cols=`tput cols` lines=`tput lines` clear DisFrame & DisFramePid=$! #DisSymbol $[lines/2-6] $[cols/2-34] 32 a='&&&&& & & && & & & & & & &&&&&&' b=' & & & & & & & & & & & & & & & & & ' c=' & &&&&& & & & && & &&& &&&&& & & & && &&&&&&' d=' & & & & & & & & & & & & & & & & ' e=' & & & && & & & & & & && & &&&&&&' abcde=(a b c d e) for((i=0; i<5; i++)); do eval echo -ne "\"\033[$(($[lines/2-6]+$i));$[cols/2-34]H\033[1;5;32m\$${abcde[i]}\033[0m\"" sleep 0.1 done echo -ne "\033[$[lines/2];$[cols/2-3]H\(==)/" i=1 col=$[cols/2-17] while [[ $i -le 35 ]]; do echo -ne "\033[$[lines/2+1];${col}H\033[45m \e[0m" echo -ne "\033[$[lines/2+3];${col}H\033[45m \e[0m" sleep 0 (( i+=1 )) (( col+=1 )) done strings="Made by LingYi" col=$[cols/2-6] for ((a=0;a<=${#strings}-1;a++)); do for((i=$[cols-2]; i>=$col; i--)); do echo -ne "\033[$[lines/2+2];${i}H\033[1;33m${strings:a:1}\033[0m" [[ $i -ne $col ]] && echo -ne "\033[$[lines/2+2];${i}H\033[1;$33m \033[0m" done let col++ done strings='Are You Ready ? [Y/N]' col=$[cols/2-10] for ((a=0;a<=${#strings}-1;a++)); do [[ $[RANDOM%2] -eq 0 ]] && { PrintChar2 "${strings:a:1}" 0 $[lines/2+4] $[lines/2+5] $col 31 upper left } || PrintChar2 "${strings:a:1}" 0 $[lines-2] $[lines/2+5] $col 31 low left let col++ done while :; do echo "ynq" | grep -q ${ch:-H} && { kill -10 ${DisFramePid} &>/dev/null break } echo -ne "\033[$[lines/2+5];$[cols/2-10]H\033[1;31mAre You Ready ? [Y/N]" read -s -n 1 ch ch=$(echo ${ch} | tr 'A-Z' 'a-z') done
当然,游戏画面也得够炫
介绍下游戏里的功能和右侧各组件
实现的功能:
1、首先在定义的位置中随机显示敌方坦克(位置、方向、颜色皆是随机)
2、W、A、S、D 和上下左右按键实现玩家坦克移动
3、玩家坦克可使用空格、回车按键发射炮弹
4、“P”键暂停游戏,“C”键继续游戏
5、敌方坦克会在随机时刻发射炮弹
6、实现积分、自动升级等功能,并可以通过按键手动调节(U:升级 L:降级)。
各组件的功能:
1、游戏上方边界中的文字是滚动播放的
2、右侧显示的坦克模型为当下敌方坦克生成时的状态,随时更新
3、“Score”和“level” 显示分数和等级
4、“state”显示游戏的状态,有暂停、游戏中和游戏结束三种状态。
5、“Mode”显示的是坦克的状态(相应外挂是否开启)
6、“Infore”打印各种功能按键的介绍信息,随机时刻随机更新
7、“LingYi”有字符串和高效图标组成,随机时刻随机组合,颜色同样随机
8、“Dtime”显示当前日期和时间,1s更新一次
关于外挂(四种):
“F”键:当前敌方坦克自爆
“G”键:隐身模式,无视撞击和炮弹,开启后颜色变为游戏边界颜色(开启/关闭)
“V”键:上帝模式,相比隐身模式,开启后可通过撞击消灭敌方坦克,颜色变为红色(开启和关闭)
“N”键:KillS模式,满屏自爆,爽歪歪(开启)
“M”键:KillS模式(关闭)
注:上帝模式开启后,无视隐身模式,若后前先开启,则可同时开启。
三种模式可同时开启
如果你跟我一样无聊,又对我的代码有兴趣,建议先看看以下好玩的代码,因为游戏源代码太多,一开始还好,后边写着写着就没耐心了,连为变量起名字都是件头疼的事,所以。。。。。很快我也可能看不懂了。。。。
首先(code1):
for((i=1; i<=`tput lines`; i++)) do for((j=1;j<=`tput cols`; j++)) do echo -ne "\033[${i};${j}H\033[4$((RANDOM%7+1))m \033[0m" done done
有点挫, 来个同步的(code2)
for((i=1; i<=`tput lines`; i++)) do for((j=1;j<=`tput cols`; j++)) do echo -ne "\033[${i};${j}H\033[4$((RANDOM%7+1))m \033[0m" done & done
对code1进行按键控制 (code3)
Just_Kidding() { local i j stop_loop=false trap 'stop_loop=true' 10 for((i=1; i<=`tput lines`; i++)) do for((j=1;j<=`tput cols`; j++)) do $stop_loop && break 2 echo -ne "\033[${i};${j}H\033[4$((RANDOM%7+1))m \033[0m" done done } Just_Kidding & just_kidding_pid=$! trap '' 2 tput civis stty -echo while : do read -s -n 1 key key=`echo $key | tr 'a-z' 'A-Z'` [[ $key == 'S' ]] && kill -10 $just_kidding_pid [[ $key == 'Q' ]] && { kill -10 $just_kidding_pid &>/dev/null; echo; break; } done tput cnorm stty echo
注释: S停止输入, Q退出脚本。
实现对code2的控制(code4):
Print() { local j local stop_print=false trap 'stop_print=true' 30 for((j=1;j<=`tput cols`; j++)) do $stop_print && break echo -ne "\033[${1};${j}H\033[4$((RANDOM%7+1))m \033[0m" done } Just_Kidding() { local p i pids=() local stop_just_kidding=false trap 'stop_just_kidding=true' 10 while : do for((i=1; i<=`tput lines`; i++)) do $stop_just_kidding && break Print $i & pids=(${pids[@]} $!) done while : do $stop_just_kidding && { for((p=0; p<${#pids[@]}; p++)) do kill -30 ${pids[p]} &>/dev/null done break 2 } sleep 0.5 done done } Just_Kidding & just_kidding_pid=$! #trap '' 2 tput civis stty -echo while : do read -s -n 1 key key=`echo $key | tr 'a-z' 'A-Z'` [[ $key == 'S' ]] && kill -10 $just_kidding_pid [[ $key == 'Q' ]] && { kill -10 $just_kidding_pid &>/dev/null; break; } done echo tput cnorm stty echo
注释: S停止输入, Q退出脚本。
对code2实现暂停和继续的控制(code5):
Print() { local j local stop_print=false local pause_print=false trap 'stop_print=true' 10 trap 'pause_print=true' 11 trap 'pause_print=false' 12 for((j=1;j<=`tput cols`; j++)) do $stop_print && break while $pause_print; do $stop_print && break 2; done echo -ne "\033[${1};${j}H\033[4$((RANDOM%7+1))m \033[0m" done } Just_Kidding() { local p i pids=() local stop_just_kidding=false local pause_just_kidding=false trap 'stop_just_kidding=true' 10 trap 'pause_just_kidding=true' 11 trap 'pause_just_kidding=false; pause_kidding 12' 12 pause_kidding() { for((p=0; p<${#pids[@]}; p++)) do kill -$1 ${pids[p]} &>/dev/null done } while : do for((i=1; i<=`tput lines`; i++)) do $stop_just_kidding && break $pause_just_kidding && { pause_kidding 11 while $pause_just_kidding; do $stop_just_kidding && break; done } Print $i & pids=(${pids[@]} $!) done while : do $stop_just_kidding && { for((p=0; p<${#pids[@]}; p++)) do kill -10 ${pids[p]} &>/dev/null done break } $pause_just_kidding && { pause_kidding 11 while $pause_just_kidding; do $stop_just_kiddingb && break; done } sleep 0.5 done done } pause_or_run() { if_pause=${if_pause:-false} ! $if_pause && { kill -11 $just_kidding_pid if_pause=true return } || { kill -12 $just_kidding_pid if_pause=false } } Just_Kidding & just_kidding_pid=$! trap '' 2 tput civis stty -echo while : do read -s -n 1 key key=`echo $key | tr 'a-z' 'A-Z'` [[ $key == 'S' ]] && kill -10 $just_kidding_pid [[ $key == 'P' ]] && pause_or_run [[ $key == 'Q' ]] && { kill -10 $just_kidding_pid &>/dev/null; break; } done tput cnorm stty echo
注:P暂停和继续, S停止,Q退出
问题:
最后一部分代码(code5),每次执行退出后,后台会有一个进程仍然在运行,找出原因吧 !
如果你有了答案,游戏代码基本可以忽略了。
下载链接:×××
转载于:https://blog.51cto.com/lingyi/1762864