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怎么进行多元运算,哈哈哈哈