鱼C论坛

 找回密码
 立即注册
查看: 6751|回复: 16

[已解决]万事开头难!!猜数字*A*B

[复制链接]
发表于 2017-3-30 10:24:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

想写一个猜数字的游戏,规则如下:

1.电脑随机生成四个数字(不重复的),例如:2078

2.用户猜四个数字,例如:8053

3.将用户的输入与电脑生成的数字进行比对,返回结果:
         位置和值都对,返回A
         位置不对,值对,返回B
         例如:2078 和 8053 就返回 1A1B
4.给8次猜的机会,次数用完或者猜对(返回4A0B)则游戏结束

万事开头难,各位大神给指导指导思路!!
最佳答案
2017-3-30 12:40:30
我用python写了一个。
  1. import random
  2. computer = [str(i) for i in range(10)]
  3. random.shuffle(computer)
  4. computer = computer[:4]
  5. for num in range(8):
  6.     person = list(input('请输入4个数字,中间不用隔开:'))
  7.     a = 0
  8.     b = 0
  9.     for n, i in enumerate(person):
  10.         if i == computer[n]:
  11.             a += 1
  12.         elif i in computer:
  13.             b += 1
  14.     print('%dA%dB'%(a, b))
  15.     if a == 4:
  16.         print('你答对了,这4个数字是%s。'%','.join(computer))
  17.         break
  18. else:
  19.     print('8次机会用光,你没有答对,这4个数字是%s。'%','.join(computer))
  20.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-30 11:31:05 | 显示全部楼层
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list低位,输入的数也是这个排位,然后用in和not in 还有索引来比较值就能获取AB对应的值
C语言的话用字符数组存储,其他的跟python的大同小异
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 11:32:48 | 显示全部楼层
程序似乎是没问题^_^

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>

  4. void generate_abcd(int *a, int *b, int *c, int *d)
  5. {
  6.         *a = rand() % 10;

  7.         do
  8.         {
  9.                 *b = rand() % 10;
  10.         }
  11.         while(*b == *a);

  12.         do
  13.         {
  14.                 *c = rand() % 10;
  15.         }
  16.         while((*c == *a) || (*c == *b));

  17.         do
  18.         {
  19.                 *d = rand() % 10;
  20.         }
  21.         while((*d == *a) || (*d == *b) || (*d == *c));
  22. }

  23. void input_abcd(int *a, int *b, int *c, int *d)
  24. {
  25.         char buf[10];

  26.         printf("please input abcd:");
  27.         fgets(buf, 10, stdin);
  28.         sscanf(buf, "%c%c%c%c", (char *)a, (char *)b, (char *)c, (char *)d);

  29.         *a -= '0';
  30.         *b -= '0';
  31.         *c -= '0';
  32.         *d -= '0';
  33. }

  34. int main(void)
  35. {
  36.         int a = 0, b = 0, c = 0, d = 0;
  37.         int ua = 0, ub = 0, uc = 0, ud = 0;
  38.         int resualt_a = 0, resualt_b = 0;
  39.         int chance = 8; // 8次机会

  40.         srand((unsigned int)time(NULL));

  41.         generate_abcd(&a, &b, &c, &d);

  42.         while(chance)
  43.         {
  44.                 //printf("%d        %d        %d        %d\n", a, b, c, d); // 此代码用来作弊^_^


  45.                 resualt_a = 0;
  46.                 resualt_b = 0;

  47.                 printf("还有%d次机会\n", chance);
  48.                 input_abcd(&ua, &ub, &uc, &ud);

  49.                 if(a == ua) resualt_a++;
  50.                 if(b == ub) resualt_a++;
  51.                 if(c == uc) resualt_a++;
  52.                 if(d == ud) resualt_a++;

  53.                 if(resualt_a == 4)
  54.                 {
  55.                         printf("4A0B\n");
  56.                         printf("恭喜你,猜对了^_^\n");
  57.                         return 0;
  58.                 }

  59.                 if(a == ub) resualt_b++;
  60.                 if(a == uc) resualt_b++;
  61.                 if(a == ud) resualt_b++;
  62.                 if(b == ua) resualt_b++;
  63.                 if(b == uc) resualt_b++;
  64.                 if(b == ud) resualt_b++;
  65.                 if(c == ua) resualt_b++;
  66.                 if(c == ub) resualt_b++;
  67.                 if(c == ud) resualt_b++;
  68.                 if(d == ua) resualt_b++;
  69.                 if(d == ub) resualt_b++;
  70.                 if(d == uc) resualt_b++;

  71.                 printf("%dA%dB\n", resualt_a, resualt_b);

  72.                 chance--;
  73.         }

  74.         printf("很遗憾,答案是:\n");
  75.         printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);

  76.         return 0;
  77. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 12:14:21 | 显示全部楼层
人造人 发表于 2017-3-30 11:32
程序似乎是没问题^_^

谢啦!!   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 12:16:20 | 显示全部楼层
lumber2388779 发表于 2017-3-30 11:31
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list ...

谢啦!!   思路清晰了不少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 12:17:29 | 显示全部楼层
lumber2388779 发表于 2017-3-30 11:31
python的话用list就可以了,生成随机数的时候只要检测到list中没有就加入,一次加入一位数,高位的数在list ...

高位的数在list低位   怎么理解?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 12:40:30 | 显示全部楼层    本楼为最佳答案   
我用python写了一个。
  1. import random
  2. computer = [str(i) for i in range(10)]
  3. random.shuffle(computer)
  4. computer = computer[:4]
  5. for num in range(8):
  6.     person = list(input('请输入4个数字,中间不用隔开:'))
  7.     a = 0
  8.     b = 0
  9.     for n, i in enumerate(person):
  10.         if i == computer[n]:
  11.             a += 1
  12.         elif i in computer:
  13.             b += 1
  14.     print('%dA%dB'%(a, b))
  15.     if a == 4:
  16.         print('你答对了,这4个数字是%s。'%','.join(computer))
  17.         break
  18. else:
  19.     print('8次机会用光,你没有答对,这4个数字是%s。'%','.join(computer))
  20.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 13:55:43 | 显示全部楼层
mustang 发表于 2017-3-30 12:17
高位的数在list低位   怎么理解?

就是list[0]是千位 ,list[1]是百位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 13:56:28 | 显示全部楼层
冬雪雪冬 发表于 2017-3-30 12:40
我用python写了一个。

冬雪大神的代码总是如此简洁
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 14:51:12 | 显示全部楼层
  1. import random
  2. # 得到一个随机4个数字的列表
  3. secret = random.sample(range(10),4)
  4. #print(secret)
  5. # 给你8次机会
  6. times = 8
  7. while times:
  8.   # 获得一个4个数字的字符串
  9.   temple = input("请输入你的四个数字:")
  10.   # A,B分别代表满足条件的个数,起始为0
  11.   A = 0
  12.   B = 0
  13.   # i代表的是位置
  14.   for i in range(len(secret)):
  15.     # 满足位置和值都相同
  16.     if str(temple[i]) == str(secret[i]):
  17.       A +=1
  18.     # 满足值相同
  19.     if int(temple[i]) in secret:
  20.       B +=1
  21.   # 定义输入字符串
  22.   outstr = "{}A{}B".format(A,B)
  23.   print(outstr)
  24.   # 定义跳出循环条件
  25.   if outstr == "4A4B":
  26.     print("你只用了{}次机会就猜对了,厉害了我的皮皮虾!".format(9-times))
  27.     break
  28.   elif times == 1:
  29.     print("8次机会用完还没猜对,你这智商只适合玩王者荣耀,去吧皮卡丘!")
  30.   times -=1
复制代码


python代码,每个地方都加了注释
测试了一下,符合要求:
  1. [8, 3, 0, 2]
  2. 请输入你的四个数字: 1221
  3. 0A2B
  4. 请输入你的四个数字: 8302
  5. 4A4B
  6. 你用了2次机会就猜对了,厉害了我的皮皮虾!
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-3-30 15:32:38 | 显示全部楼层
gopythoner 发表于 2017-3-30 14:51
python代码,每个地方都加了注释
测试了一下,符合要求:

牛掰了,word皮皮虾!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-3-30 15:37:20 | 显示全部楼层
本帖最后由 mustang 于 2017-3-30 15:39 编辑
gopythoner 发表于 2017-3-30 14:51
python代码,每个地方都加了注释
测试了一下,符合要求:


题目中有个条件没申明清楚     
就是数字如果如果返回了A就不能再返回B     
例如:9527  和  9572     就返回    2A2B   而不能是  4A4B
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 16:10:22 | 显示全部楼层
python代码量确实好少。其实主要点在与4位数生成与比对,其他跟小甲鱼的猜猜心里想的数字基本一样,把数字比对解决就完成 了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 17:48:20 | 显示全部楼层
mustang 发表于 2017-3-30 15:37
题目中有个条件没申明清楚     
就是数字如果如果返回了A就不能再返回B     
例如:9527  和  9572   ...
  1. if int(temple[i]) in secret:
复制代码

那这句的if改成elif
  1. if outstr == "4A4B":
复制代码

这句改成if A ==4:
就行了,跟楼上的答案基本是一样的,只是写法有的地方不同而已
  1. [3, 1, 0, 4]
  2. 请输入你的四个数字: 3140

  3. 2A2B
  4. 请输入你的四个数字: 3104
  5. 4A0B
  6. 你只用了2次机会就猜对了,厉害了我的皮皮虾!
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-30 17:52:56 | 显示全部楼层
...公子 发表于 2017-3-30 16:10
python代码量确实好少。其实主要点在与4位数生成与比对,其他跟小甲鱼的猜猜心里想的数字基本一样,把数字 ...

错了,并不一定是一个数
按照题目要求只需要产生4个数字就行,那第一位可以是0,如果第一位是0的话就不能变成数字了
所以应该当成一个列表或者字符串来比较
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-3-31 09:25:04 | 显示全部楼层
本帖最后由 99592938 于 2017-3-31 09:33 编辑
  1. import random
  2. def rand():
  3.     li=[]
  4.     while len(li)<4:
  5.         if len(li)==0:
  6.             li.append(str(random.randint(1,9)))
  7.         else:
  8.             t=str(random.randint(0,9))
  9.             if not t in li:
  10.                 li.append(t)
  11.     return ''.join(li)

  12. def comparison(x,y):
  13.     if x==y:
  14.         print('恭喜回答正确,电脑想的就是:%d'%(int(x)))
  15.         print('游戏结束,祝你好运!')
  16.         return 0
  17.     a=b=0
  18.     l_temp=[]
  19.     for i in range(4):
  20.         if x[i]==y[i]:
  21.             a+=1
  22.         elif x[i] in y:
  23.             b+=1
  24.     print('不好意思,猜的不太对,给你个提示哟:%dA%dB' %(a,b))
  25.     return 1

  26. def isint(x):
  27.     while 1:
  28.         if len(set(x))!=len(x):
  29.             x=input('输入有重复数字,请重新输入:')
  30.         elif int(x) not in range(1000,10000):
  31.             x=input('输入的不是4位整数,请重新输入:')
  32.         else:
  33.             break
  34.     return x

  35. ran=rand()
  36. temp=str(input('请输入一个4位不重复的整数:'))
  37. num=isint(temp)
  38. chance=8
  39. while chance-1:
  40.     chance-=1
  41.     if comparison(ran,num):
  42.         num=input('你还有%d次机会,要把握好哦,再写一个数吧:' %(chance))
  43.         num=isint(num)
  44.     else:
  45.         break
  46. if comparison(ran,num):
  47.     print('你的机会用完了。\n若想继续猜,请给支付宝182****8896充值吧,一元一次机会哦。')
  48.     print('哈哈,玩笑啦,告诉你电脑怎么想的吧,她想的是:%d\n再见咯,祝你好运!'%(int(ran)))
复制代码

应该没啥问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-31 13:58:47 | 显示全部楼层
  1. #include <iostream>
  2. #include <cmath>
  3. #include <ctime>
  4. using namespace std;
  5. int num[4]={0};//答案数组
  6. int guess[4]={0};//用户输入的答案数组
  7. int inputnum=0;//用户输入
  8. int pos=0;//位置正确
  9. int bingo=0;//数字正确
  10. int chance=10;//几次机会
  11. int GetRandNum()//生成随机数字
  12. {
  13.         srand((unsigned int)time(0));
  14.         return rand()%10;
  15. }
  16. void GenerateResule()//生成4位0-9不重复答案
  17. {
  18.         int p=0;
  19.         int temp=0;
  20.         for (int i=0;i<4;i++)
  21.         {
  22.                 if(i==0)
  23.                 {
  24.                         num[0]=GetRandNum();
  25.                 }
  26.                 else
  27.                 {
  28.                         p=i;
  29.                         temp=GetRandNum();
  30.                         while(p)
  31.                         {
  32.                                 if (temp==num[--p])
  33.                                 {       
  34.                                         temp=GetRandNum();
  35.                                         p=i;
  36.                                 }
  37.                         }
  38.                         num[i]=temp;
  39.                 }
  40.         }
  41. }
  42. void ManageInput()//把用户输入的数字处理到数组里面
  43. {
  44.         cin>>inputnum;
  45.         for(int i=0;i<4;i++)
  46.         {
  47.                 guess[i]=inputnum/(int)pow(10.0,3-i);
  48.                 inputnum-=guess[i]*(int)pow(10.0,3-i);
  49.         }
  50. }
  51. int main(void)
  52. {
  53.         GenerateResule();
  54.         cout<<"请输入4位不重复0-9的数字:"<<endl;
  55.         ManageInput();
  56.         while(chance)
  57.         {
  58.                 for(int i=0;i<4;i++)
  59.                 {
  60.                         for (int j=0;j<4;j++)
  61.                         {
  62.                                 if (num[j]==guess[i] )
  63.                                 {
  64.                                         bingo++;
  65.                                 }

  66.                         }
  67.                         if (num[i]==guess[i])
  68.                         {
  69.                                 pos++;
  70.                         }
  71.                 }
  72.                 if (pos==4 && bingo==4)
  73.                 {
  74.                         cout<<"恭喜您猜中答案!"<<endl;
  75.                         break;
  76.                 }else
  77.                 {
  78.                         chance--;
  79.                         if(!chance)
  80.                         {
  81.                                 cout<<"10次都没猜中,只能GAME OVER了!!"<<endl;
  82.                                 break;
  83.                         }
  84.                         cout<<"猜中"<<bingo<<"个数字,有"<<pos<<"个数字位置正确。还有"<<chance<<"次机会..."<<endl;
  85.                         pos=0;
  86.                         bingo=0;
  87.                         ManageInput();
  88.                 }
  89.         }
  90.         system("pause");
  91.         return 0;
  92. }
复制代码


QQ截图20170331135508.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 01:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表