Chinaunix

标题: 自写的一个shell小游戏,猜数字 [打印本页]

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

代码如下
  1. #!/bin/bash

  2. clear
  3. echo
  4. echo "###################################################################"
  5. echo "#  this is a bash-shell game write by Email:breeze7086@gmail.com  #"
  6. echo "# the game called *digits*,and this version have repeated numbers #"
  7. echo "#                           version 1.0                           #"
  8. echo "###################################################################"
  9. echo -e "\n\n"

  10. declare INPUT
  11. declare PASSWORD
  12. declare A
  13. declare B
  14. declare X
  15. declare Y
  16. declare LOOP

  17. #This funtion init the variable PASSWORD that user need to guess
  18. init_password()
  19. {
  20.         PASSWORD=`echo $(($RANDOM%10000))`
  21.         echo $PASSWORD | grep '^[0-9]\{4\}$' >/dev/null 2>&1
  22.         if [ $? != 0 ]
  23.         then
  24.                 init_password
  25.         else
  26.                 input
  27.         fi
  28. }

  29. #This funtion accept the input from user's keyboard
  30. input()
  31. {
  32.         echo -n "please input a number between 0000-9999:"
  33.         read INPUT
  34.         echo $INPUT | grep '^[0-9]\{4\}$' >/dev/null 2>&1
  35.         if [ $? != 0 ]
  36.         then
  37.                 echo "retry a number between 0000-9999 and do not input a char"
  38.                 input
  39.         else
  40.                 judge
  41.         fi
  42. }

  43. #This funtion is the main funtion
  44. judge()
  45. {
  46.         X=$INPUT
  47.         Y=$PASSWORD
  48.         while [ $INPUT != $PASSWORD ]
  49.         do
  50.                 A=0
  51.                 B=0
  52.                 judge_a
  53.                 judge_b
  54.                 LOOP=`expr $LOOP + 1`
  55.                 echo "****************************"
  56.                 echo "*           "$A"A"$B"B           *"
  57.                 echo "****************************"
  58.                 input
  59.         done
  60. }

  61. #This funtion count the variable A's value
  62. judge_a()
  63. {
  64.                 for i in `seq 4`
  65.                 do
  66.                         VAR_INPUT=`expr substr "$X" $i 1`
  67.                         for j in `seq 4`
  68.                         do
  69.                                 VAR_PASSWORD=`expr substr "$Y" $j 1`
  70.                                 if [[ $VAR_INPUT = $VAR_PASSWORD && $VAR_INPUT != "" && $VAR_PASSWORD != "" && $i = $j ]]
  71.                                 then
  72.                                         A=`expr $A + 1`
  73.                                         X=`expr substr $X 1 "$[$i-1]"``expr substr $X "$[$i+1]" 4`
  74.                                         Y=`expr substr $Y 1 "$[$i-1]"``expr substr $Y "$[$i+1]" 4`
  75.                                         judge_a
  76.                                 fi
  77.                         done
  78.                 done
  79. }

  80. #This funtion count the variable B's value
  81. judge_b()
  82. {
  83.                 for i in `seq 4`
  84.                 do
  85.                         VAR_INPUT=`expr substr "$X" $i 1`
  86.                         for j in `seq 4`
  87.                         do
  88.                                 VAR_PASSWORD=`expr substr "$Y" $j 1`
  89.                                 if [[ $VAR_INPUT = $VAR_PASSWORD && $VAR_INPUT != "" && $VAR_PASSWORD != "" ]]
  90.                                 then
  91.                                         B=`expr $B + 1`
  92.                                         X=`expr substr "$X" 1 "$[$i-1]"``expr substr "$X" "$[$i+1]" 4`
  93.                                         Y=`expr substr "$Y" 1 "$[$j-1]"``expr substr "$Y" "$[$j+1]" 4`
  94.                                         judge_b
  95.                                 fi
  96.                         done
  97.                 done
  98. }

  99. #This is the begin of script
  100. LOOP=1
  101. init_password
  102. echo "#############################################"
  103. echo "#congratulations!You have tried $LOOP times!    #"
  104. echo "#        The password is $PASSWORD !             #"
  105. echo "#############################################"
复制代码
在本版学习了一段时间,sed和awk还不能熟练使用,所以这个脚本里面没有关于这两个工具的复杂应用
望各位牛人给予在下的脚本一些指点,谢谢了
作者: L_kernel    时间: 2010-11-25 21:09
  1. # declare INPUT
  2. # declare PASSWORD
  3. # declare A
  4. # declare B
  5. # declare X
  6. # declare Y
  7. # declare LOOP
复制代码
如果不是整数,或者数组操作,上面的声明其实没有必要的。
尝试用多种for循环。
我看到你尽是一种格式。
seq固然好用。直接用{n..m}也不错的。
我一般很少用i,j之类的,这样子做不到见名知义。shell变量嘛,长一点也没有啥关系。

以上也是菜鸟之间,不好之处,还请见谅。
作者: dibug    时间: 2010-11-25 22:49
高手~~~
作者: 昭襄王    时间: 2010-11-26 08:09
Soooooooo Looooooooong
作者: 论坛ID    时间: 2010-11-26 08:50
很不错啊,学习了
作者: breeze7086    时间: 2010-11-26 10:33
回复 2# L_kernel


   
谢谢仁兄指点!
我觉得shell脚本细节很多,算是比较难学的
不过有幸遇到了cu论坛,又来到了shell版,私以为shell版是cu总体水平最高的脚本语言子板了
每每看到牛人们一个awk或sed就搞定问题的时候都是钦佩不已。。。
要学的东西太多,关注cu,关注shell,努力成长
作者: L_kernel    时间: 2010-11-26 10:45
回复  L_kernel


   
谢谢仁兄指点!
我觉得shell脚本细节很多,算是比较难学的
不过有幸遇到了cu ...
breeze7086 发表于 2010-11-26 10:33



   
shell版是cu总体水平最高的脚本语言子板了


不是私以为,这是公认的。
作者: 昭襄王    时间: 2010-11-26 10:58
为什么我做羊驼书的章节习题总是和标准答案不一样
第10章的简单猜数字,我写的恶心代码
  1. #! /usr/bin/perl
  2. $number = int(1 + rand 100);
  3. print "keyin a number (int 1~100) : ";
  4. while (<>){
  5.   chomp;
  6.   ($_ =~ m/quit|exit|^$/) && last ;
  7.   ($_ =~ m/\d+/) or print "key in a number ,please :\n" and next ;
  8.   $say = ($_ > $number) ? "Too hight" : ($_ < $number) ? "Too low" : "Right";
  9.   print "$say\n";
  10.   ($say eq "Right") && last;
  11.   print "re-keyin : "
  12. }
复制代码

作者: licong3399768    时间: 2015-06-08 09:19
X=`expr substr "$X" 1 "$[$i-1]"``expr substr "$X" "$[$i+1]" 4`
问一下,这个地方为什么是两个表达式?刚学shell




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2