设为首页 收藏本站
查看: 2532|回复: 0

脚本游戏之三: 坦克大战

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-4-18 09:49:07 | 显示全部楼层 |阅读模式
一个游戏不管好不好,开始界面一定不能太挫
wKioL1bVcpHgc2IAAAA5KI8vZ9I086.png
不要以为这是静态的,会动的。。。。
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
DisFrame()
{
    stop=false
    trap "stop=true" 10
    while ! $stop
    do
        for ((i=1; i<=cols;    i++)); do
            echo -ne "[1;${i}H[4$((RANDOM%6+1))m "
        done
        for ((i=2; i<=lines;   i++)); do
            echo -ne "[${i};${cols}H[4$((RANDOM%6+1))m "
        done
        for ((i=cols-1; i>=1 ; i--)); do
            echo -ne "[${lines};${i}H[4$((RANDOM%6+1))m "
        done
        for ((i=lines-1; i>=2; i--)); do
            echo -ne "[${i};1H[4$((RANDOM%6+1))m "
        done
        for ((i=2; i<=cols-1;  i++)); do
            echo -ne "[2;${i}H[4$((RANDOM%6+1))m "
        done
        for ((i=2; i<=lines-1; i++)); do
            echo -ne "[${i};$[cols-1]H[4$((RANDOM%6+1))m "
        done
        for ((i=cols-2; i>=2;  i--)); do
            echo -ne "[$[lines-1];${i}H[4$((RANDOM%6+1))m "
        done
        for ((i=lines-2; i>=2; i--)); do
            echo -ne "[${i};2H[4$((RANDOM%6+1))m "
        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 "[${i};${5}H[1;${6}m$1"; sleep $2'
    bb='[[ $i -ne $4 ]] && echo -ne "[${i};${5}H[1;${6}m "'
    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 "\"[$(($[lines/2-6]+$i));$[cols/2-34]H$${abcde}\""
    sleep 0.1
done

echo -ne "[$[lines/2];$[cols/2-3]H(==)/"

i=1
col=$[cols/2-17]
while [[ $i -le 35 ]]; do
    echo -ne "[$[lines/2+1];${col}H e[0m"
    echo -ne "[$[lines/2+3];${col}H 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 "[$[lines/2+2];${i}H${strings:a:1}"
        [[ $i -ne $col ]] && echo -ne "[$[lines/2+2];${i}H[1;$33m "
    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 "[$[lines/2+5];$[cols/2-10]HAre You Ready ? [Y/N]"
    read -s -n 1 ch
    ch=$(echo ${ch} | tr 'A-Z' 'a-z')
done



当然,游戏画面也得够炫
wKiom1bVchrQMkqDAAA-2PxqWgY416.png

介绍下游戏里的功能和右侧各组件
实现的功能:
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更新一次
关于外挂(四种): ciya.gif

“F”键:当前敌方坦克自爆
wKioL1bVcpHBp_mDAAA9aWWyWiw755.png
“G”键:隐身模式,无视撞击和炮弹,开启后颜色变为游戏边界颜色(开启/关闭)
wKiom1bVchrQG8BfAABBnvr3ov0177.png
“V”键:上帝模式,相比隐身模式,开启后可通过撞击消灭敌方坦克,颜色变为红色(开启和关闭)
wKioL1bVcpHDEo5vAAA8sFwSrpc124.png
“N”键:KillS模式,满屏自爆,爽歪歪(开启)
wKiom1bVchqhXuqBAABDTstcyWI741.png

“M”键:KillS模式(关闭)
注:上帝模式开启后,无视隐身模式,若后前先开启,则可同时开启。
三种模式可同时开启
wKioL1bVcpGi_ZMdAABChucXKOI648.png

如果你跟我一样无聊,又对我的代码有兴趣,建议先看看以下好玩的代码,因为游戏源代码太多,一开始还好,后边写着写着就没耐心了,连为变量起名字都是件头疼的事,所以。。。。。很快我也可能看不懂了。。。。
首先(code1):
1
2
3
4
5
6
7
for((i=1; i<=`tput lines`; i++))
do
        for((j=1;j<=`tput cols`; j++))
        do
                echo -ne "[${i};${j}H[4$((RANDOM%7+1))m "        
        done
done



有点挫, 来个同步的(code2)
1
2
3
4
5
6
7
for((i=1; i<=`tput lines`; i++))
do
        for((j=1;j<=`tput cols`; j++))
        do
                echo -ne "[${i};${j}H[4$((RANDOM%7+1))m "        
        done &
done



对code1进行按键控制 (code3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 "[${i};${j}H[4$((RANDOM%7+1))m "        
                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):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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 "[${1};${j}H[4$((RANDOM%7+1))m "
        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):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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 "[${1};${j}H[4$((RANDOM%7+1))m "
        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),每次执行退出后,后台会有一个进程仍然在运行,找出原因吧 !

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


下载链接:源码下载 TankGame.rar (151.2 KB, 下载次数: 9)


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-205471-1-1.html 上篇帖子: 脚本游戏之二: 贪吃蛇游戏新版 下篇帖子: 脚本应用之一: 查找并删除重复文件 坦克大战 游戏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表