日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用shell编写的贪吃蛇游戏

發布時間:2025/4/16 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用shell编写的贪吃蛇游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?
#!/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 info () {?? //游戲結束時的提示信息
????? title=$1
????? content=$2
????? greeting=$3 printf "\33[31m"
printf "\33[11;17H------------------------------------------"
printf "\33[12;17H|?????? =======>>$title<<======?????? | "
printf "\33[13;17H|?????? $content????? |"
printf "\33[14;17H|?????? =======>>$greeting<<=======????? | "
printf "\33[15;17H------------------------------------------"
printf "\33[0m"
?????
}
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 - ${#iX[@]} * 10 )) #time interval in millisecond
iSpeed=800??? //初始化一些參數
iDirection=0 #1-left, 2-up, 3-right, 4-down
iWidth=17
iHeight=16
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 = 6 ))
(( iBottom = iTop + iHeight + 1 ))
(( iLeft = 1 ))
(( iRight = iLeft + iWidth + iWidth + 1 ))
(( iCursor = iBottom + 1 )) echo -ne "\033[31m"
echo -ne "\33[2;29H====ShowSnake===="
echo -ne "\33[5;15HGame Area"
echo -ne "\33[5;50HContent Area"
echo -ne "\33[32m"
for (( i = iLeft + 1; i < iWidth * 2 + iWidth * 2 + iLeft + 4; i++ ))
do
echo -ne "\33[1;"$i"H-"
echo -ne "\33[4;"$i"H-"
echo -ne "\33["$iTop";"$i"H-"
echo -ne "\33["$iBottom";"$i"H-"
done
for (( i = 1; i < iHeight + iTop + 2; i++ ))
do
echo -ne "\33["$i";"$iLeft"H|"
echo -ne "\33["$i";72H|"
if (( i > 3 ))
then
echo -ne "\33["$i";"$iRight"H|"
fi
if (( i == 7 )); then echo -ne "\33["$i";40HSorce :00";
elif (( i ==9 )); then echo -ne "\33["$i";40HSpeed :00s/m";
elif (( i ==11 )); then echo -ne "\33["$i";40HLevel :01";
elif (( i ==13 )); then echo -ne "\33["$i";40HAuthor:GTSC Hu Changwen";
elif (( i ==15 )); then echo -ne "\33["$i";40HMail? :hucw@dne.com.cn";
elif (( i ==17 )); then echo -ne "\33["$i";40HVer?? :2.0";
elif (( i ==19 )); then echo -ne "\33["$i";40HHelp? :[w]? up??? [s]? down";
elif (( i ==20 )); then echo -ne "\33["$i";40H?????? [a]? left? [d]? right"; fi;
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"
info "Game over" "You are a shit! Your Score: ${#iX[@]}00" "Thank You"
echo -e "\33["$iBottom";0H\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
echo -ne "\33[7;40HSorce :${#iX[@]}00\33[0m"
echo -ne "\33[9;40HSpeed :${speed}s/m???? \33[0m"
echo -ne "\33[11;40HLevel :${level} \33[0m"
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 )) #echo -e "\33["$iBottom";0HGame over! (Score: "${#iX[@]}"00)\33[0m"
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 #iTime="1"`date +"%S%N"` //控制貪吃蛇的移動速度
while ` 1 `
do
(( iNanoSec = iSpeed * 1000000 - ${#iX[@]} * 100 * 1000000 ))
if [ ${#iX[@]} -ge "3" ] & [ ${#iX[@]} -lt "10" ]; then
sleep 1
speed=1.0
level="1"
elif [ ${#iX[@]} -ge "10" ] & [ ${#iX[@]} -lt "20" ]; then
sleep 0.9
speed=0.9
level="2"
elif [ ${#iX[@]} -ge "20" ] & [ ${#iX[@]} -lt "30" ]; then
sleep 0.8
speed=0.8
level="3"
elif [ ${#iX[@]} -ge "30" ] & [ ${#iX[@]} -lt "40" ]; then
sleep 0.7
speed=0.7
level="4"
elif [ ${#iX[@]} -ge "40" ] & [ ${#iX[@]} -lt "50" ]; then
sleep 0.6
speed=0.6
level="5"
elif [ ${#iX[@]} -ge "50" ] & [ ${#iX[@]} -lt "60" ]; then
sleep 0.5
speed=0.5
level="6"
elif [ ${#iX[@]} -ge "60" ] & [ ${#iX[@]} -lt "70" ]; then
sleep 0.4
speed=0.4
level="7"
elif [ ${#iX[@]} -ge "70" ] & [ ${#iX[@]} -lt "80" ]; then
sleep 0.3
speed=0.3
level="8"
elif [ ${#iX[@]} -ge "90" ] & [ ${#iX[@]} -lt "100" ]; then
sleep 0.2
speed=0.2
level="9"
else [ ${#iX[@]} -ge "100" ]
sleep 0.05
level="10"
fi #iTimeNew="1"`date +"%S%N"` #avoid iTimeNew < iTime when new minute comes
#if (( iTimeNew < iTime ))
#then
#(( iTime = iTime - 600000000 ))
#fi #detect the time interval
#if (( iTimeNew - iTime < iNanoSec )); then continue; fi
#iTime=$iTimeNew iDir=$iDirection if (( iDir != 0 ))
then
ShiftSnake
fi
done
本文出自 51CTO.COM技術博客

轉載于:https://blog.51cto.com/51ctoterry/334910

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的用shell编写的贪吃蛇游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。