当前位置: > shell编程 >

自写的一个shell小游戏,猜数字

时间:2014-09-12 22:40来源:linux.it.net.cn 作者:it
生成的密码和用户输入可以接受重复数字
所以相对一般规则的猜数字可能难度要大不少
本版本规则:
A--数字对,位置也对
B--排除A的结果后,数字对,但位置不对
开始后,系统化初始化一个4位可重复数字,如“1223”。假设用户第一次输入“1234”,那么系统将提示“2A1B”,前两位数字“12”相同并且位置也相同,为“2A”。后两位数字中,用户输入的“3”与密文中“3”相同,但两者位置不同,则为“1B”,最终结果为“2A1B”。
再假设用户此时输入“1232”,那么结果则为“2A2B”,计算方法与前次一样。

代码如下
  1. #!/bin/bash
  2.  
  3. clear
  4. echo
  5. echo "###################################################################"
  6. echo "#  this is a bash-shell game write by Email:breeze7086@gmail.com  #"
  7. echo "# the game called *digits*,and this version have repeated numbers #"
  8. echo "#                           version 1.0                           #"
  9. echo "###################################################################"
  10. echo -e "\n\n"
  11.  
  12. declare INPUT
  13. declare PASSWORD
  14. declare A
  15. declare B
  16. declare X
  17. declare Y
  18. declare LOOP
  19.  
  20. #This funtion init the variable PASSWORD that user need to guess
  21. init_password()
  22. {
  23.         PASSWORD=`echo $(($RANDOM%10000))`
  24.         echo $PASSWORD | grep '^[0-9]\{4\}$' >/dev/null 2>&1
  25.         if [ $? != 0 ]
  26.         then
  27.                 init_password
  28.         else
  29.                 input
  30.         fi
  31. }
  32.  
  33. #This funtion accept the input from user's keyboard
  34. input()
  35. {
  36.         echo -n "please input a number between 0000-9999:"
  37.         read INPUT
  38.         echo $INPUT | grep '^[0-9]\{4\}$' >/dev/null 2>&1
  39.         if [ $? != 0 ]
  40.         then
  41.                 echo "retry a number between 0000-9999 and do not input a char"
  42.                 input
  43.         else
  44.                 judge
  45.         fi
  46. }
  47.  
  48. #This funtion is the main funtion
  49. judge()
  50. {
  51.         X=$INPUT
  52.         Y=$PASSWORD
  53.         while [ $INPUT != $PASSWORD ]
  54.         do
  55.                 A=0
  56.                 B=0
  57.                 judge_a
  58.                 judge_b
  59.                 LOOP=`expr $LOOP + 1`
  60.                 echo "****************************"
  61.                 echo "*           "$A"A"$B"B           *"
  62.                 echo "****************************"
  63.                 input
  64.         done
  65. }
  66.  
  67. #This funtion count the variable A's value
  68. judge_a()
  69. {
  70.                 for i in `seq 4`
  71.                 do
  72.                         VAR_INPUT=`expr substr "$X" $i 1`
  73.                         for j in `seq 4`
  74.                         do
  75.                                 VAR_PASSWORD=`expr substr "$Y" $j 1`
  76.                                 if [[ $VAR_INPUT = $VAR_PASSWORD && $VAR_INPUT != "" && $VAR_PASSWORD != "" && $i = $j ]]
  77.                                 then
  78.                                         A=`expr $A + 1`
  79.                                         X=`expr substr $X 1 "$[$i-1]"``expr substr $X "$[$i+1]" 4`
  80.                                         Y=`expr substr $Y 1 "$[$i-1]"``expr substr $Y "$[$i+1]" 4`
  81.                                         judge_a
  82.                                 fi
  83.                         done
  84.                 done
  85. }
  86.  
  87. #This funtion count the variable B's value
  88. judge_b()
  89. {
  90.                 for i in `seq 4`
  91.                 do
  92.                         VAR_INPUT=`expr substr "$X" $i 1`
  93.                         for j in `seq 4`
  94.                         do
  95.                                 VAR_PASSWORD=`expr substr "$Y" $j 1`
  96.                                 if [[ $VAR_INPUT = $VAR_PASSWORD && $VAR_INPUT != "" && $VAR_PASSWORD != "" ]]
  97.                                 then
  98.                                         B=`expr $B + 1`
  99.                                         X=`expr substr "$X" 1 "$[$i-1]"``expr substr "$X" "$[$i+1]" 4`
  100.                                         Y=`expr substr "$Y" 1 "$[$j-1]"``expr substr "$Y" "$[$j+1]" 4`
  101.                                         judge_b
  102.                                 fi
  103.                         done
  104.                 done
  105. }
  106.  
  107. #This is the begin of script
  108. LOOP=1
  109. init_password
  110. echo "#############################################"
  111. echo "#congratulations!You have tried $LOOP times!    #"
  112. echo "#        The password is $PASSWORD !             #"
  113. echo "#############################################"
复制代码
在本版学习了一段时间,sed和awk还不能熟练使用,所以这个脚本里面没有关于这两个工具的复杂应用
望各位牛人给予在下的脚本一些指点,谢谢了 (责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容