鱼C论坛

 找回密码
 立即注册
查看: 2542|回复: 5

[已解决]单独 return npc,为什么?

[复制链接]
发表于 2021-2-19 09:46:12 | 显示全部楼层 |阅读模式

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

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

x
原题:
文曲星上的小游戏:猜一个四位数,没有相同数字.用户每猜一个数字,显示出“完全猜中的数字个数”和“猜中数字但位置错误的数字个数”,比如nAmB,数字n表示猜中的位置正确的数字个数,数字m表示数字正确而位置不对的数字个数。例如,正确答案为3864,如果用户猜8234,则显示:1A2B,数字1表示数字4及其位置猜对了,数字3和8这两个数字猜对了,但是位置没对,记为2B。然后,用户根据游戏提示的信息继续猜,直到猜中为止。设计思路产生随机数0-9,用列表存储以字符串类型的数字,不涉及计算 字符串 str,;输入数字,用while循环判断输入的数字是否符合要求,4个不同的数.列表转化集合用于删除列表中相同的值(即重复的数字).每猜一次计次数,可以设计成绩,越少用猜对,成绩越高.

答案:
  1. import random as r

  2. def creatNums(): # 定义一个函数,用于随机取数
  3.     n=4 # 一共需要取4次
  4.     numbers = [] # 设置一个空列表
  5.     while n: # 当 n 大于0时
  6.         number = str(r.randint(0,9)) # 随机取一个数
  7.         while number in numbers: # 当number出现时,重复了列表numbers中的数字时
  8.             number = str(r.randint(0,9)) # 二次,随机取一个数,循环至数字不重复
  9.         numbers.append(number) # 把 number 放入列表
  10.         n -= 1 # 放一个数,减少一次
  11.     return (numbers) # 返回 numbers

  12. def numjud(numbers, gnums): # 定义一个函数,用于评判(答案数字,猜测的数字)
  13.     i = npc = nc = 0 # 这三个值,起始值为零
  14.     for n in gnums: # 猜测中的每一个数字
  15.         if n in numbers: # 如果列表中,本数字存在
  16.             nc += 1 # 数字猜对的值加一
  17.             if numbers[i] == gnums[i]: # 如果列表中第0个数字值与位置与猜测值相同
  18.                 npc += 1 # 数字和位置均猜对,值加一
  19.                 nc -= 1 # 数字猜对的值,减回来一个
  20.         i += 1 # 向后移动一位,进行下一个判断
  21.     print('{}A{}B'.format(npc, nc))
  22.     return npc # 本句的必要性是什么?为何要单独返回 npc的值?而不需要返回 nc 的值?

  23. print('游戏开始,请你猜四个数字(0-9):')
  24. numbers = creatNums()
  25. npc = 0
  26. guesstimes = 0
  27. while npc<4:
  28.     while True: # 本句code,必要吗?不写,不能运行?
  29.         inputnums = input('请输入四个不同的数字:')
  30.         if len(inputnums) == 4 and inputnums.isdigit():
  31.             gnums = list(inputnums)
  32.             if len(set(gnums)) == 4:
  33.             # set() 函数,可创建无序不重复元素集
  34.                 break
  35.             else:
  36.                 print('数字不能重复')
  37.         else:
  38.             print('输入有误!')
  39.     gnums = list(inputnums)
  40.     npc = numjud(numbers, gnums)
  41.     guesstimes += 1
  42. if guesstimes < 8:
  43.     print('你真棒,用了{}次就猜对了'.format(guesstimes))
  44. else:
  45.     print('恭喜你,猜对了,用了{}次机会'.format(guesstimes))
  46. input('按回车退出。')

复制代码


我的问题:
第24句,return npc,的必要性是什么?为何要单独返回 npc的值?而不需要返回 nc 的值?
最佳答案
2021-2-22 12:22:08
  1. import random as r


  2. def creatNums(): # 随机取数
  3.     n=4 # 一共需要取4次
  4.     numbers = [] # 设置一个空列表
  5.     while n:
  6.         number = str(r.randint(0,9)) # 随机取数
  7.         while number in numbers: # 查重
  8.             number = str(r.randint(0,9))
  9.         numbers.append(number) # 把number放入列表
  10.         n -= 1
  11.     return (numbers) #以列表形式返回numbers


  12. def numjud(numbers, gnums): # 定义一个函数,用于评判(答案数字,猜测的数字)
  13.     i = 0
  14.     npc = 0  #全正确
  15.     nc = 0   #数对,位置错

  16.     for n in gnums: # 遍历猜测的列表
  17.         if n in numbers: # 如果列表中,本数字存在
  18.             nc += 1 # 数字猜对的值加一
  19.             if numbers[i] == gnums[i]: # 如果列表中第0个数字值与位置与猜测值相同
  20.                 npc += 1 # 数字和位置均猜对,值加一
  21.                 nc -= 1 # 数字猜对的值,减回来一个
  22.         i += 1 # 索引后移,i对应gnums内每个元素

  23.     print('{}A{}B'.format(npc, nc))   #这里已经把题目中要求的结果打印了出来
  24.     return npc    #返回值是否必要,关键看调用部分


  25. #调用
  26. print('游戏开始,请你猜四个数字(0-9):')
  27. numbers = creatNums()
  28. npc = 0      #显然,这里是在为接受npc的返回值做准备
  29. guesstimes = 0  
  30. while npc<4:   #没有全猜对
  31.     while True:      #这个死循环是必要的,必须输入满足所有条件(进入内层if)才执行break,跳出来,否则,就算跳出,inputnum也不符合要求
  32.         inputnums = input('请输入四个不同的数字:')
  33.         if len(inputnums) == 4 and inputnums.isdigit():  #确定输入无误
  34.             gnums = list(inputnums)
  35.             if len(set(gnums)) == 4:
  36.             # set() 函数,可创建无序不重复元素集
  37.                 break
  38.             else:
  39.                 print('数字不能重复')
  40.         else:
  41.             print('输入有误!')

  42.     gnums = list(inputnums)

  43.     npc = numjud(numbers, gnums)   #【*关键*】调用时,用npc接受返回值,后面没有再使用,所以就可有可无咯

  44.     guesstimes += 1 #外层while循环结束条件为全猜对,否则,才一次,记录一次次数,下面是输出次数


  45. if guesstimes < 8:
  46.     print('你真棒,用了{}次就猜对了'.format(guesstimes))
  47. else:
  48.     print('恭喜你,猜对了,用了{}次机会'.format(guesstimes))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-22 11:34:16 | 显示全部楼层
好像代码不太全
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-22 12:22:08 | 显示全部楼层    本楼为最佳答案   
  1. import random as r


  2. def creatNums(): # 随机取数
  3.     n=4 # 一共需要取4次
  4.     numbers = [] # 设置一个空列表
  5.     while n:
  6.         number = str(r.randint(0,9)) # 随机取数
  7.         while number in numbers: # 查重
  8.             number = str(r.randint(0,9))
  9.         numbers.append(number) # 把number放入列表
  10.         n -= 1
  11.     return (numbers) #以列表形式返回numbers


  12. def numjud(numbers, gnums): # 定义一个函数,用于评判(答案数字,猜测的数字)
  13.     i = 0
  14.     npc = 0  #全正确
  15.     nc = 0   #数对,位置错

  16.     for n in gnums: # 遍历猜测的列表
  17.         if n in numbers: # 如果列表中,本数字存在
  18.             nc += 1 # 数字猜对的值加一
  19.             if numbers[i] == gnums[i]: # 如果列表中第0个数字值与位置与猜测值相同
  20.                 npc += 1 # 数字和位置均猜对,值加一
  21.                 nc -= 1 # 数字猜对的值,减回来一个
  22.         i += 1 # 索引后移,i对应gnums内每个元素

  23.     print('{}A{}B'.format(npc, nc))   #这里已经把题目中要求的结果打印了出来
  24.     return npc    #返回值是否必要,关键看调用部分


  25. #调用
  26. print('游戏开始,请你猜四个数字(0-9):')
  27. numbers = creatNums()
  28. npc = 0      #显然,这里是在为接受npc的返回值做准备
  29. guesstimes = 0  
  30. while npc<4:   #没有全猜对
  31.     while True:      #这个死循环是必要的,必须输入满足所有条件(进入内层if)才执行break,跳出来,否则,就算跳出,inputnum也不符合要求
  32.         inputnums = input('请输入四个不同的数字:')
  33.         if len(inputnums) == 4 and inputnums.isdigit():  #确定输入无误
  34.             gnums = list(inputnums)
  35.             if len(set(gnums)) == 4:
  36.             # set() 函数,可创建无序不重复元素集
  37.                 break
  38.             else:
  39.                 print('数字不能重复')
  40.         else:
  41.             print('输入有误!')

  42.     gnums = list(inputnums)

  43.     npc = numjud(numbers, gnums)   #【*关键*】调用时,用npc接受返回值,后面没有再使用,所以就可有可无咯

  44.     guesstimes += 1 #外层while循环结束条件为全猜对,否则,才一次,记录一次次数,下面是输出次数


  45. if guesstimes < 8:
  46.     print('你真棒,用了{}次就猜对了'.format(guesstimes))
  47. else:
  48.     print('恭喜你,猜对了,用了{}次机会'.format(guesstimes))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-22 12:22:47 | 显示全部楼层
应该没问题了,解释都在注释里
如果还有问题可以继续提哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-22 13:28:46 | 显示全部楼层
谢谢高手的指点!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-22 13:29:34 | 显示全部楼层

客气啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-5 16:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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