shell开发贪吃蛇游戏

回复 收藏
    心血来潮就用一天的时间,使用shell脚本做了个贪吃蛇的游戏,就完成了基本功能,也没怎么测试,按 w s a d 实现上下左右  Ctrl+c 退出     帖子中拷贝的不知为啥报错,原版下载地址




#!/bin/bash
#
# 开发者 陈沛
# 时间 2015-12-02
# 版本 0.01
# 说明 贪吃蛇
#

# 定义地图的高度宽度
mapHigh=20
mapWidth=50

# 定义蛇的位置 1 0表示:1是x轴 0是y轴
snake=(1 0 2 0 3 0)

# 定义豆的位置
bean=(10 0 20 8 40 12 9 9 45 15)

# 蛇位置定义 初始向右
upDown=0
leftRight=1

# 进程PID
mapPid=1
optionPid=1


# 游戏初始化
function init() {
        echo $$ > /tmp/option_pid
        trap "gameExit;" 2 15
        trap "over;" 25
        clear
    stty -echo
    echo -ne "\033[?25l"

    return 0
}

# 游戏结束
function gameOver() {
        optionPid=$(cat /tmp/option_pid)
        kill -25 $optionPid
        mapPid=$(cat /tmp/map_pid)
        kill -9 $mapPid

    return 0
}

# 游戏退出
function gameExit() {
                mapPid=$(cat /tmp/map_pid)
                kill -9 $mapPid>/dev/null 2>&1

        stty $stty_save
        stty echo

        clear
                echo -ne "\033[?25h"
        exit 0
}

# 绘制游戏界面
function draw() {
        echo $$ > /tmp/map_pid
        clear

        trap "state w;" 25
    trap "state s;" 26
        trap "state a;" 27
    trap "state d;" 28

        for i in $(seq 1 $mapHigh)
        do
                for i in $(seq 1 $mapWidth)
                do
                        echo -ne "X"
                done

                echo ''

        done

        echo -ne "\n\n\n w|s|a|d表示上下左右  ctrl+c表示退出"

        drawSnake
        drawBean

        go

}

# 状态改变
function state() {

    case $1 in
    [w])
                if [ $upDown -eq 0 ]
                then
                        upDown=-1
                        leftRight=0
                fi
    ;;
    )
                if [ $upDown -eq 0 ]
                then
                        upDown=1
                        leftRight=0
                fi
    ;;
    [a])
                if [ $leftRight -eq 0 ]
                then
                        leftRight=-1
                        upDown=0
                fi
    ;;
    [d])
                if [ $leftRight -eq 0 ]
                then
                        leftRight=1
                        upDown=0
                fi
    ;;
    esac
}

# 绘制豆
function drawBean() {
        echo -ne "\033[${bean[1]};${bean[0]}H\033[41mX\033[0m"
        echo -ne "\033[${bean[3]};${bean[2]}H\033[41mX\033[0m"
        echo -ne "\033[${bean[5]};${bean[4]}H\033[41mX\033[0m"
        echo -ne "\033[${bean[7]};${bean[6]}H\033[41mX\033[0m"
        echo -ne "\033[${bean[9]};${bean[8]}H\033[41mX\033[0m"
}

# 绘制蛇
function drawSnake() {
        local len=$[${#snake[@]}-1]
        local j=0
        for i in $(seq 0 2 $len)
        do
                j=$[$i+1]
                echo -ne "\033[${snake[$j]};${snake[$i]}H\033[41mX\033[0m"
        done
}

# 蛇的游动
function go() {
        while : ;
        do
                sleep 0.5

                local len=$[${#snake[@]}-3]
                local j=0

                local a=${snake[$[$len+1]]}
                local b=${snake[$[$len+2]]}

                local c=$[$len+1]
                local d=$[$len+2]

                if  [[ $a -eq ${bean[0]} && $b -eq ${bean[1]} ]] ||
                        [[ $a -eq ${bean[2]} && $b -eq ${bean[3]} ]] ||
                        [[ $a -eq ${bean[4]} && $b -eq ${bean[5]} ]] ||
                        [[ $a -eq ${bean[6]} && $b -eq ${bean[7]} ]] ||
                        [[ $a -eq ${bean[8]} && $b -eq ${bean[9]} ]]
                then
                        local e=$[$len+3]
                        local f=$[$len+4]
                        snake[$e]=$[$a+$leftRight]
                        snake[$f]=$[$b+$upDown]

                else
                        echo -ne "\033[${snake[1]};${snake[0]}HX\033[0m"

                        for i in $(seq 0 2 $len)
                        do
                                j=$[$i+1]
                                local ii=$[$i+2]
                                local jj=$[$j+2]
                                snake[$i]=${snake[$ii]}
                                snake[$j]=${snake[$jj]}
                        done

                        snake[$c]=$[$a+$leftRight]
                        snake[$d]=$[$b+$upDown]
                fi

                drawSnake

                if [[ ${snake[$c]} -lt 0 || ${snake[$c]} -ge $mapWidth || ${snake[$d]} -lt 0 || ${snake[$d]} -ge $mapHigh ]]
                then
                        gameOver
                fi


        done
}

# 游戏相关操作选项
function options() {
        local key
                local sign
        while :
        do
                        read -s -n 1 key
                        mapPid=$(cat /tmp/map_pid)

                case $key in
                [wW])
                                        kill -25 $mapPid>/dev/null 2>&1
                ;;
                [sS])
                                        kill -26 $mapPid>/dev/null 2>&1
                ;;
                [aA])
                                        kill -27 $mapPid>/dev/null 2>&1
                ;;
                [dD])
                                        kill -28 $mapPid>/dev/null 2>&1
                ;;
                esac

        done

        return 0
}

function over() {

        clear
        echo GAMEOVER
}

if [[ "$1" == "display" ]]
then
        draw
        exit
else
                init
        bash $0 display&
                options
        exit
fi




2015-12-01 21:14 举报
已邀请:
0

汤小东

赞同来自:

有bug,wasd不能移动,程序终止不了,会卡死putty
0

陈沛

赞同来自:

汤小东 发表于 2015-12-3 23:42
有bug,wasd不能移动,程序终止不了,会卡死putty

我这边没有问题,你试试下载我给的shell文件,不使用帖子上贴出的shell脚本,帖子中贴出的shell脚本我也试过不知道为啥也报错!
0

汤小东

赞同来自:

陈沛 发表于 2015-12-6 21:15
我这边没有问题,你试试下载我给的shell文件,不使用帖子上贴出的shell脚本,帖子中贴出的shell脚本我也 ...

下载的文件OK
0

拉卡

赞同来自:

感谢分享这么强大的shell!
我运行(下载的sh文件)后,直接会出现4个点,吃完之后也不会再有其他点可以吃。。。
这个……正常吗??
centos6.7 i386
0

庚庚

赞同来自:

这小伙,可以噢!
0

旅行

赞同来自:

强大

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
  • 评分区间
  • 学分
  • -30 ~ 30
可选评分理由: