Peteryo01223 发表于 2021-2-19 09:46:12

单独 return npc,为什么?

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

答案:
import random as r

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

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

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



我的问题:
第24句,return npc,的必要性是什么?为何要单独返回 npc的值?而不需要返回 nc 的值?

昨非 发表于 2021-2-22 11:34:16

好像代码不太全

昨非 发表于 2021-2-22 12:22:08

import random as r


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


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

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

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


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

    gnums = list(inputnums)

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

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


if guesstimes < 8:
    print('你真棒,用了{}次就猜对了'.format(guesstimes))
else:
    print('恭喜你,猜对了,用了{}次机会'.format(guesstimes))

昨非 发表于 2021-2-22 12:22:47

应该没问题了,解释都在注释里
如果还有问题可以继续提哦

Peteryo01223 发表于 2021-2-22 13:28:46

谢谢高手的指点!

昨非 发表于 2021-2-22 13:29:34

Peteryo01223 发表于 2021-2-22 13:28
谢谢高手的指点!

客气啦
页: [1]
查看完整版本: 单独 return npc,为什么?