• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

小游戏AB猜数字

武飞扬头像
yspg_217
帮助1

这个游戏由来已久。记得我小学的时候流行过电子词典,就是袖珍版的笔记本电脑。主要功能是查英语单词的翻译。记得当时我手里这款里边有几种小游戏,现在还记得的有一个养猫游戏,每天给它喂食、给它球玩之类的。另一个记得的就是这个猜数字的游戏,当时觉得还挺难的,经常无法通关。最近又在某视频平台看到有人玩,于是想拿出来再玩玩。

最近正好在整理 shell 编程相关的知识,就用 shell 写一个小游戏吧。正好这个游戏的逻辑不复杂。游戏名实在是忘了,就叫它AB猜数字吧,lol

先介绍一下游戏规则。每局游戏会生成一个随机排列的四位数字,四个数字不重复。玩家有8次机会给出自己的答案。如果数字和位置都正确,用A标记;如果数字正确但位置错误,用B标记。比如正确答案是2478,如果玩家给出的答案是1286,返回的标记是0A2B,如果玩家给出的答案是2487,返回的标记是2A2B。

好的,规则就这么一点儿。
下边来看一下代码实现逻辑:
第一步,生成随机四位数字作为正确答案:

# 创建数组,元素是0到9
num_array=( $(seq 0 9) )
# 定义一个变量amount, 生成随机数使用
amount=10
# 定义一个空数组 bingo,用来放置生成的四个数字
declare -a bingo
# 定义变量i, 作为循环变量
i=0

# 四次循环,因为答案是四个数字
while [ $i -lt 4 ]
do
	# num 是 1-10 的随机数
	num=$((RANDOM%amount))
	# n 是 以 num 为索引从数组中取出的一个数字(0到9)
	n=${num_array[$num]}
	# 如果在之前的循环中已经取出了数字,就直接进入下一次循环
	if [ -z "$n" ]
	then
		continue
	else
		# 将取出的数字存到数组 bingo 中
		bingo[$i]=$n
		# 将取出的数字从原数组中删除,避免出现重复数字
		unset 'num_array[$n]'
	fi
	# 索引自增
	(( i   ))
done
学新通

第二步,游戏进行:

# 记录A结果的变量
a_result=0
# 记录B结果的变量
b_result=0
# 记录游戏次数
count=0
# 整个进行阶段使用一个 while 循环包起来,最主要的功能是读取用户输入
while read -rp "请输入你的答案:" ans
do
	# 如果给出的答案不足四个数字,打印错误
	if [ ${#ans} -ne 4 ]
	then
		echo "格式错误"
		continue
	else
		# 这里用了双层 for 循环,分别比较正确答案和给出的答案的每一位数字是否相同
		for bingo_index in {0..3}
		do
			for ans_index in {0..3}
			do
				# 如果数字相同且位置也相同,记录A的结果的变量 a_result 自增1
				# 如果数字相同但位置不相同,记录B的结果的变量 b_result 自增1
				if [ "${bingo[$bingo_index]}" -eq "${ans:${ans_index}:1}" ]
				then
					if [ "$bingo_index" -eq "$ans_index" ]
					then
						(( a_result   ))
						break
					else
						(( b_result   ))
						break
					fi
				fi
			done
		done
		# 如果 a_result 等于4,也就是答案正确,游戏结束,打印恭喜玩家字样
		if [ "$a_result" -eq 4 ]
		then
			echo "恭喜你答对了!"
			exit 1
		else
			# 如果 a_result 不等于4,打印当前的答案状态,即xAyB,并打印剩余猜测次数
			echo "${a_result}A${b_result}B	加油!你还有$(( 7 - count ))次机会~"
		fi
		# 标记当前次数的变量 count 自增 1
		(( count   ))
		# 如果 count 等于8,也就是说这是最后一次,打印失败字样,并打印正确答案
		if [ "$count" -eq 8 ]
		then
			echo "你已经尝试8次了,挑战失败"
			echo "正确答案是:${bingo[*]}"
			exit 1
		fi
		# 每次循环之后清空 a_result 和 b_result
		a_result=0
		b_result=0
	fi
done
学新通

游戏截图:
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggebhg
系列文章
更多 icon
同类精品
更多 icon
继续加载