Shell游戏:迷宫
时间:2014-09-12 22:38 来源:http://bbs.chinaunix.net/ 作者:it
-
#!/bin/bash
-
-
-
Width=30
-
Height=15
-
PadX=10
-
PadY=5
-
-
-
P="\033[32mO\033[0m"
-
PB="\033[4m\033[32mO\033[0m\033[0m"
-
clear
-
-
function DrawBox(){
-
local i j inx iny outx outy
-
function DrawCell(){
-
local cell num i
-
cell=$1; num=$2; str=""
-
for((i=1;i<=$num;i++)); do str=$str$cell; done
-
echo "$str"
-
}
-
-
Bank=`DrawCell ' ' $PadX `
-
Line=`DrawCell "|_" $Width `
-
FirstLine=`DrawCell " _" $Width `
-
for((i=1;i<=$PadY;i++));do echo ;done
-
echo "$Bank$FirstLine"
-
for((j=1;j<=$Height;j++)); do echo "$Bank$Line|"; done
-
-
echo -ne "\033[$((PadY+2));$((PadX+1))H "
-
echo -ne "\033[$((PadY+Height+1));$((PadX+Width*2+1))H "
-
}
-
-
function CordToKey(){
-
local x y Max
-
Max=100
-
x=$1
-
y=$2
-
((x+=Max))
-
((y+=Max))
-
echo $x$y
-
}
-
-
function Values(){
-
local i j
-
for((i=PadX+2;i<=PadX+Width*2;i+=2))
-
do
-
for((j=PadY+2;j<=PadY+Height+1;j++))
-
do
-
values[`CordToKey $i $j`]="$i|$j"
-
buttom[`CordToKey $i $j`]="_"
-
done
-
done
-
}
-
-
-
function DirectionCK(){
-
local X Y D newX newY
-
X=$1; Y=$2
-
D=()
-
-
((newY=Y-1))
-
[[ ${values[`CordToKey $X $newY`]} =~ "\|" && $X -ne $((PadX+Width*2)) && $X -ne $((PadX+2)) ]] && D[${#D[*]}]=up
-
-
((newX=X-2))
-
[[ ${values[`CordToKey $newX $Y`]} =~ "\|" && $Y -ne $((PadY+2)) && $Y -ne $((PadY+Height+1)) ]] && D[${#D[*]}]=left
-
-
((newY=Y+1))
-
[[ ${values[`CordToKey $X $newY`]} =~ "\|" ]] && D[${#D[*]}]=down
-
-
((newX=X+2))
-
[[ ${values[`CordToKey $newX $Y`]} =~ "\|" ]] && D[${#D[*]}]=right
-
-
echo ${D[*]}
-
}
-
-
function DirectionBack(){
-
local k D Dtion Dirtion Dirtions
-
while :
-
do
-
X=${PathX[$step]}
-
Y=${PathY[$step]}
-
D=${PathD[$step]}
-
[[ ${cicle[`CordToKey $X $Y`]} == 1 ]] && { ((step--));continue;}
-
Dtion=(`DirectionCK $X $Y`)
-
Dirtion=${Dtion[@]%$D}
-
Dirtions=(`echo $Dirtion`)
-
ClearBack $step
-
cicle[`CordToKey $X $Y`]=1
-
[[ ${#Dirtions[*]} -gt 0 ]] && break
-
((step--))
-
done
-
Direction=(`echo ${Dirtions[*]}`)
-
((step--))
-
}
-
-
function CreatePath(){
-
local Wx Wy
-
PathX=()
-
PathY=()
-
PathD=()
-
CWallX=()
-
CWallY=()
-
ClearWalls=()
-
step=-1
-
((X=PadX+2))
-
((Y=PadY+2))
-
while :
-
do
-
Direction=(`DirectionCK $X $Y`)
-
-
[[ ${#Direction[*]} -eq 0 ]] && {
-
DirectionBack;
-
}
-
direction=${Direction[$RANDOM%${#Direction[*]}]}
-
oldX=$X
-
oldY=$Y
-
Wx=$X
-
Wy=$Y
-
((step++))
-
case $direction in
-
up)((Y--))
-
((Wy=Y))
-
;;
-
down)((Y++))
-
((Wy=Y-1))
-
;;
-
left)((X-=2))
-
((Wx=X+1))
-
;;
-
right)((X+=2))
-
((Wx=X-1))
-
;;
-
esac
-
values[`CordToKey $oldX $oldY`]="path"
-
values[`CordToKey $Wx $Wy`]="nowall"
-
PathX[$step]=$oldX
-
PathY[$step]=$oldY
-
PathD[$step]=$direction
-
CWallX[$step]=$Wx
-
CWallY[$step]=$Wy
-
[[ $X -eq $((PadX+Width*2)) && $Y -eq $((PadY+Height+1)) ]] && break
-
done
-
((step++))
-
[[ $X -eq $((PadX+Width*2)) ]] && ((Wy=Y-1))
-
[[ $Y -eq $((PadY+Height+1)) ]] && ((Wx=X-1))
-
CWallX[$step]=$Wx
-
CWallY[$step]=$Wy
-
}
-
-
function SetButtom(){
-
local n x y d
-
for((n=0;n<${#PathD[*]};n++))
-
do
-
x=${PathX[$n]}
-
y=${PathY[$n]}
-
d=${PathD[$n]}
-
[[ $d == "down" ]] && buttom[`CordToKey $x $y`]=""
-
((y--))
-
[[ $d == "up" ]] && buttom[`CordToKey $x $y`]=""
-
done
-
}
-
-
function SideRoadCK(){
-
local X Y D newX newY
-
X=$1; Y=$2
-
D=()
-
-
((newY=Y-1))
-
[[ ${values[`CordToKey $X $newY`]} =~ "\|" ]] && D[${#D[*]}]=up
-
-
((newX=X-2))
-
[[ ${values[`CordToKey $newX $Y`]} =~ "\|" ]] && D[${#D[*]}]=left
-
-
((newY=Y+1))
-
[[ ${values[`CordToKey $X $newY`]} =~ "\|" ]] && D[${#D[*]}]=down
-
-
((newX=X+2))
-
[[ ${values[`CordToKey $newX $Y`]} =~ "\|" ]] && D[${#D[*]}]=right
-
-
echo ${D[*]}
-
}
-
-
-
function CreateSideRoad(){
-
local loop num i p X Y Direction direction Wx Wy oldX oldY
-
loop=0
-
SidePath=()
-
SideWall=()
-
num=${#PathX[*]}
-
while :
-
do
-
((p=$RANDOM%num))
-
X=${PathX[$p]}
-
Y=${PathY[$p]}
-
((loop++))
-
while :
-
do
-
oldX=$X
-
oldY=$Y
-
Wx=$X
-
Wy=$Y
-
Direction=(`SideRoadCK $X $Y`)
-
[ ${#Direction[*]} -eq 0 ] && break
-
direction=${Direction[$RANDOM%${#Direction[*]}]}
-
case $direction in
-
up)((Y--))
-
((Wy=Y))
-
buttom[`CordToKey $X $Y`]=""
-
;;
-
down)((Y++))
-
((Wy=Y-1))
-
buttom[`CordToKey $oldX $oldY`]=""
-
;;
-
left)((X-=2))
-
((Wx=X+1))
-
;;
-
right)((X+=2))
-
((Wx=X-1))
-
;;
-
esac
-
values[`CordToKey $oldX $oldY`]="sideroad"
-
values[`CordToKey $Wx $Wy`]="nowall"
-
SidePath[${#SidePath[*]}]=$oldX
-
SidePath[${#SidePath[*]}]=$oldY
-
SideWall[${#SideWall[*]}]=$Wx
-
SideWall[${#SideWall[*]}]=$Wy
-
done
-
[ $loop -eq 30 ] && break
-
done
-
-
}
-
-
function ClearBack(){
-
local s X Y d
-
s=$1
-
X=${PathX[$s]}
-
Y=${PathY[$s]}
-
d=${PathD[$s]}
-
values[`CordToKey $X $Y`]="$X|$Y"
-
unset PathX[$s]
-
unset PathY[$s]
-
unset PathD[$s]
-
unset CWallX[$s]
-
unset CWallY[$s]
-
}
-
-
function ClearWall(){
-
local i x y
-
for((i=0;i<$step;i++))
-
do
-
x=${CWallX[$i]}
-
y=${CWallY[$i]}
-
echo -ne "\033[$y;${x}H "
-
done
-
}
-
-
function ClearSideWall(){
-
local i j x y
-
for((i=0;i<${#SideWall[*]};i+=2))
-
do
-
((j=i+1))
-
x=${SideWall[$i]}
-
y=${SideWall[$j]}
-
echo -ne "\033[$y;${x}H "
-
done
-
-
}
-
-
-
function MoveP(){
-
local X Y oldX oldY B
-
X=$1; Y=$2; oldX=$3; oldY=$4
-
-
B="\033[4m \033[0m"
-
-
if [[ ${buttom[`CordToKey $oldX $oldY`]} == "_" ]];then
-
echo -e "\033[$oldY;${oldX}H$B"
-
else
-
echo -e "\033[$oldY;${oldX}H "
-
fi
-
-
if [[ ${buttom[`CordToKey $X $Y`]} == "_" ]];then
-
echo -e "\033[$Y;${X}H$PB"
-
else
-
echo -e "\033[$Y;${X}H$P"
-
fi
-
if [[ $X -eq $((PadX+Width*2)) && $Y -eq $((PadY+Height+1)) ]];then
-
((WinX=PadX+Width/2))
-
((WinY=PadY+Height+3))
-
echo -e "\033[$WinY;${WinX}H\033[31mCongratulation,You Pass!\033[0m"
-
Exit
-
fi
-
}
-
-
function MoveXY(){
-
local D Wx Wy oldX oldY v b
-
D=$1
-
oldX=$MX
-
oldY=$MY
-
Wx=$MX
-
Wy=$MY
-
case $D in
-
x++)((Wx=MX+1))
-
v=${values[`CordToKey $Wx $Wy`]}
-
[[ $v != "nowall" || $MX -gt $((PadX+Width*2)) ]] && continue
-
((MX+=2))
-
;;
-
x--)((Wx=MX-1))
-
v=${values[`CordToKey $Wx $Wy`]}
-
[[ $v != "nowall" || $MX -lt $((PadX+2)) ]] && continue
-
((MX-=2))
-
;;
-
y++)b=${buttom[`CordToKey $MX $MY`]}
-
[[ $b == "_" || $MY -gt $((PadY+Height+1)) ]] && continue
-
((MY++))
-
;;
-
y--)((Wy=MY-1))
-
b=${buttom[`CordToKey $MX $Wy`]}
-
[[ $b == "_" || $MY -le $((PadY+2)) ]] && continue
-
((MY--))
-
;;
-
esac
-
MoveP $MX $MY $oldX $oldY
-
}
-
-
function Moving(){
-
((MX=PadX+2))
-
((MY=PadY+2))
-
if [[ ${buttom[`CordToKey $MX $MY`]} == "_" ]];then
-
echo -ne "\033[$MY;${MX}H$PB"
-
else
-
echo -ne "\033[$MY;${MX}H$P"
-
fi
-
sTTY=`stty -g`
-
echo -ne "\033[?25l"
-
trap "Exit" INT TERM
-
while :
-
do
-
read -s -n 1 key
-
[[ "$key" == "A" ]] && MoveXY y--
-
[[ "$key" == "B" ]] && MoveXY y++
-
[[ "$key" == "C" ]] && MoveXY x++
-
[[ "$key" == "D" ]] && MoveXY x--
-
done
-
-
}
-
function Exit(){
-
local x y
-
((y=PadY+Height+5))
-
echo -e "\033[?25h\033[${y};0H"
-
stty $sTTY
-
echo -ne "\033[$y;0H"
-
exit
-
}
-
-
Values
-
DrawBox
-
CreatePath
-
SetButtom
-
CreateSideRoad
-
ClearWall
-
ClearSideWall
-
Moving
复制代码
玩法:用方向键把小球移到右下角出口处即可。
注:迷宫地图生成比较慢,大约5秒左右,请耐心等候。
-
-

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
测试通过,大牛!!!
-
-

http://bbs.chinaunix.net/thread-3579315-1-1.html
(责任编辑:IT)
(责任编辑:IT) |