一个游戏不管好不好,开始界面一定不能太挫
不要以为这是静态的,会动的。。。。
代码:
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