shell做的简单游戏

贪吃蛇游戏

#!/bin/bash

declare -i x=5
declare -i y=5
declare -i len=4

declare -i x_arr=(1 2 3 4 5)
declare -i y_arr=(5 5 5 5 5)

dir='d'

init() {
	clear
	echo -e "\033[0m"
	echo -e "\033[4${2}m"
	echo -e "\033[4${1}m"
	echo -e "\033[?25l"
	gen_food
}

set_show() {
        clear
        for ((i = 1; i < $len; i++)); do
			echo -e "\033[${y_arr[$i]};${x_arr[$i]}H*\033[0m"
        done
		echo -e "\033[${y_arr[$i]};${x_arr[$i]}H$\033[0m"

		echo -e "\033[${randomy};${randomx}H#\033[0m"

		for ((i = 0; i <= 20; i++)); do
			echo -e "\033[20;${i}H@\033[0m"
			echo -e "\033[${i};20H@\033[0m"
		done

		echo -e "\033[21;0Hsnake:${x},${y}\033[0m"
		echo -e "\033[22;0Hfood :${randomx},${randomy}\033[0m"
}

move() {
        case $dir in
			"w") y=$y-1 ;;
			"s") y=$y+1 ;;
			"a") x=$x-1 ;;
			"q") exit ;;
			*) x=$x+1 ;;
		esac
		if [[ $x -eq $randomx && $y -eq $randomy ]]; then
			((len++))
			x_arr[$len]=$x
			y_arr[$len]=$y
			gen_food
			return
		fi

		if [[ $x -lt 1 || $y -lt 1 || $x -gt 19 || $y -gt 19 ]]; then
			exit;
		fi

		for ((i = 2; i <= $len; i++)); do
                if [[ $x -eq ${x_arr[$i]} && $y -eq ${y_arr[$i]} ]]; then
                	exit;
                fi
        done

        for ((i = 0; i <= $len; i++)); do
                x_arr[$i]=${x_arr[$i+1]}
                y_arr[$i]=${y_arr[$i+1]}
        done
        x_arr[$len]=$x
        y_arr[$len]=$y
}

gen_food() {
	let flag=1
	while [ $flag -eq 1 ]; do
		let randomx=$(($RANDOM%18+1))
		let randomy=$(($RANDOM%18+1))
		for ((i=0;i<len;i++)); do
			if [[ ${x_arr[$i]} -eq $randomx && ${y_arr[$i]} -eq $randomy ]]; then
				break
			fi
		done
		if [ $i -eq $len ]; then
			flag=0
		fi
	done
}

init
set_show
while :; do
        olddir=$dir
        if ! read -n 1 -t 0.5 -s dir; then
                dir=$olddir
        fi
        sleep 0.0001
        move
        set_show
done

echo -e "\033[0m"

执行过程
在这里插入图片描述

推箱子

#!/bin/bash
declare -i num
declare -i s

a=(
0 0 1 1 1 0 0 0 9 0 0 1 4 1 0 0 0 9 0 0 1 3 1 1 1 1 9 1 1 1 0 0 3 4 1 9 1 4 0 3 2 1 1 1 9 1 1 1 1 3 1 0 0 9 0 0 0 1 4 1 0 0 9 0 0 0 1 1 1 0 0 9
)

main(){
	while true
	do 
		clear
		echo "===================推箱子=================="
		echo "====游戏规则:将星星全部推到终结符处,即为胜利===="
		echo "==w:向上推 s:向下推 a:向左推 d:向右推 输入字符后回车执行=="
		show
		move
		np=0
		for n in ${!a[@]}
		do
			if [ ${a[$n]} -eq 3 ]; then
				np=$(( np+1 ))
			fi
		done
		if [ $np -gt 0 ]; then
			echo "continue"
		else
			break
		fi
	done
	echo "you are win!"	
}
show() 
{
	for data in "${a[@]}"; 
	do
		case $data in
			[0])
				printf " "
				#空白
				;;
			[1])
				printf "■"
				#墙
				;;
			[2])
				printf "♀"
				#人
				;;
			[3])
				printf "☆"
				#箱子
				;;
			[4])
				printf "◎"
				#终点
				;;
			[5])	
				printf "♂"
				#人+终点
				;;
			[6])
				printf "★"
				#箱子+终点
				;;
			[9])
				printf "\n"
				;;
		esac
	done		
}
function move()
{
	for i in ${!a[@]}
	do	
		if [ ${a[$i]} -eq 2 -o ${a[$i]} -eq 5 ]; then
			#找到自己
			num=$i
			break	
		fi
		
	done
	read dir
	case $dir in
		"w")
			#上
			if [ "${a[num-9]}" -eq 0  ]; then
				a[num-9]=2
				a[num]=0
			elif [ "${a[num-9]}" -eq 3 ]; then
				if [ "${a[num-18]}" -eq 0 ]; then
					a[num-9]=2
					a[num]=0
					a[num-18]=3
				elif [ "${a[num-18]}" -eq 4 ]; then
					a[num-9]=2
					a[num]=0
					a[num-18]=6
				fi
			elif [ "${a[num-9]}" -eq 4 ]; then
				a[num-9]=5
				a[num]=0
			fi
			;;
		"a")
			#左
			if [ "${a[num-1]}" -eq 0  ]; then
				a[num-1]=2
				a[num]=0
			elif [ "${a[num-1]}" -eq 3 ]; then
				if [ "${a[num-2]}" -eq 0 ]; then
					a[num-1]=2
					a[num]=0
					a[num-2]=3
				elif [ "${a[num-2]}" -eq 4 ]; then
					a[num-1]=2
					a[num]=0
					a[num-2]=6
				fi
			elif [ "${a[num-1]}" -eq 4 ]; then
				a[num-1]=5
				a[num]=0
			fi
			;;
		"d")
			#右
			if [ "${a[num+1]}" -eq 0  ]; then
				a[num+1]=2
				a[num]=0
			elif [ "${a[num+1]}" -eq 3 ]; then
				if [ "${a[num+2]}" -eq 0 ]; then
					a[num+1]=2
					a[num]=0
					a[num+2]=3
				elif [ "${a[num+2]}" -eq 4 ]; then
					a[num+1]=2
					a[num]=0
					a[num+2]=6
				fi
			elif [ "${a[num+1]}" -eq 4 ]; then
				a[num+1]=5
				a[num]=0
			fi
			;;	
		"s")
			#下
			if [ "${a[num+9]}" -eq 0  ]; then
				a[num+9]=2
				a[num]=0
			elif [ "${a[num+9]}" -eq 3 ]; then
				if [ "${a[num+18]}" -eq 0 ]; then
					a[num+9]=2
					a[num]=0
					a[num+18]=3
				elif [ "${a[num+18]}" -eq 4 ]; then
					a[num+9]=2
					a[num]=0
					a[num+18]=6
				fi
			elif [ "${a[num+9]}" -eq 4 ]; then
				a[num+9]=5
				a[num]=0
			fi
			;;	
	esac
}
main


执行过程
在这里插入图片描述

发布了12 篇原创文章 · 获赞 11 · 访问量 445

猜你喜欢

转载自blog.csdn.net/zmr123zmr/article/details/104672312