分享
 
 
 

Shell写的贪吃蛇游戏

王朝other·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

忙一下午,终于出来了

在我的redhat8.0上运行通过。

游戏键:

上:w, i

下:s, k

左:a, j

右:d, l

退出:q

[code:1:327d008a38]

#!/bin/bash

function DetectInput

{

while [[ 1 ]]

do

c=""

read -n 1 c

echo -ne "\r \r"

if [[ $c == "a" || $c == "j" || $c == "A" || $c == "J" ]]

then

kill -36 $pidShowSnake

elif [[ $c == "w" || $c == "i" || $c == "W" || $c == "I" ]]

then

kill -37 $pidShowSnake

elif [[ $c == "d" || $c == "l" || $c == "D" || $c == "L" ]]

then

kill -38 $pidShowSnake

elif [[ $c == "s" || $c == "k" || $c == "S" || $c == "K" ]]

then

kill -39 $pidShowSnake

elif [[ $c == "q" || $c == "Q" ]]

then

echo Quit.

kill -40 $pidShowSnake

exit

fi

done

}

function AllExit

{

kill -40 $pidShowSnake

exit

}

if [[ $1 != "--showsnake" ]]

then

eval $0" --showsnake "$$"&"

trap "exit" TERM

trap "AllExit" INT

pidShowSnake=$!

DetectInput

exit

else

pidCtlSnake=$2

fi

echo sub

iSpeed=500 #time interval in millisecond

iDirection=0 #1-left, 2-up, 3-right, 4-down

iWidth=15

iHeight=15

iX=(6 7 8)

iY=(7 7 7)

iMap=()

iS=0 #Start pointer in iX

(( iTotalBox = iWidth * iHeight ))

for (( i = 0; i < iTotalBox; i++ ))

do

(( iMap[$i] = 0 ))

done

function RandomHeader

{

(( iNew = RANDOM % ( iTotalBox - ${#iX[@]} ) ))

for (( iNewP = 0, i = 0; iNewP < iTotalBox && i < iNew; iNewP++))

do

if (( ${iMap[$iNewP]} != 1 )); then (( i++ )); fi

done

while (( ${iMap[$iNewP]} == 1 )); do (( iNewP++ )); done

(( iNewX = iNewP % iWidth ))

(( iNewY = (iNewP - iNewX) / iWidth ))

echo -ne "\33[1m\33[35m"

(( pX = 2 * iNewX + iLeft + 1 ))

(( pY = iNewY + iTop + 1 ))

echo -ne "\33["$pY";"$pX"H[]"

echo -ne "\33["$iCursor";1H"

echo -ne "\33[0m"

}

function InitDraw

{

clear

(( iTop = 1 ))

(( iBottom = iTop + iHeight + 1 ))

(( iLeft = 1 ))

(( iRight = iLeft + iWidth + iWidth + 1 ))

(( iCursor = iBottom + 1 ))

echo -ne "\33[1m\33[32m"

for (( i = iLeft + 1; i < iWidth + iWidth + iLeft + 1; i++ ))

do

echo -ne "\33["$iTop";"$i"H="

echo -ne "\33["$iBottom";"$i"H="

done

for (( i = iTop; i < iHeight + iTop + 2; i++ ))

do

echo -ne "\33["$i";"$iLeft"H|"

echo -ne "\33["$i";"$iRight"H|"

done

echo -ne "\33["$iCursor";1H"

echo -ne "\33[0m"

echo -ne "\33[1m\33[33m"

for (( i = 0; i < ${#iX[@]}; i++ ))

do

(( pX = 2 * ${iX[$i]} + iLeft + 1 ))

(( pY = ${iY[$i]} + iTop + 1 ))

(( pM = ${iY[$i]} * iWidth + ${iX[$i]} ))

(( iMap[$pM] = 1 ))

echo -ne "\33["$pY";"$pX"H[]"

#echo ${iX[$i]}

done

echo -ne "\33["$iCursor";1H"

echo -ne "\33[0m"

RandomHeader

}

function ShiftSnake

{

(( iLastP = iS - 1 ))

if (( iLastP < 0 )); then ((iLastP = ${#iX[@]} - 1 )); fi

if (( iDir == 1 )) #left

then

(( iHX = ${iX[$iLastP]} - 1 ))

(( iHY = ${iY[$iLastP]} ))

elif (( iDir == 2 )) #up

then

(( iHX = ${iX[$iLastP]} ))

(( iHY = ${iY[$iLastP]} - 1 ))

elif (( iDir == 3 )) #right

then

(( iHX = ${iX[$iLastP]} + 1 ))

(( iHY = ${iY[$iLastP]} ))

elif (( iDir == 4 )) #down

then

(( iHX = ${iX[$iLastP]} ))

(( iHY = ${iY[$iLastP]} + 1 ))

fi

bOver=0

if (( iHX < 0 || iHY < 0 || iHX >= iWidth || iHY >= iHeight )); then bOver=1;fi

if (( bOver == 0 )); then

if (( ${iMap[iHY * iWidth + iHX]} == 1 )); then bOver=1; fi

fi

if (( bOver == 1 ))

then

kill $pidCtlSnake

(( iBottom = iBottom + 1 ))

echo -e "\33["$iBottom";0HGame over! (Score: "${#iX[@]}"00)\33[0m"

exit 0;

fi

#check if catch the new box

if (( iHX == iNewX && iHY == iNewY ))

then

for (( i = ${#iX[@]}; i > iS; i-- ))

do

(( iX[$i] = ${iX[$i - 1]} ))

(( iY[$i] = ${iY[$i - 1]} ))

done

(( iX[$iS] = iHX ))

(( iY[$iS] = iHY ))

(( iNextP = iS + 1 ))

if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi

echo -ne "\a"

RandomHeader

else

(( iNextP = iS + 1 ))

if (( iNextP >= ${#iX[@]} )); then iNextP=0; fi

#clear snake tailer

(( pX = 2 * ${iX[$iS]} + iLeft + 1 ))

(( pY = ${iY[$iS]} + iTop + 1 ))

(( pM = ${iY[$iS]} * iWidth + ${iX[$iS]} ))

(( iMap[$pM] = 0 ))

echo -ne "\33["$pY";"$pX"H "

(( iX[$iS] = iHX ))

(( iY[$iS] = iHY ))

fi

#draw snake header

echo -ne "\33[1m\33[33m"

(( pX = 2 * iHX + iLeft + 1 ))

(( pY = iHY + iTop + 1 ))

(( pM = iHY * iWidth + iHX ))

(( iMap[$pM] = 1 ))

echo -ne "\33["$pY";"$pX"H[]"

echo -ne "\33["$iCursor";1H"

echo -ne "\33[0m"

(( iS = iNextP ))

}

trap "if (( iDir != 3 && iDir != 0 )); then iDirection=1; fi" 36

trap "if (( iDir != 4 )); then iDirection=2; fi" 37

trap "if (( iDir != 1 )); then iDirection=3; fi" 38

trap "if (( iDir != 2 )); then iDirection=4; fi" 39

trap "exit" 40

InitDraw

(( iNanoSec = iSpeed * 1000000 ))

iTime="1"`date +"%S%N"`

while [[ 1 ]]

do

usleep 100000

iTimeNew="1"`date +"%S%N"`

#avoid iTimeNew < iTime when new minute comes

if (( iTimeNew < iTime ))

then

(( iTime = iTime - 60000000000 ))

fi

#detect the time interval

if (( iTimeNew - iTime < iNanoSec )); then continue; fi

iTime=$iTimeNew

iDir=$iDirection

if (( iDir != 0 ))

then

ShiftSnake

fi

done

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有