心血来潮就用一天的时间,使用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
#!/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
0
我这边没有问题,你试试下载我给的shell文件,不使用帖子上贴出的shell脚本,帖子中贴出的shell脚本我也试过不知道为啥也报错!
汤小东 发表于 2015-12-3 23:42
有bug,wasd不能移动,程序终止不了,会卡死putty
我这边没有问题,你试试下载我给的shell文件,不使用帖子上贴出的shell脚本,帖子中贴出的shell脚本我也试过不知道为啥也报错!
编辑回复