Linux\bash\Shell\vim使用while do循环制作猜拳小游戏 并是实现自动猜想

Shell使用while do循环制作猜拳小游戏

最近看《Linux就该这么学》这本书想了解一下,在while 条件循环语句章节中看见了一个猜价格小游戏示例,示例如下: Cai.sh

#!/bin/bash
SUIJISHU=$(expr $RANDOM % 1000)
COUNT=0
echo "商品实际价格在0~999,猜猜看是多少?"
while true
do
	read -p "请输入你猜的价格:" NUMBER
	let COUNT++
	if [ $NUMBER -eq $SUIJISHU ] ; then
		echo "恭喜你答对了!价格是"$SUIJISHU 
		echo "一共猜了$COUNT次"
		exit 0
	elif [ $NUMBER -gt $SUIJISHU ] ;then
		echo "猜高了!"
	else
		echo "太低了!"
	fi
done

实现效果: 使用 bash Cai.sh 命令运行

[root@VM-0-12-centos lei]# bash Cai.sh
商品实际价格在0~999,猜猜看是多少?
请输入你猜的价格:500
猜高了!
请输入你猜的价格:250
猜高了!
请输入你猜的价格:125
太低了!
请输入你猜的价格:200
猜高了!
请输入你猜的价格:190
猜高了!
请输入你猜的价格:180
猜高了!
请输入你猜的价格:170
猜高了!
请输入你猜的价格:160
猜高了!
请输入你猜的价格:150
猜高了!
请输入你猜的价格:140
猜高了!
请输入你猜的价格:130
太低了!
请输入你猜的价格:135
猜高了!
请输入你猜的价格:134
恭喜你答对了!价格是134
一共猜了13次

猜了13次才猜对,这游戏让我有种堵得慌的赶脚,那么我就在想,可不可以写一个机器自己来猜的脚本呢?

  首先我想的模式是我来只顶数字范围,机器来进行猜想,那么就有以下问题:
  机器每次输入的值怎么计算,肯定不能让计算机一个一个的去试错。那我所能想到的办法就是折中来试,首次猜想的价格应该为输入价格的一半,之后每次猜的价格应该加上或减去与上次价格的一半,公式:总结出来应该会有司重情况
  首次猜想价格:我输入的价格 / 2 = 当前价格
  猜想价格高了【不存在猜想低价时】:(我输入的价格 - 当前价格) / 2 = 新猜想价格
  猜想价格高了【存在猜想低价时】:当前价格 -(当前价格 - 低猜想价格)/ 2 = 新猜想价格
  猜想价格低了【不存在猜想高价时】:当前价格 +(我输入的价格 - 当前价格) / 2 = 新猜想价格
  猜想价格低了【存在猜想高价时】:当前价格 +(高猜想价格 - 当前价格)/ 2 = 新猜想价格

捋下逻辑,感觉可以,上手试验: Cai3.sh

#!/bin/nash
#read 接收控制台指令 并赋值给FANWEI
read -p "请输入数字猜想的范围:(请输入正整数)" FANWEI
#生成随机数 在你输入的范围里
SUIJISHU=$(expr $RANDOM % $FANWEI)
#声明次数
COUNT=0
#提示猜价格
echo "商品实际价格在0~$FANWEI之间,猜猜看是多少?"
#定义程序首次猜想的数字
SHOU=$(expr $FANWEI / 2)
#声明用于保存高价的变量
GAO=0
#声明用于保存低价的变量
DI=0
#开始while循环 条件是一直循环
while true
do
	#let是bash的计算工具 使每次循环次数+1
	let COUNT++
	#输出一下细节
	echo "第$COUNT次 范围在:$FANWEI  实际价格是:$SUIJISHU  当次出价为:$SHOU  高价是:$GAO  低价是:$DI"	
	#判断猜想的是否和随机数相等
	if [ $SHOU -eq $SUIJISHU ] ;
       	then
		echo "恭喜你答对了!价格是"$SUIJISHU
		echo "一共猜了$COUNT次"
		#退出循环
		exit 0
	#判断猜想的价格是否大于随机数
	elif [ $SHOU -gt $SUIJISHU ] ;
	then
		echo "猜高了!当前价格:$SHOU 实际价格:$SUIJISHU "
			#判断是否存在低价 如果不存在则为首次猜想价格
			if [ $DI -eq 0 ] ; then
				echo "首次猜想进入高价区"
				#记录高猜想的值
				GAO=$SHOU
				echo "计算下次猜想价格:$SHOU/2"
				#首次进入高价区直接数字切半再猜
				SHOU=$(expr $GAO / 2)
			#如果不为首次猜想
			else
				echo "进入高价区(存在上一次低价:$DI)"
				#记录高猜想值
				GAO=$SHOU
				#计算出高价与低价的区间
 				GAOA=$(expr $GAO - $DI)
				#把区间切半
				GAOO=$(expr $GAOA / 2)
				echo "计算下次猜想价格:$GAO-($GAO-$DI)/2"
                  		#高价减去区间的一半赋值给猜想数
				SHOU=$(expr $GAO - $GAOO)
			#结束高价区的判断
			fi
	#判断猜想的价格是否小于随机数
	elif [ $SHOU -lt $SUIJISHU ] ; 
	then
		echo "猜低了!当前价格:$SHOU 实际价格:$SUIJISHU "
			#判断是否存在高价 不存在则为首次猜想价格
			if [ $GAO -eq 0 ] ;
		       	then
				echo "首次猜想进入低价区"
				#记录低猜想值
				DI=$SHOU
				#使用输入的范围数减去低价格
	       			II=` expr $FANWEI - $DI `
				#II切半后可得出下次要增长的金额
				EI=` expr $II / 2 `	
				echo "计算下次猜想价格:$DI+($FANWEI-$DI)/2"
				#计算出下次出价数
				SHOU=$( expr $EI + $DI )
			#如果不是首次猜想价格
			else
				echo "进入低价区(存在上一次高价:$GAO)"
				DI=$SHOU
				DII=` expr $GAO - $DI `
				EI=` expr $DII / 2 `
				echo "计算下次猜想价格:$DI+($GAO-$DI)/2"
				SHOU=`expr $EI + $DI `
			#结束低价格判断
			fi
		else
			echo "操作有误,输入范围需在1~9999999999999999999 结束程序!"
			exit 0
	fi	
done

接下来运行结果:bash Cai3.sh

[root@VM-0-12-centos lei]# bash Cai3.sh
请输入数字猜想的范围:(请输入正整数)1000
商品实际价格在0~1000之间,猜猜看是多少?
第1次 范围在:1000  实际价格是:865  当次出价为:500  高价是:0  低价是:0
猜低了!当前价格:500 实际价格:865
首次猜想进入低价区
计算:500+(865-)/2 下次出价:750
第2次 范围在:1000  实际价格是:865  当次出价为:750  高价是:0  低价是:500
猜低了!当前价格:750 实际价格:865
首次猜想进入低价区
计算:750+(865-)/2 下次出价:875
第3次 范围在:1000  实际价格是:865  当次出价为:875  高价是:0  低价是:750
猜高了!当前价格:875 实际价格:865
进入高价区(存在上一次低价:750)
计算:875-(875-750)/2 下次猜想价格为:813
第4次 范围在:1000  实际价格是:865  当次出价为:813  高价是:875  低价是:750
猜低了!当前价格:813 实际价格:865
进入低价区(存在上一次高价:875)
计算:813+(875-813)/2 下次出价 :844
第5次 范围在:1000  实际价格是:865  当次出价为:844  高价是:875  低价是:813
猜低了!当前价格:844 实际价格:865
进入低价区(存在上一次高价:875)
计算:844+(875-844)/2 下次出价 :859
第6次 范围在:1000  实际价格是:865  当次出价为:859  高价是:875  低价是:844
猜低了!当前价格:859 实际价格:865
进入低价区(存在上一次高价:875)
计算:859+(875-859)/2 下次出价 :867
第7次 范围在:1000  实际价格是:865  当次出价为:867  高价是:875  低价是:859
猜高了!当前价格:867 实际价格:865
进入高价区(存在上一次低价:859)
计算:867-(867-859)/2 下次猜想价格为:863
第8次 范围在:1000  实际价格是:865  当次出价为:863  高价是:867  低价是:859
猜低了!当前价格:863 实际价格:865
进入低价区(存在上一次高价:867)
计算:863+(867-863)/2 下次出价 :865
第9次 范围在:1000  实际价格是:865  当次出价为:865  高价是:867  低价是:863
恭喜你答对了!价格是865
一共猜了9次

总结:

  因为我只是看看书只是简单了解了一下Shell,对参数的运算不是很了解,反正我试了好多种方法想把计算公式合并在一行,可总是
  报错,没办法我只能把 + - / 分开来写,如果有哪位懂得老兄可以评论指点一下,Shell怎么进行多元运算,哈哈哈哈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值