一个游戏不管好不好,开始界面一定不能太挫


不要以为这是静态的,会动的。。。。
代码:

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),每次执行退出后,后台会有一个进程仍然在运行,找出原因吧 !

如果你有了答案,游戏代码基本可以忽略了。



下载链接:源码下载