[Shell]贪吃蛇

MapHeight=19
MapWidth=17
SnakeLength=3
SnakeX=(2 3 4)
SnakeY=(5 5 5)
MoveDirection="Right"
Food=(7 14)
Map=(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9 
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9  
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9  
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9  
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9  
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9  
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9  
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9   
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9   
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9   
     1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 9 
     1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 9)

Show()
{
	#Map
	for Cell in "${Map[@]}"
	do
		case ${Cell} in
			0) printf " "  ;;
			1) printf "#"  ;;
			9) printf "\n" ;;
		esac
	done

	#Snake
	for ((i=0;i<${SnakeLength};i++))
	do
		tput cup ${SnakeY[i]} ${SnakeX[i]}
		echo "*"
	done

	#Food
	tput cup ${Food[0]} ${Food[1]}
	echo "0"
	
	tput cup 20 0
}

ArrayMove()
{
	for i in $(seq 0 $((SnakeLength-2)))
	do
		SnakeX[i]=${SnakeX[i+1]}
		SnakeY[i]=${SnakeY[i+1]}
	done
}

FoodGenerate()
{
	Food[1]=$((${RANDOM}%${MapHeight}))
	Food[0]=$((${RANDOM}%${MapWidth}))
}

Move()
{
	read -n 1 -t 0.2 input

	case $input in
		"s") MoveDirection="Down" ;;
		"w") MoveDirection="Up" ;;
		"a") MoveDirection="Left" ;;
		"d") MoveDirection="Right" ;;
	esac

	ArrayMove
	if [ "$MoveDirection" = "Right" ]; then
		((++SnakeX[$((SnakeLength-1))]))
	elif [ "$MoveDirection" = "Left" ]; then
                ((--SnakeX[$((SnakeLength-1))])) 
	elif [ "$MoveDirection" = "Up" ]; then
                ((--SnakeY[$((SnakeLength-1))])) 
	elif [ "$MoveDirection" = "Down" ]; then
                ((++SnakeY[$((SnakeLength-1))])) 
	fi

	if [ ${SnakeX[$((SnakeLength-1))]} -eq ${Food[1]} -a ${SnakeY[$((SnakeLength-1))]} -eq ${Food[0]} ]; then		
		SnakeX[${SnakeLength}]=${SnakeX[$((SnakeLength-1))]} 
                SnakeY[${SnakeLength}]=${SnakeY[$((SnakeLength-1))]} 
		if [ "$MoveDirection" = "Down" ]; then 
			SnakeY[${SnakeLength}]=${SnakeY[$((SnakeLength-1))]}+1
		elif [ "$MoveDirection" = "Up" ]; then
                        SnakeY[${SnakeLength}]=${SnakeY[$((SnakeLength-1))]}-1 
		elif [ "$MoveDirection" = "Right" ]; then
                        SnakeX[${SnakeLength}]=${SnakeX[$((SnakeLength-1))]}+1
		elif [ "$MoveDirection" = "Left" ]; then
                        SnakeX[${SnakeLength}]=${SnakeX[$((SnakeLength-1))]}-1
		fi
		((++SnakeLength))
		FoodGenerate
	fi
}

Main()
{
	while true
	do
		clear
		echo "w:up s:down a:left d:right"
		Show
		Move

		sleep 0.2
	done
}

Main

这个游戏还有些BUG没修复:

比如蛇撞到边界,

蛇自己撞自己等等,

但是可以供学习参考,

运行效果图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值