鱼C论坛

 找回密码
 立即注册
查看: 2042|回复: 75

[技术交流] Python:每日一题 175

[复制链接]
最佳答案
869 
发表于 2018-4-8 11:28:14 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
本帖最后由 冬雪雪冬 于 2018-4-9 19:36 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
本题目为 @shigure_takimi 提供。
计算机出一个四位数,各位数字不要重複,你猜这个四位数。
猜测的结果将会列在自己的猜测历史列表,并以A和B来表示结果。
A代表猜测的数字中,数字相同且位置也正确的个数。
B代表猜测的数字中,数字相同但位置不一样的个数。
举例来说,如果计算机出的的数字为1234,且你猜的数字为5283。
其中2被猜到且位置正确,3也被猜到但位置不对,所以结果会出现1A1B。
直至你猜对或输入q退出。

举例:(冒号后数字为用户输入的)
  1. 请输入不重複的四个数字, Q - 退出遊戲:4278
  2. HISTORY:
  3. 1. 4278 --> 0A2B
  4. 请输入不重複的四个数字, Q - 退出遊戲:4213
  5. HISTORY:
  6. 1. 4278 --> 0A2B
  7. 2. 4213 --> 0A2B
  8. 请输入不重複的四个数字, Q - 退出遊戲:4200
  9. 请输入不重複的四个数字, Q - 退出遊戲:4235
  10. HISTORY:
  11. 1. 4278 --> 0A2B
  12. 2. 4213 --> 0A2B
  13. 3. 4235 --> 1A1B
  14. 请输入不重複的四个数字, Q - 退出遊戲:
复制代码

请 @shigure_takimi 多跟一帖,给予奖励。

本帖被以下淘专辑推荐:

最佳答案
4 
发表于 2018-4-8 11:38:16 From FishC Mobile | 显示全部楼层
本帖最后由 Chase_Kas 于 2018-4-9 21:29 编辑

玩了几把发现要猜对还真的不简单,比较考验逻辑推理
  1. import random as r

  2. def random4():
  3.     a = r.sample('0123456789', k=4)
  4.     if a[0]==0:
  5.         return random4()
  6.     return ''.join([str(i) for i in a])

  7. def judge(input_num, randnum):
  8.     A, B = 0, 0
  9.     for i in range(4):
  10.         if input_num[i] == randnum[i]:
  11.             A += 1
  12.         if input_num[i] in randnum:
  13.             B += 1
  14.     return A, B

  15. if __name__ == '__main__':
  16.     i = 1
  17.     randnum = random4()
  18.     history = 'HISTORY:\n'
  19.     while True:
  20.         input_num = input('请输入不重复的四个数字,按Q退出:')
  21.         if len(set(input_num)) != 4:
  22.             continue
  23.         if input_num != 'Q':
  24.             result = judge(input_num, randnum)
  25.             history += '%d:%s --> %dA%dB\n' % (i, input_num, result[0], result[1])
  26.             print(history)
  27.             i += 1
  28.             if input_num == randnum:
  29.                 print('恭喜你答对了!答案就是:%s' % (input_num))
  30.                 break
  31.         else:
  32.             print('不玩了嘛...悄悄告诉你答案吧:%s' % (randnum))
  33.             break
复制代码

评分

参与人数 2荣誉 +4 鱼币 +4 贡献 +1 收起 理由
moc + 1 + 1 + 1
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
13 
发表于 2018-4-8 11:50:14 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-4-9 14:22 编辑
  1. import random

  2. rule = '''有一个四位数,各位数字不要重複,猜这个四位数。
  3. 猜测的结果将会列在自己的猜测历史列表,并以A和B来表示结果。
  4. A代表猜测的数字中,数字相同且位置也正确的个数。
  5. B代表猜测的数字中,数字相同但位置不一样的个数。
  6. 举例来说,如果对方的数字为1234,且你猜的数字为5283。
  7. 其中2被猜到且位置正确,3也被猜到但位置不对,所以结果会出现1A1B。
  8. '''
  9. def getRandomNumber():
  10.     number = ''
  11.     source = [str(i) for i in range(10)]
  12.     for i in range(4):
  13.         a = random.choice(source)
  14.         number += a
  15.         source.remove(a)
  16.     return number

  17. def checkInput(myGuess):
  18.     return myGuess.isdigit() and len(set(myGuess)) == 4

  19. def checkResult(randomNumber, myGuess):
  20.     countA = 0
  21.     countB = 0
  22.     for i in myGuess:
  23.         if i in randomNumber:
  24.             if myGuess.index(i) == randomNumber.index(i):
  25.                 countA += 1
  26.             else:
  27.                 countB += 1
  28.     return str(countA)+'A'+str(countB)+'B'

  29. def mainGame():
  30.     print(rule)
  31.     randomNumber = getRandomNumber()
  32.     history = []
  33.     while True:
  34.         myGuess = input('请输入不重複的四个数字, Q - 退出遊戲:')
  35.         if myGuess == 'Q' or myGuess == 'q':
  36.             print('退出遊戲!')
  37.             break
  38.         elif not checkInput(myGuess):
  39.             continue
  40.         elif myGuess == randomNumber:
  41.             print('Bingo!\n')
  42.             again = input('任意鍵再玩一次,Q - 退出遊戲:')
  43.             if again == 'Q' or again == 'q':
  44.                 print('退出遊戲!')
  45.                 break
  46.             else:
  47.                 mainGame()
  48.                 break
  49.         else:
  50.             result = checkResult(randomNumber, myGuess)
  51.             history.append([myGuess, result])
  52.             print('HISTORY:')
  53.             for i in range(len(history)):
  54.                 print(str(i+1)+'.', history[i][0], '-->', history[i][1])

  55. mainGame()
复制代码

1.png

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
13 
发表于 2018-4-8 11:53:35 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-4-8 11:55 编辑

大四被富士康面试,一个女的和我玩的这个游戏。
当时也不知道富士康是个什么企业,还好没被他录用。

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
冬雪雪冬 + 10 + 10

查看全部评分

最佳答案
254 
发表于 2018-4-8 12:59:02 | 显示全部楼层
本帖最后由 塔利班 于 2018-4-9 22:22 编辑
  1. from random import *
  2. tar=sample('0123456789',k=4)
  3. a,b='',1
  4. prompt=['HISTORY:']
  5. while True:
  6.     A=B=0
  7.     a=input('请输入不重複的四个数字, Q - 退出遊戲:')
  8.     if a=='q'or a=='Q':
  9.         break  
  10.     if len(set(a))!=4 or len(a)!=4:
  11.         continue
  12.     for i in range(4):
  13.         if a[i] in tar:
  14.             if a[i]==tar[i]:
  15.                 A+=1
  16.             else:
  17.                 B+=1
  18.     prompt.append('%d. %s-->%dA%dB'%(b,a,A,B))
  19.     for each in prompt:
  20.         print(each)
  21.     if list(a)==tar:
  22.         break
  23.     b+=1
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
32 
发表于 2018-4-8 14:12:19 | 显示全部楼层
cc=str(1234)
dd=1
HISTORY={}
HISTORY1=[]
while dd:
    AA=0
    BB=0
    yy=1
    while yy:
        bb= input('请输入不重复的四个数字')
        if bb=='q':
            print('结束')
            break
        tt =len(set(bb))
        if tt<=3:
            print('请不要输入重复的数字')
        if tt==4:
            yy-=1
        
    if bb=='q':
        break        
    for i in cc:
        if i in bb:
            BB+=1
            if cc.index(i)==bb.index(i):
                AA+=1
                BB -=1
    DD=str(AA)+'A'+str(BB)+'B'
    HISTORY[bb]=DD
    HISTORY1.append(bb)
    print('HISTORY:')
    for t in range(len(HISTORY1)):
        print(str(t+1)+'.'+HISTORY1[t]+'--->'+HISTORY[HISTORY1[t]])
    if AA==4:
        print('你猜对了游戏结束')
        break

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 正确答案不是随机的

查看全部评分

最佳答案
1 
发表于 2018-4-8 14:49:56 | 显示全部楼层
  1. import random as r
  2. def creatnum():
  3.     s = ''
  4.     while len(s) < 4:
  5.         a = str(r.randint(0,9))
  6.         if a not in s:s += a
  7.     return s

  8. def showhistory(lst):
  9.     n = len(lst)
  10.     if n == 0:
  11.         print('您还没有猜过数字.')
  12.     else:
  13.         print('-'*20,'历史记录','-'*20)
  14.         print('您一共猜过%d次,结果如下:'%n)
  15.         print('|%.4s|%.4s|%.4s|'%('次数','记录','结果'))
  16.         for i,k in enumerate(lst,1):
  17.             print('| %.2d |%.4s|%.4s|'%(i,k[0],k[1]))
  18.         print('-'*20,'继续游戏','-'*20)

  19. def guess(lst):
  20.     enternum = input('请输入想要猜的4位数字,输入【history】显示历史结果,输入【:q】退出游戏:')
  21.     while True:
  22.         if enternum in ('history','HOSTORY'):
  23.             showhistory(lst)
  24.             return None
  25.         elif enternum == ':q':
  26.             return 'q'
  27.         elif not enternum.isdigit():
  28.             enternum = input('您输入的不是数字,请重新输入:')
  29.         elif len(enternum) != 4:
  30.             enternum = input('您输入的不是4位数字,请重新输入:')
  31.         else:
  32.             return enternum

  33. def nummatch(enternum, guessnum):
  34.     A, B= 0,0,
  35.     for i in range(4):
  36.         if enternum[i] == guessnum[i]:
  37.             A += 1
  38.         if enternum[i] in guessnum:
  39.             B+= 1
  40.     s = '%dA%dB'%(A,B)
  41.     return [enternum, s]

  42. def main():
  43.     lst = list()
  44.     guessnum = creatnum()
  45.     print('测试:',guessnum)
  46.     print('-'*20,'游戏开始','-'*20)
  47.     while True:
  48.         enternum = guess(lst)
  49.         if enternum == None:
  50.             continue
  51.         elif enternum == 'q':
  52.             print('-'*20,'游戏退出', '-'*20)
  53.             break
  54.         elif enternum == guessnum:
  55.             print('恭喜你猜对了!数字正是%s!\n'%guessnum, '-'*20,'游戏结束', '-'*20)
  56.             break
  57.         else:
  58.             temp = nummatch(enternum,guessnum)
  59.             print('您猜的结果是:%s'%temp[1])
  60.             lst.append(temp)

  61. if __name__ == '__main__':
  62.     main()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
2 
发表于 2018-4-8 15:06:14 | 显示全部楼层
  1. import random

  2. data = int(''.join([str(i) for i in random.sample(range(0, 9), 4)]))

  3. guess = input("请输入不重复的四个数字,Q-退出游戏:")

  4. qd = data // 1000
  5. bd = data // 100 % 10
  6. sd = data // 10 % 10
  7. gd = data % 10
  8. data_list = [qd, bd, sd, gd]
  9. histroy = []

  10. while True:
  11.     if guess != 'Q' and guess != 'q':
  12.         if int(guess) != data:
  13.             qg = int(guess) // 1000
  14.             bg = int(guess) // 100 % 10
  15.             sg = int(guess) // 10 % 10
  16.             gg = int(guess) % 10
  17.             an, bn = 0, 0

  18.             for i, w in enumerate([qg, bg, sg, gg]):
  19.                 if w in data_list:
  20.                     if w == data_list[i]:
  21.                         an += 1
  22.                     else:
  23.                         bn += 1
  24.                         
  25.             histroy.append(guess + '-->' + str(an) + 'A' + str(bn) + 'B')
  26.             for i, each in enumerate(histroy):
  27.                 print(str(i+1) + '.' + each)

  28.             guess = input("请输入不重复的四个数字,Q-退出游戏:")
  29.         else:
  30.             print("太棒啦!猜对啦~")
  31.             break
  32.     else:
  33.         break
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
发表于 2018-4-8 15:35:47 | 显示全部楼层
  1. #判断是否有重复数字
  2. def isrepeated(string):
  3.     for each in string:
  4.         if string.count(each) > 1:
  5.             return True
  6.     return False


  7. #生成不重复数字的一个四位数
  8. import random as r
  9. while True:
  10.     secret = str(r.randint(1000,9999))
  11.     if isrepeated(secret):
  12.         continue
  13.     else:
  14.         break
  15. #判断猜测结果
  16. history = []
  17. while True:
  18.     temp = input('请输入不重复的四个数字,Q - 退出游戏:')
  19.     if temp == 'Q' or temp == 'q':
  20.         break
  21.     elif isrepeated(temp):
  22.         continue
  23.     elif temp == secret:
  24.         print('恭喜!猜对了!')
  25.         break
  26.     else:
  27.         a , b = 0 , 0
  28.         for i in range(4):
  29.             if temp[i] ==secret[i]:
  30.                 a += 1
  31.             else:
  32.                 if temp[i] in secret:
  33.                     b += 1
  34.         history.append('%s --> %dA%dB' %(temp,a,b))
  35.         print('HISTORY:')
  36.         length = len(history)
  37.         for i in range(length):
  38.             print('%d. %s' %(i+1,history[i]))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
发表于 2018-4-8 16:02:26 | 显示全部楼层
  1. import random as r

  2. history = []
  3. while True:
  4.     number = input("请输入一个不重复的四位数字:(q:退出):")
  5.     if number == 'q':
  6.         break
  7.     while True:
  8.         machine = str(r.randint(1234,9876))
  9.         if len(set(machine)) == 4:
  10.             break

  11.     a = 0
  12.     b = 0
  13.     if len(set(number)) == 4:
  14.         for i in range(4):
  15.             if machine[i] == number[i]:
  16.                 a += 1
  17.             else:
  18.                 if number[i] in machine:
  19.                     b += 1
  20.         result = number + " --> " + str(a)+'A'+str(b)+'B'
  21.         history.append(result)
  22.         print('HISTORY:')
  23.         for each in range(len(history)):
  24.             print(str(each+1)+'.',history[each])
  25.     else:
  26.         pass
复制代码

点评

每次输入时,正确答案都在变化  发表于 2018-4-9 20:51

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 答案正确不结束

查看全部评分

最佳答案
6 
发表于 2018-4-8 17:02:36 | 显示全部楼层
  1. # encoding: utf - 8
  2. # 计算机出一个四位数,各位数字不要重複,你猜这个四位数。
  3. # 猜测的结果将会列在自己的猜测历史列表,并以A和B来表示结果。
  4. # A代表猜测的数字中,数字相同且位置也正确的个数。
  5. # B代表猜测的数字中,数字相同但位置不一样的个数。
  6. # 举例来说,如果计算机出的的数字为1234,且你猜的数字为5283。
  7. # 其中2被猜到且位置正确,3也被猜到但位置不对,所以结果会出现1A1B。
  8. # 直至你猜对或输入q退出。
  9. import random


  10. # 用来判断猜中的个数与位置的个数
  11. def p(str1, str2):
  12.     a = 0
  13.     b = 0
  14.     for i in range(4):
  15.         if str2[i] == str1[i]:
  16.             a += 1
  17.         elif str2[i] in str1:
  18.             b += 1
  19.     return [a, b]


  20. # 产生四位数
  21. def creat_number():
  22.     while True:
  23.         a = str(random.randint(1234, 9876))
  24.         s = set(a)
  25.         if len(s) == 4:
  26.             break
  27.     return a


  28. def main():
  29.     print('--------guess number game--------')
  30.     result = creat_number()
  31.     #方便测试,给出答案
  32.     print(result)
  33.     his = []
  34.     playgame = True
  35.     while playgame:
  36.         guess_num = input('请输入你要猜的数:')
  37.         a = p(result, guess_num)
  38.         if a[0] == 4:
  39.             print('你猜对了,好厉害啊!')
  40.             print('请按Q退出游戏,其他再来一次')
  41.             if input() == 'q' or input == 'Q':
  42.                 playgame = False
  43.             else:
  44.                 result = creat_number
  45.                 his.clear()
  46.         else:
  47.             his.append([guess_num, a])
  48.             for i in range(len(his)):
  49.                 if i == 0:
  50.                     print("历史记录")
  51.                 print(his[i][0], "%dA%dB" % (his[i][1][0], his[i][1][1]))
  52. if __name__ == '__main__':
  53.     main()
复制代码

这次的不知道怎么样

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字没有提示

查看全部评分

最佳答案
0 
发表于 2018-4-8 17:03:24 | 显示全部楼层
  1. #生成各位数字不重复的4位随机数
  2. import random
  3. m=random.sample(range(9),4)
  4. t=1
  5. history=""
  6. for t in range(1,1000):
  7.     #输入一个各位数字不重复的4位数
  8.     numbers=input("请输入不重複的四个数字, Q - 退出遊戲:")
  9.    
  10.     if numbers=="Q" :
  11.         break
  12.     else:
  13.         n=list(numbers)
  14.         n=[int(x) for x in n]
  15.         #比较2个数列中重复元素的个数
  16.         comp1=[x for x in m if x in n]
  17.         c=len(comp1)
  18.         #比较2个数列中对应位置元素的个数
  19.         comp2=[i for i in range(1,5) if m[i-1]==n[i-1]]
  20.         a=len(comp2)
  21.         b=c-a
  22.         #输出结果
  23.         print("HISTORY:")
  24.         print(m,comp2)
  25.         str1="%d.%s --> %dA%dB\r\n"%(t,numbers,a,b)
  26.         history+=str1
  27.         print(history)
  28.         if a==4 and b==0:
  29.             print("您猜对了")
  30.             break
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字没有提示

查看全部评分

最佳答案
0 
发表于 2018-4-8 17:05:49 | 显示全部楼层
本帖最后由 Liuxiuneng 于 2018-4-8 17:13 编辑

lst = [1, 5, 8, 3]
while True:
    str1 = input('请输入4位不重复的数字,Q-退出游戏:')
    if str1.lower() == 'q':
        break
    else:
        x = 0
        y = 0
        lst1 = [int(i) for i in list(str1)]
        for i in range(4):
            if lst == lst1:
                x += 1
        print('%d A' % x)

        for j in lst:
            if j in lst1:
                y += 1
        print('%d B' % (y-x))
        if x == 4:
            print('您已成功猜对!')
            break

新手练练手,主要想看看大佬们的思路。

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字没有提示

查看全部评分

最佳答案
1 
发表于 2018-4-8 17:24:04 | 显示全部楼层
import random
from random import randint
def generateX():
    x1=randint(1,9)
    x2=randint(1,9)
    x3=randint(1,9)
    x4=randint(1,9)

    s=[x1,x2,x3,x4]

    while len(set(s))<4:
        x1=randint(1,9)
        x2=randint(1,9)
        x3=randint(1,9)
        x4=randint(1,9)
        s=[x1,x2,x3,x4]

    x=x1*1000+x2*100+x3*10+x4
    return x

def test(x,guess):
    x=int(x)
    guess=int(guess)
    a1=x//1000
    a2=(x-a1*1000)//100
    a3=(x-a1*1000-a2*100)//10
    a4=x%10

    g1=guess//1000
    g2=(guess-g1*1000)//100
    g3=(guess-g1*1000-g2*100)//10
    g4=guess%10

    s1=[a1,a2,a3,a4]
    s2=[g1,g2,g3,g4]
    c1=0
    c2=0
    if a1==g1:
        c1+=1
    if a2==g2:
        c1+=1
    if a3==g3:
        c1+=1
    if a4==g4:
        c1+=1
        
    if g1 in s1 and g1!=a1:
        c2+=1
    if g2 in s1 and g2!=a2:
        c2+=1
    if g3 in s1 and g3!=a3:
        c2+=1
    if g4 in s1 and g4!=a4:
        c2+=1
        
   
    return (str(c1)+'A'+str(c2)+'B')

   
        


x=generateX()
guess=0
h1=[]
h2=[]
while guess!='Q':
    guess=input('请输入4个不重复的数字,Q-退出游戏')
    if guess=='Q':
        break
      
    # 作弊测试入口
    if guess=='zb':
        print(x)
        continue
    #guess=int(guess)
    h3=test(x,guess)
    h1.append(guess)
    h2.append(h3)
    print('history:')
    for i in range(len(h1)):
        print(str(h1[i])+'---->'+str(h2[i]))
   
    if str(h2[i])=='4A0B':
        print('恭喜回答正确!')
        break

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字没有提示

查看全部评分

最佳答案
7 
发表于 2018-4-8 17:53:40 | 显示全部楼层
  1. '''
  2. 计算机出一个四位数,各位数字不要重複,你猜这个四位数。
  3. 猜测的结果将会列在自己的猜测历史列表,并以A和B来表示结果。
  4. A代表猜测的数字中,数字相同且位置也正确的个数。
  5. B代表猜测的数字中,数字相同但位置不一样的个数。
  6. 举例来说,如果计算机出的的数字为1234,且你猜的数字为5283。
  7. 其中2被猜到且位置正确,3也被猜到但位置不对,所以结果会出现1A1B。
  8. 直至你猜对或输入q退出。
  9. '''
  10. def notdf4Num(n):
  11.     if len(set(str(n)))!=4:
  12.         return True
  13.     else:
  14.         return False

  15. def guessNumAB(x,n):
  16.     listx=list(str(x))
  17.     listn=list(str(n))
  18.     lenn=len(listx)
  19.     cA=0
  20.     cB=0
  21.     for i in range(lenn):
  22.         if listx[i]==listn[i]:
  23.             cA=cA+1
  24.         elif listx[i] in listn:
  25.             cB=cB+1
  26.     return str(cA)+'A'+str(cB)+'B'
  27.         
  28.         
  29. def guessNum(n):
  30.     print('************Game Start,Good Luck!************')
  31.     i=1
  32.     strx=input("请输入不重複的四个数字, Q - 退出遊戲\n")
  33.     history='HISTORY:(A:数字和位置都对的个数,B:仅数字对的个数)\n'
  34.     while strx!='Q':
  35.         x=int(strx)
  36.         if notdf4Num(x):
  37.             strx=input('你输入的数有重复数!请重新输入不重複的四个数字:\n')
  38.             x=int(strx)
  39.         strAB=guessNumAB(x,n)
  40.         history=history+('%d. %d --> %s\n' %(i,x,strAB))
  41.         if x==n:
  42.             history=history+'\nCongratulations,your guess is right!'
  43.             print(history)
  44.             break
  45.         else:
  46.             print(history)
  47.         i=i+1
  48.         strx=input("请输入不重複的四个数字, Q - 退出遊戲\n")
  49.    

  50. guessNum(1789)
  51.         
  52.         
  53.         
  54.    
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 出题不是随机数

查看全部评分

最佳答案
0 
发表于 2018-4-8 17:58:00 | 显示全部楼层
  1. import random,sys
  2. number = str(random.randint(1000,9999))
  3. print(number)
  4. choise = False
  5. count = 0
  6. ture = 0
  7. ture1 = 0
  8. list1 = []
  9. list2 = []
  10. print('HISTORY')
  11. while not choise:
  12.     count += 1
  13.     temp = input('请输入不重複的四个数字, Q - 退出遊戲:')
  14.     if temp == number:
  15.         print('%d.%s--->%dA%dB'%(count,temp,4,0))
  16.         print('答对了')
  17.         sys.exit()
  18.     for i in range(len(str(temp))):
  19.         if temp[i] in number:
  20.             if temp[i] == number[i]:
  21.                 ture += 1
  22.             if temp[i] != number[i]:
  23.                 ture1 +=1
  24.             if i == 3:
  25.                 print('%d.%s--->%dA%dB'%(count,temp,ture,ture1))
  26.                 ture1 = 0
  27.                 ture = 0
  28.         elif i == 3:
  29.             print('%d.%s--->%dA%dB'%(count,temp,ture,ture1))
  30.     if temp == 'q' or temp == 'Q':
  31.         sys.exit()
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 输入重复数字没有提示

查看全部评分

最佳答案
5 
发表于 2018-4-8 18:20:34 | 显示全部楼层
  1. import random


  2. def is_input_legal(input_num):
  3.     try:
  4.         if 999 < int(input_num) < 10000 and len(input_num) == 4:
  5.             for num in input_num:
  6.                 if input_num.count(num) > 1:
  7.                     return False
  8.             else:
  9.                 return True
  10.         else:
  11.             return False
  12.     except:
  13.         return False


  14. def get_result(guess_num, computer_num):
  15.     numcount = 0
  16.     rightnumcount = 0
  17.     for index in range(4):
  18.         if guess_num[index] == str(computer_num)[index]:
  19.             rightnumcount += 1
  20.     for num in str(computer_num):
  21.         if num in guess_num:
  22.             numcount += 1

  23.     return (rightnumcount, numcount - rightnumcount)


  24. def game():
  25.     computer_num = random.randint(1023, 9876)
  26.     while True:
  27.         for num in str(computer_num):
  28.             if str(computer_num).count(num) > 1:
  29.                 computer_num = random.randint(1023, 9876)
  30.                 break
  31.         else:
  32.             break
  33.     print("系统产生数字(测试专用):", computer_num)
  34.     histroyguess = []
  35.     historyresult = []
  36.     while True:
  37.         input_num = input("请输入不重复的四个数字(按Q可退出游戏): ")
  38.         if input_num == 'q' or input_num == 'Q':
  39.             print("退出游戏,游戏结束!")
  40.             break
  41.         elif not is_input_legal(input_num):
  42.             print("您输入的数字有误,请重新输入!")
  43.             continue
  44.         else:
  45.             if get_result(input_num, computer_num)[0] == 4:
  46.                 print("BINGO! YOU ARE RIGHT!",end='')
  47.                 # while True:
  48.                 #     try:
  49.                 #         playerchoice = input("<'R'-重新开始 'Q'--退出游戏>:")
  50.                 #         if playerchoice == 'R'or playerchoice == 'r':
  51.                 #             game()
  52.                 #         elif playerchoice == 'Q' or playerchoice == 'q':
  53.                 #             break
  54.                 #     except:
  55.                 #         break
  56.                 break
  57.             histroyguess.append(input_num)
  58.             historyresult.append(get_result(input_num, computer_num))
  59.         print("HISTROY:")
  60.         for index in range(len(historyresult)):
  61.             print("%s --> %dA%dB" % (histroyguess[index], historyresult[index][0], historyresult[index][1]))


  62. if __name__ == "__main__":
  63.     game()
复制代码


注释掉的那段,放到顶层代码内实现游戏重开和退出比较好点。放在函数里,有问题。堆和栈可能都会溢出。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
11 
发表于 2018-4-8 18:57:01 | 显示全部楼层
  1. #!/usr/bin/env python
  2. #-*-coding:utf-8-*-

  3. def print_result(number,input_number):
  4.     cnt_a = 0;
  5.     cnt_b = 0;
  6.     list1 = [];
  7.     while number:
  8.         list1.append(number%10);
  9.         number = number // 10;
  10.         
  11.         
  12.     list2 = [];
  13.     while input_number:
  14.         list2.append(input_number%10);
  15.         input_number = input_number // 10;
  16.         
  17.     for i in range(4):
  18.         if list1[i] == list2[i]:
  19.             cnt_a += 1;
  20.                      
  21.     for i in range(4):
  22.         if (list2[i] in list1) and (list1[i] != list2[i]):
  23.             cnt_b += 1;
  24.    
  25.     return str(cnt_a) + 'A' + str(cnt_b) + 'B';


  26. def check(number):
  27.     list1 = [];
  28.     while number:
  29.         list1.append(number%10);
  30.         number = number // 10;
  31.     if len(set(list1)) == 4:
  32.         return True;
  33.     return False;
  34.         

  35.         
  36. if __name__ == '__main__':
  37.     while True:
  38.         number = input("请输入不重复的四个数字:");

  39.         if number == 'q':
  40.             print("程序结束")
  41.             break;
  42.         
  43.         if not check(int(number)):
  44.             print("非法输入,请重新输入");
  45.             continue;
  46.         
  47.         input_number = input("请输入你要猜的数字:");
  48.         while int(number) != int(input_number):
  49.             print(print_result(int(number),int(input_number)));
  50.             input_number = input("请输入你要猜的数字:");
  51.         print(print_result(int(number),int(input_number)));


  52. 为啥我感觉这例题中文字的叙述和那个代码中的history中的意思不一样呢,按照文字叙述中的程序写了一下
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 出题不是随机数,输入重复数字无提示

查看全部评分

最佳答案
65 
发表于 2018-4-8 18:57:11 | 显示全部楼层
本帖最后由 凌九霄 于 2018-4-9 08:40 编辑
  1. import random

  2. key = ''
  3. history = []


  4. def check(num):  # 检测用户输入是否合法
  5.     if num.isdigit() and len(num) == 4 and len(set(num)) == 4:
  6.         return True
  7.     else:
  8.         return False


  9. def randomnum():  # 随机生成4个不同数字的四位数
  10.     while True:
  11.         digitstr = str(random.randint(1000, 10000))
  12.         if len(set(digitstr)) == 4:
  13.             break
  14.     return digitstr


  15. def compare(anum, bnum):
  16.     A, B = 0, 0
  17.     for i in bnum:
  18.         if i in anum:
  19.             for j in anum:
  20.                 if i == j and bnum.index(i) == anum.index(j):
  21.                     A += 1
  22.                 elif i == j:
  23.                     B += 1
  24.     return str(A) + 'A' + str(B) + 'B'


  25. anum = randomnum()

  26. while key != 'Q':
  27.     key = input('\n请输入不重複的四个数字, Q - 退出遊戲:')
  28.     if check(key):
  29.         history.append('{0}-->{1}'.format(key, compare(anum, key)))
  30.         print('\nHISTORY:')
  31.         for i, v in enumerate(history):
  32.             print('{0:>2}.  {1}'.format(i + 1, v))
  33.         if key == anum:
  34.             print('\n恭喜你猜对了。')
  35.             break
复制代码

360截图20180408224616726.jpg

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

最佳答案
0 
发表于 2018-4-8 19:46:42 | 显示全部楼层
本帖最后由 yunying12321 于 2018-4-9 08:52 编辑
  1. import random, sys

  2. #随机生成一个4位数,4个数字均不同
  3. def NUM():
  4.     ss = str(random.randint(1,9))
  5.     while True:
  6.         m = str(random.randint(0, 9))
  7.         if m not in ss:
  8.             ss += m
  9.         if len(ss) == 4:
  10.             break

  11.     return ss

  12. #比较输入的数字和生成的数字
  13. def check_num(guess, target):
  14.     a = 0
  15.     b = 0
  16.     for i in range(4):
  17.         if guess[i] == target[i]:
  18.             a += 1
  19.         else:
  20.             if guess[i] in target:
  21.                 b += 1

  22.     return a,b

  23. def main():
  24.     target = NUM()
  25.     HISTORY = []
  26.     guess = []
  27.    
  28.     while True:
  29.         #检测输入的数字是否不重复,Q为退出游戏
  30.         while True:
  31.             oo = input('请输入不重复的四个数字,Q - 退出游戏:')
  32.             if len(set(oo)) == 4 and oo.isdigit():
  33.                 break
  34.             elif oo == 'Q':
  35.                 sys.exit()
  36.             elif oo == 'A':
  37.                 print('正确答案是:', target)      
  38.         guess.append(oo)
  39.         uu = check_num(oo, target)
  40.         if oo == target:
  41.             print('恭喜你答对了!!')
  42.             sys.exit()
  43.         HISTORY.append(uu)
  44.         print('HISTORY:')
  45.         for i in range(len(HISTORY)):
  46.             print('%d.%s --> %dA%dB' %((i+1), guess[i], HISTORY[i][0], HISTORY[i][1]))

  47. if __name__ == '__main__':
  48.     main()
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号 )

GMT+8, 2018-7-21 21:39

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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