免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10206 | 回复: 8
打印 上一主题 下一主题

自写的一个shell小游戏,猜数字 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-25 15:35 |只看该作者 |倒序浏览
生成的密码和用户输入可以接受重复数字
所以相对一般规则的猜数字可能难度要大不少
本版本规则:
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还不能熟练使用,所以这个脚本里面没有关于这两个工具的复杂应用
望各位牛人给予在下的脚本一些指点,谢谢了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 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变量嘛,长一点也没有啥关系。

以上也是菜鸟之间,不好之处,还请见谅。

论坛徽章:
0
3 [报告]
发表于 2010-11-25 22:49 |只看该作者
高手~~~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2010-11-26 08:09 |只看该作者
Soooooooo Looooooooong

论坛徽章:
0
5 [报告]
发表于 2010-11-26 08:50 |只看该作者
很不错啊,学习了

论坛徽章:
0
6 [报告]
发表于 2010-11-26 10:33 |只看该作者
回复 2# L_kernel


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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2010-11-26 10:45 |只看该作者
回复  L_kernel


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



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


不是私以为,这是公认的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 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. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2015-06-08 09:19 |只看该作者
X=`expr substr "$X" 1 "$[$i-1]"``expr substr "$X" "$[$i+1]" 4`
问一下,这个地方为什么是两个表达式?刚学shell
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP