Crossin的编程教室

标题: 猜密码游戏 [打印本页]

作者: crossin先生    时间: 2013-9-8 00:32
标题: 猜密码游戏
再来一个相对简单点的。

以前电子词典上有个游戏:要你猜一个4位密码,密码由0-9组成,不重复。猜对正确位置上的数字为A,猜到数字但位置不正确为B。每次显示答案中A和B的个数。

比如:密码是1234

猜2345,显示0A3B
猜4231,显示2A2B

直到显示4A0B的时候,游戏胜利。

以此为基础,做个游戏。

作者: Myk_cc    时间: 2013-9-8 13:36
本帖最后由 Myk_cc 于 2013-9-8 17:10 编辑

写了3个小时才完成,看来光看先生的课和模仿先生的代码是不够的啊,自己写个程序就发现困难重重好在最终还是完成了。。

上代码,由于用的手机流量就不截图了
  1. # !/usr/bin/python

  2. import random

  3. def comparsion(x, y):
  4.         A = 0
  5.         B = 0
  6.         for i in x:
  7.                 for j in y:
  8.                         if i == j:
  9.                                 if x[i] == y[j]:
  10.                                         A += 1
  11.                         else:
  12.                                 if x[i] == y[j]:
  13.                                         B += 1
  14.         return A, B

  15. s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  16. sl = random.sample(s, 4)
  17. Password = {0:'%d' % sl[0], 1:'%d' % sl[1], 2:'%d' % sl[2], 3:'%d' % sl[3]}

  18. while 1:
  19.         guess = raw_input('Please input your code : (4 numbers)')
  20.         a2 = int(guess[0])
  21.         b2 = int(guess[1])
  22.         c2 = int(guess[2])
  23.         d2 = int(guess[3])
  24.         Guess = {0:'%d' % a2, 1:'%d' % b2, 2:'%d' % c2, 3:'%d' % d2}
  25.         
  26.         a, b = comparsion(Password, Guess)
  27.         print '%dA%dB' % (a, b)
  28.         if a == 4:
  29.                 print 'You get it !'
  30.                 break
复制代码

作者: crossin先生    时间: 2013-9-8 16:02
Myk_cc 发表于 2013-9-8 13:36
写了3个小时才完成,看来光看先生的课和模仿先生的代码是不够的啊,自己写个程序就发现困难重重好在最终还 ...

Good Job!
运行了下,挺好的!

敢再进一步吗?
随便说说:比如用pygame做成图形界面?

有人挑战吗?
作者: test777    时间: 2013-9-12 21:58
pygame做图形界面看起来很麻烦啊,连输入框都要自己写么..   想想就觉得头大
  1. import random

  2. pwd_length = 4

  3. def create_pwd():
  4.     numbers = [0,1,2,3,4,5,6,7,8,9]
  5.     pwd = random.sample(numbers,pwd_length)
  6.     return pwd

  7. def check_pwd(pwd_user, pwd_sys):
  8.     nums = str(pwd_user)
  9.     ret = []
  10.     for i in range(pwd_length):
  11.         if int(nums[i]) == pwd_sys[i]:
  12.             ret.append('A')
  13.         elif int(nums[i]) in pwd_sys:
  14.             ret.append('B')
  15.         else:
  16.             ret.append(nums[i])
  17.     return ''.join(ret)

  18. def check_input(pwd):
  19.     if type(pwd) != type(0):
  20.         print('please type numbers')
  21.         return False

  22.     pwd = str(pwd)

  23.     if len(pwd) < pwd_length:
  24.         print('password is too short!')
  25.         return False

  26.     for i in range(len(pwd)):
  27.         if pwd.count(pwd[i]) > 1:
  28.             print('password has repeat number!')
  29.             return False
  30.     return True

  31. def guess(pwd_sys):
  32.     user_input = input('please input password-->')

  33.     if check_input(user_input):
  34.         ret = check_pwd(user_input,pwd_sys)
  35.         if ret == 'AAAA':
  36.             print('bingo!')
  37.         else:
  38.             print(ret)
  39.             guess(pwd_sys)
  40.     else:
  41.         guess(pwd_sys)


  42. pwd_sys = create_pwd()
  43. guess(pwd_sys)

复制代码

作者: crossin先生    时间: 2013-9-13 01:38
test777 发表于 2013-9-12 21:58
pygame做图形界面看起来很麻烦啊,连输入框都要自己写么..   想想就觉得头大 ...

你这个和题目要求不太一样哎,你这个告诉别人哪个数字是b,哪个数字是a了,本来这个游戏只告诉你有几个b,几个a
作者: crossin先生    时间: 2013-9-13 01:43
test777 发表于 2013-9-12 21:58
pygame做图形界面看起来很麻烦啊,连输入框都要自己写么..   想想就觉得头大 ...

发现我当初题目没说清楚,刚改了下
作者: test777    时间: 2013-9-13 10:01
crossin先生 发表于 2013-9-13 01:43
发现我当初题目没说清楚,刚改了下

没玩过这个游戏,看来是我理解错了
作者: scz_000    时间: 2013-9-16 11:33
好像能用,就传了。
  1. def the_guess_game(password):
  2.     guess=raw_input('what\'s your guess?:')
  3.     i=0
  4.     guess_result=''
  5.     while guess!=password:
  6.         while i < len(guess):
  7.             if guess[i] in password:
  8.                 if guess[i]==password[i]:
  9.                     guess_result='A'
  10.                 if guess[i]!=password[i]:
  11.                     guess_result+='B'
  12.             i+=1
  13.         right_position=0
  14.         wrong_position=0
  15.         for i in guess_result:
  16.             if i=='A':
  17.                 right_position+=1
  18.             if i=='B':
  19.                 wrong_position+=1
  20.         guess_result=str(right_position)+'A'+str(wrong_position)+'B'
  21.         print 'Your guess is wrong!'
  22.         print 'You got '+guess_result[0]+' exact numbers,'+guess_result[2]+' wrong position numbers but in the password.'
  23.         guess=raw_input('please try again:')
  24.     if guess==password:
  25.         print 'congratulations!you are right!'   


  26. the_guess_game('1234')        
复制代码

作者: crossin先生    时间: 2013-9-16 15:03
scz_000 发表于 2013-9-16 11:33
好像能用,就传了。

还是有些问题的。
  1. if guess[i]==password[i]:
  2.                     guess_result='A'
  3.                 if guess[i]!=password[i]:
  4.                     guess_result+='B'
复制代码
一个是=,一个是+=
i在每次循环后没有重置,前面用来记次数,后面又用来记录a、b
作者: scz_000    时间: 2013-9-16 22:03
crossin先生 发表于 2013-9-16 15:03
还是有些问题的。一个是=,一个是+=
i在每次循环后没有重置,前面用来记次数,后面又用来记录a、b ...

恩..受教啦!谢谢先生帮忙看!
作者: aresli    时间: 2013-9-25 17:12
本帖最后由 aresli 于 2013-9-25 17:28 编辑
  1. # -*- coding: utf-8 -*-

  2. import random

  3. def create_password():
  4.     L = [0,1,2,3,4,5,6,7,8,9]
  5.     password_length = 4
  6.     passowrd = ''
  7.     i = 0
  8.     while i < password_length:
  9.         l = random.choice(L)
  10.         #print l
  11.         passowrd += str(l)
  12.         L.remove(l)
  13.         #print L
  14.         i += 1
  15.                 return passowrd
  16.         
  17. password = create_password()
  18. print '悄悄告诉你答案是: ' + password

  19. def guess(password):
  20.     you_input = raw_input('请输入4位存数字,不能重复: ')

  21.     if you_input == password:
  22.         print "Bingo"
  23.     else:
  24.         #print "Opoo.."
  25.         right_number_right_position = 0
  26.         right_number_wrong_position = 0
  27.         i = 0
  28.         while i < 4:
  29.             if you_input[i] in password:
  30.                 if you_input[i] == password[i]:
  31.                     right_number_right_position += 1
  32.                 else:
  33.                     right_number_wrong_position += 1
  34.             i += 1
  35.         print str(right_number_right_position) + 'A' + str(right_number_wrong_position) + 'B'
  36.         guess(password)

  37. guess(password)

  38. # vim:et:ts=4:sw=4:
复制代码
测了几次,好像应该是对的!
作者: crossin先生    时间: 2013-9-25 20:29
aresli 发表于 2013-9-25 17:12
测了几次,好像应该是对的!

蛮好的。应该是对的

第17行可能是你复制到网页的时候缩进出了问题吧

另外,你password拼成了passowrd,但你全部都拼错了,所以就没有问题了
作者: aresli    时间: 2013-9-25 23:25
crossin先生 发表于 2013-9-25 20:29
蛮好的。应该是对的

第17行可能是你复制到网页的时候缩进出了问题吧

这个拼写错的问题真是。。。。。
作者: scz_000    时间: 2013-10-1 12:41
  1. # -*- coding: cp936 -*-
  2. from random import randint,choice
  3. def produce_password():
  4.     pw=['1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
  5.     ra=randint(0,9)
  6.     password=''
  7.     for i in range(0,ra):
  8.         i=choice(pw)
  9.         password+=i
  10.     return password
  11. def the_guess_game(password,t_times,best_score,t_guess):
  12.     print password
  13.     guess=raw_input('请输入你所猜的密码,密码由小写字母和数字组成:')
  14.     this_guess=0
  15.     guess_result=''
  16.     while guess!=password:
  17.         if len(guess)==len(password):
  18.             for i in range(0,len(guess)):
  19.                 if guess[i] in password:
  20.                     if guess[i]==password[i]:
  21.                         guess_result+='A'
  22.                     if guess[i]!=password[i]:
  23.                         guess_result+='B'
  24.         if len(guess)<len(password):
  25.             for i in range(0,len(guess)):
  26.                 if guess[i] in password[:len(guess)]:
  27.                     if guess[i]==password[i]:
  28.                         guess_result+='A'
  29.                     if guess[i]!=password[i]:
  30.                         guess_result+='B'
  31.                 if guess[i] in password[len(guess):]:
  32.                         guess_result+='B'
  33.         if len(guess)>len(password):
  34.             for i in range(0,len(password)):
  35.                 if guess[i] in password:
  36.                     if guess[i]==password[i]:
  37.                         guess_result+='A'
  38.                     if guess[i]!=password[i]:
  39.                         guess_result+='B'
  40.             for i in range(len(password),len(guess)):
  41.                 if guess[i] in password:
  42.                     guess_result+='B'
  43.         right_position=0
  44.         wrong_position=0
  45.         for j in guess_result:
  46.             if j=='A':
  47.                 right_position+=1
  48.             if j=='B':
  49.                 wrong_position+=1
  50.         guess_result=str(right_position)+'A'+str(wrong_position)+'B'
  51.         print '猜错了!'
  52.         print '你所猜的密码有'+guess_result[0]+'位出现在了准确位置.'+'另外,有'+guess_result[2]+'位字符出现在了密码里,但是位置不准确。'
  53.         t_guess+=1
  54.         guess=raw_input('请再试一次:')
  55.         guess_result=''
  56.         this_guess+=1
  57.     if guess==password:
  58.         print '恭喜你,破解了密码!!!'
  59.         t_guess+=1
  60.         this_guess+=1
  61.         t_times+=1
  62.         raw_input('')
  63.     if best_score==0:
  64.         best_score=this_guess
  65.     elif best_score!=0 and this_guess<best_score:
  66.         best_score=this_guess
  67.     return t_times,best_score,t_guess


  68. s=open('c:\Users\User\Desktop\python\codeguess\score.txt')
  69. score=s.readlines()
  70. s.close()
  71. dic={}
  72. f=[]
  73. for i in score:
  74.     f.append(i[:-1])
  75. for j in f:
  76.     p=j.split()
  77.     dic[p[0]]=p[1:]
  78. name=raw_input('欢迎,这是一个猜密码游戏,请输出你的名字,以记录成绩:\n')
  79. score=dic.get(name)
  80. if score==None:
  81.     score=[0,0,0]
  82. t_times=int(score[0])
  83. best_score=int(score[1])
  84. t_guess=int(score[2])
  85. if t_guess>0:
  86.     print '%s,你一共玩了 %d 次游戏,最好的成绩是尝试 %d 次就破解了密码,你平均每次破解密码所用的次数是 %d 次'%(name,t_times,best_score,t_guess)
  87. if t_guess==0 and t_times==0 and best_score==0:
  88.     print '欢迎第一次玩!'
  89. password=produce_password()
  90. a,b,c=the_guess_game(password,t_times,best_score,t_guess)
  91. dic[name]=[str(a),str(b),str(c)]
  92. result=''
  93. for k in dic:
  94.     line = k +' '+ ' '.join(dic[k])+'\n'
  95.     result+=line

  96. n=open('c:\Users\User\Desktop\python\codeguess\score.txt','w')
  97. n.write(result)
  98. n.close()




复制代码
之前做的不完善,没有随机生成密码,输入长度不对好像会有问题,也没有记录成绩。
这次重新改了哈,不过没有难度设置,学图形库再做个图形界面!!
作者: crossin先生    时间: 2013-10-2 00:51
scz_000 发表于 2013-10-1 12:41
之前做的不完善,没有随机生成密码,输入长度不对好像会有问题,也没有记录成绩。
这次重新改了哈,不过没 ...

期待图形界面
作者: βelιeφe    时间: 2013-10-13 13:05
先打个酱油,学习一下老师的基础课程,我再来做这个小程序
作者: TongShan    时间: 2013-10-19 15:08
本帖最后由 TongShan 于 2013-10-19 15:09 编辑
Myk_cc 发表于 2013-9-8 13:36
写了3个小时才完成,看来光看先生的课和模仿先生的代码是不够的啊,自己写个程序就发现困难重重好在最终还 ...

为什么这个代码:号之后都是空8个格的?我全部改成空4个格之后,程序就不能正常运行了,以下是运行的结果:
please input you code4 numbers)1245
0A0B
please input you code4 numbers)6789
0A0B
please input you code4 numbers)1234               
0A0B
please input you code4 numbers)5678
8A0B
please input you code4 numbers)1234
0A0B
please input you code4 numbers)5678
8A0B
please input you code4 numbers)9012     
4A0B
You get it!


作者: TongShan    时间: 2013-10-19 15:15
TongShan 发表于 2013-10-19 15:08
为什么这个代码:号之后都是空8个格的?我全部改成空4个格之后,程序就不能正常运行了,以下是运行的结果 ...

发现问题了,else的多空了4个格
作者: 小菜菜    时间: 2014-6-4 19:56
试试自己写一个
作者: creek    时间: 2014-6-21 18:15
  1. #!/usr/bin/env python
  2. #coding:UTF-8

  3. from random import randint

  4. print '*'*6+'猜密码游戏'+'*'*16
  5. print '*'*6+'密码由0-9组成且不重复'+'*'*6
  6. password=[]
  7. pw=''
  8. A=0
  9. B=0
  10. i=1
  11. while i<=4:
  12.     rand=randint(0,9)
  13.     if rand not in password:
  14.         password.append(rand)
  15.         pw+=str(rand)
  16.         i+=1
  17. guess=raw_input('输入你猜的密码\nGuess=')
  18. guess_list=[]
  19. for s in guess:
  20.     guess_list.append(int(s))
  21. i=0
  22. while i<4:
  23.     if password[i]==guess_list[i]:
  24.         A+=1
  25.     elif password[i] in guess_list:
  26.         B+=1
  27.     i+=1

  28. print '正确密码:'.decode('utf8')+'%s' %(int(pw))
  29. print 'Result:%dA%dB' %(A,B)
复制代码

作者: z344618505    时间: 2014-11-25 13:37
crossin先生 发表于 2013-9-8 16:02
Good Job!
运行了下,挺好的!

C老师,这个朋友的代码正确吗,我全粘贴上去的也运行不了,到提示我输入数字的时候,我输入以后就什么也没有了
作者: crossin先生    时间: 2014-11-26 19:26
z344618505 发表于 2014-11-25 13:37
C老师,这个朋友的代码正确吗,我全粘贴上去的也运行不了,到提示我输入数字的时候,我输入以后就什么也 ...

直接粘贴,大概格式上会有问题吧
作者: 年糕糖    时间: 2014-12-30 13:37
  1. import random
  2. s = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
  3. p = random.sample(s, 4)
  4. c = True
  5. while c:
  6.         l = raw_input('Please input your guess(4 numbers): ')
  7.         g = [l[0], l[1], l[2], l[3]]
  8.         B = 0
  9.         a = 0
  10.         for i in g:
  11.                 for j in p:
  12.                         if i == j:
  13.                                 B += 1
  14.         for m, n in zip(g, p):
  15.                 if m == n:
  16.                         a += 1
  17.         print '%dA%dB' % (a, B-a)
  18.         if a == 4:
  19.                 print 'You get it!'
  20.                 c = False
复制代码
自己写的一个 貌似用的方法有些诡吊 基本还是面向过程的思想
运行了几次还都正确 不知道是否可以这么干
作者: ddzxzxzz    时间: 2015-1-14 19:09
#coding:utf-8
import string
from random import sample

__author__ = 'Administrator'

'''以前店子词典上有个游戏:要你猜一个4位密码,密码由0-9组成,不重复。才对正确位置上的数字为A,猜到数字但位置不正确为B,每次显示答案中A和B的个数。'''

pa = ['1','2','3','4','5','6','7','8','9','0',]
password = sample(pa,4)
#print password
mypass = '4A0B'
result = ['']*4

while ''.join(result) != mypass:
        result = ['']*4
        i = 0
        j = 0
        text = raw_input('Please guess the password of 4 unrepeated numbers 0-9:')
        for x,y in zip(text,password):
                if x == y:
                        i += 1
        for z in text:
                if z in password:
                        j += 1

        result[0] = str(i)
        result[1] = 'A'
        result[2] = str(j - i)
        result[3] = 'B'
        print ''.join(result)
else:
        print mypass

试了一下,貌似OK... 支持crossin...
作者: very    时间: 2015-5-6 14:47
Python新手
  1. import random
  2. import re

  3. com1=random.sample(range(0,9),4)
  4. com=''.join(str(i) for i in com1)
  5. #print com

  6. while True:
  7.         A=0
  8.         B=0
  9.         print "Please input four number:(input the 'end' quit the game)"
  10.         you=raw_input()
  11.         if you=='end':
  12.                 break
  13.         else:
  14.                 m=re.findall(r"\b\d{4}\b",you)
  15.                 if m:
  16.                         for i in range(4):
  17.                                 for j in range(4):
  18.                                         if i==j:
  19.                                                 if you[i]==com[j]:
  20.                                                         A+=1
  21.                                         else:
  22.                                                 if you[i]==com[j]:
  23.                                                         B+=1
  24.                         print '%dA%dB'%(A,B)
  25.                         if A==4:
  26.                                 print 'you are win !'
  27.                                 break
  28.                         else:
  29.                                 print 'go on ... !'               
  30.                        
  31.        
  32.                 else:
  33.                         print "You input the numbers does't conform to the rules"       
复制代码

作者: manhong2112    时间: 2016-1-16 15:19
  1. import random

  2. pwd = ""

  3. for i in range(0,4): pwd += str(random.randint(0,9))

  4. print("Guess a number: ")
  5. print("(",pwd,")")
  6. while True:
  7.   guess = input()
  8.   if len(guess) != 4: continue
  9.   A = 0
  10.   B = 0
  11.   for i in range(0,4):
  12.     B += guess[i] in pwd[i:4]
  13.     A += guess[i] == pwd[i]
  14.   
  15.   print(A,"A",(B - A),"B",sep="")
  16.   if A == 4: break

  17. print("You Win!")
复制代码

作者: ly_911004    时间: 2016-3-14 17:10
  1. import re,random
  2. defaultPwd = []
  3. i=0
  4. while i<4:
  5.     defaultPwd.append(str(random.randint(0,9)))
  6.     i += 1
  7. print defaultPwd
  8. def you_guess():
  9.     password = raw_input('请输入密码:')
  10.     countA=0
  11.     countB=0
  12.     listPwd = list(password)
  13.     if re.match(r"\d{4}$", password) and True or False:
  14.         for m in listPwd:
  15.             if m in defaultPwd:
  16.                 if m == defaultPwd[listPwd.index(m)]:
  17.                     countA += 1
  18.                 else:
  19.                     countB += 1
  20.         if '%dA%dB'%(countA,countB) != '4A0B':
  21.             print '%dA%dB'%(countA,countB)
  22.             you_guess()
  23.         else:
  24.             print '密码输入正确'
  25.     else:
  26.         print '请输入正确的密码'

  27. you_guess()
复制代码

作者: shangyaoshi    时间: 2016-3-28 09:55
  1. import random

  2. end = '4A0B'
  3. end_try = ''
  4. lst_password = []

  5. def creat_password():
  6.        
  7.         for i in range(4):
  8.                 x1 = random.randint(0,9)
  9.                 lst_password.append(x1)
  10.        
  11.         #print 'the password is: ' , lst_password
  12.         return lst_password
  13.        
  14. def compare():
  15.        
  16.         number_A = 0
  17.         number_B = 0
  18.         print 'Now, please guess the password!'
  19.         for i in range(0,4):
  20.                
  21.                 number = int(raw_input('Enter the number(0-9): '))
  22.                
  23.                 if number == lst_password[i]:
  24.                         number_A += 1
  25.                 else:       
  26.                         if number in lst_password:
  27.                                 number_B += 1
  28.                         else:
  29.                                 pass                       
  30.         end_try = '%dA%dB'        % (number_A,number_B)       
  31.         print end_try
  32.         return end_try

  33.        
  34. print 'Start Game!'
  35. creat_password()
  36. while end_try != '4A0B':
  37.         compare()
  38. print 'You got the right password.Congratulitions!'       
复制代码
C老师,绝对新手请教啊,为什么我这个代码,即使输出了4A0B,也结束不了呢,还是会继续让猜数字,而不会输出最后“You got the right password. Congratulitions!”
作者: crossin先生    时间: 2016-3-28 17:34
shangyaoshi 发表于 2016-3-28 09:55
C老师,绝对新手请教啊,为什么我这个代码,即使输出了4A0B,也结束不了呢,还是会继续让猜数字,而不会输 ...

函数内部的end_try和外面的变量end_try不是同一个,具体原因参见后面关于作用域的课程。
你现在的做法,应该是判断compare的返回值是否为 4a0b
作者: shangyaoshi    时间: 2016-3-29 12:41
crossin先生 发表于 2016-3-28 17:34
函数内部的end_try和外面的变量end_try不是同一个,具体原因参见后面关于作用域的课程。
你现在的做法, ...

好的呢,我再继续研究一下,谢谢C老师指点了。
作者: zp2332@qq.com    时间: 2016-3-29 15:54

  1. # 猜数字游戏
  2. import random
  3. def create_code():
  4.   codenum = [1,2,3,4,5,6,7,8,9,0]
  5.   code = ''
  6.   i = random.randint(0,9)
  7.   while True:
  8.     if 4 == len(code):
  9.       break
  10.     if str(codenum[i]) in code:
  11.       i = random.randint(0,9)
  12.     else:
  13.       code += str(codenum[i])
  14.   return code

  15. def validate_code(code, guess_code):
  16.   aNum = 0
  17.   bNum = 0
  18.   if len(code) != len(guess_code):
  19.     print("请输入【4位数字】密码")
  20.     return False
  21.   # elif type(guess_code) != type(0):
  22.   #   print('请输入数字')
  23.   #   return False
  24.   else:
  25.     for i in range(len(code)):
  26.       if code[i] == guess_code[i]:
  27.         aNum += 1
  28.       elif guess_code[i] in code:
  29.         bNum += 1
  30.   if aNum == 4 and bNum == 0:
  31.     print("恭喜你,猜对了",end = '')
  32.     print(aNum,'A',bNum,'B')
  33.     return True
  34.   else:
  35.     print(aNum,'A',bNum,'B')
  36.     return False

  37. def guess_game():
  38.   code = create_code()
  39.   print('让我们来猜一个4位数密码')
  40.   while True:
  41.     guesscode = input("请输入4位数字密码")
  42.     if validate_code(code,guesscode) :
  43.       break
  44.     else:
  45.       continue

  46. guess_game()
复制代码
看了test777的代码才知道random.sample(numbers,pwd_length)函数,惭愧。。
自学Python,不太久,加油
作者: Lisp    时间: 2016-4-13 14:07
本帖最后由 Lisp 于 2016-4-13 14:08 编辑
  1. #!/usr/bin/env python
  2. # coding:utf8
  3. # writen by Lisp at 16/4/13

  4. # import random

  5. # 初始化密码,可以用随机来取,这里先固定
  6. # str1 = random.sample(range(10), 4)
  7. str1 = '1234'

  8. print '请输入四位不重复的数字密码'
  9. while True:
  10.     A = 0
  11.     B = 0
  12.     str2 = raw_input('> ')
  13.     b = [x for x in str2 if str2.count(x) > 1]
  14.     if len(str2) == 4 and str2.isdigit() and not b:
  15.         for i in range(len(str1)):
  16.             # print i
  17.             if str1[i] == str2[i]:
  18.                 A += 1
  19.             elif str1[i] in str2:
  20.                 B += 1
  21.         print '{0}A{1}B'.format(A, B)
  22.         if A == 4 and B == 0:
  23.             print 'Bingo!'
  24.             exit(0)
  25.     else:
  26.         print '输入错误! 请输入四位不重复的数字密码.'
复制代码

作者: Lisp    时间: 2016-4-13 14:08
刚看到这个板块的内容,非常棒!以后就经常来这里训练了
作者: Lisp    时间: 2016-4-13 14:25
标题: 这次加上随机的,自己做了一遍,写了20多组才得到正确答...
  1. #!/usr/bin/env python
  2. # coding:utf8
  3. # writen by Lisp at 16/4/13

  4. import random

  5. # 初始化密码,随机初始化
  6. str1 = random.sample(range(10), 4)
  7. str1 = ''.join(map(lambda m: str(m), str1))

  8. print '请输入四位不重复的数字密码'
  9. while True:
  10.     A = 0
  11.     B = 0
  12.     str2 = raw_input('> ')
  13.     b = [x for x in str2 if str2.count(x) > 1]
  14.     if len(str2) == 4 and str2.isdigit() and not b:
  15.         for i in range(len(str1)):
  16.             # print i
  17.             if str1[i] == str2[i]:
  18.                 A += 1
  19.             elif str1[i] in str2:
  20.                 B += 1
  21.         print '{0}A{1}B'.format(A, B)
  22.         if A == 4 and B == 0:
  23.             print 'Bingo!'
  24.             exit(0)
  25.     else:
  26.         print '输入错误! 请输入四位不重复的数字密码.'
复制代码

作者: 渡俊    时间: 2016-4-15 22:41
import random
l = [0,1,2,3,4,5,6,7,8,9]
du = ""
for i in range(4):
    ff = random.choice(l)
    du += str(ff)
    l.remove(ff)
print("答案是"+ du )
def guess(du):
    you = input("请输入四位数 不能重复")
    if you == du:
        print("good")
    else :
        right_nume = 0
        wrong_nume = 0
        i = 0
        while i < 4:
            if you[i] in du:
                if you[i] == du[i]:
                    right_nume += 1
                else :
                    wrong_nume += 1
            i += 1
        print(str(right_nume) + "A" + str(wrong_nume) + "B")
        guess(du)
guess(du)

作者: morpheus2222    时间: 2017-1-23 10:25
import random

s = range(10)
password = random.sample(s,4)
password = list(map(str,password))
#print(password)
dic_password = dict(list(enumerate(password)))
#print(dic_password)
win = False
while win ==False:
    guess = input("guess the password(4 digtals):")
    dic_guess = dict(list(enumerate(list(guess))))
    #print(dic_guess)
    A = 0
    B = 0
    for i in dic_password:
        for j in dic_guess:
            if i == j:
                    if dic_password[i] == dic_guess[j]:
                        A += 1
            else:
                    if dic_password[i] == dic_guess[j]:
                        B += 1

    result = str(A)+"A"+str(B)+"B"
    print(result)
    if result == "4A0B":
        win = True
        print("you win!")






作者: huiwenwu    时间: 2017-3-8 06:22
看完教程写的,比较初级。。
不知有什么方便的方法复制代码到留言区?

#!/usr/bin/python

import re

passwd='1234'
#for i in passwd:
#  passwd_li.append(i)

guess=input('Please enter your guess: ')
guess_str=str(guess)
A=0
B=0
times=0

if re.findall(r'\d{4}',guess_str):
  guess_li=[]
  for i in guess_str:
    guess_li.append(i)

  for i in guess_str:
    if i==passwd[times]:
      A+=1
      times+=1
    elif re.findall(i,passwd):
      B+=1
      times+=1
    else:
      times+=1

  print '%dA%dB' % (A,B)

else:
  print 'Please input 4 numbers.'



作者: crossin先生    时间: 2017-3-8 17:21
huiwenwu 发表于 2017-3-8 06:22
看完教程写的,比较初级。。
不知有什么方便的方法复制代码到留言区?

留言框上有一个 <> 标志,可以添加代码
作者: huiwenwu    时间: 2017-3-9 06:45
crossin先生 发表于 2017-3-8 17:21
留言框上有一个  标志,可以添加代码

谢谢~~~
作者: jssngz    时间: 2017-3-12 18:40
这个是我的实现方案
  1. from random import randint

  2. passwdInt = randint(1000,9999)
  3. passwd = str(passwdInt)
  4. print(passwd)
  5. while True:
  6.     # print("请输入猜测的密码:")
  7.     inputpassWd = input()
  8.     if len(inputpassWd) == 0:
  9.         continue
  10.     rightPosCount = 0
  11.     rightNumberCount = 0
  12.     char = ''
  13.     for i in range(len(inputpassWd)):
  14.         char = inputpassWd[i]
  15.         if char == passwd[i]:
  16.             rightPosCount += 1
  17.         else:
  18.             if char in passwd:
  19.                 rightNumberCount += 1

  20.     if rightPosCount== 4 and rightNumberCount == 0:
  21.         print('结果正确:' + str(rightPosCount) + 'A' + str(rightNumberCount) + 'B')
  22.         break
  23.     else:
  24.         print('结果错误:' + str(rightPosCount) + 'A' + str(rightNumberCount) + 'B')
复制代码

作者: James_Danni    时间: 2017-7-21 17:42
我也来试下,请老师批阅~

# -*- coding: cp936 -*-
import random
def JudgePasswd(a,b):   
    if a == b:
        return 1
    else:
        return 0
list1 = ['0','1','2','3','4','5','6','7','8','9']
str_1 = random.sample(list1,4)
num_1 = int(str_1[0])
num_2 = int(str_1[1])
num_3 = int(str_1[2])
num_4 = int(str_1[3])
True_num = 0
str_2 = raw_input('请输入四位密码(四位0-9且不重复):')
while True_num != 4:
    num_11 = int(str_2[0])
    num_12 = int(str_2[1])
    num_13 = int(str_2[2])
    num_14 = int(str_2[3])
    True_num_1 = JudgePasswd(num_1,num_11)
    True_num_2 = JudgePasswd(num_2,num_12)
    True_num_3 = JudgePasswd(num_3,num_13)
    True_num_4 = JudgePasswd(num_4,num_14)
    True_num = True_num_1 + True_num_2 + True_num_3 +True_num_4
    if True_num < 4:
        print '此次您的结果为%dA%dB' %(True_num,4-True_num)
        str_2 = raw_input('请重新输入四位密码(四位0-9且不重复):')
else:
    print '恭喜!游戏结束'

作者: James_Danni    时间: 2017-7-21 18:15
怎么跟他们一样把代码复制上来,可以让别人复制代码呀
作者: crossin先生    时间: 2017-7-21 22:14
James_Danni 发表于 2017-7-21 18:15
怎么跟他们一样把代码复制上来,可以让别人复制代码呀

回复框上有个 <> 符号,里面可以贴代码
作者: DoubleIcy    时间: 2017-8-7 22:16
当时看了先生的课,就想到了这个游戏,想着把记录成绩结合进来,感觉写的有点冗长,希望先生指点。
PS:生成随机数那边就想了好久,最后写了2个生成方法,都没舍得删
  1. from random import randint


  2. def generate_1():
  3.     a = [0, 0, 0, 0]
  4.     i = 0
  5.     while i <= 3:
  6.         a[i] = randint(0,9)
  7.         if i >=1:
  8.             for j in range(0,i):
  9.                 if a[i] == a[j]:
  10.                     i -= 1
  11.                     break
  12.         i += 1
  13.     return a

  14. def generate_2():
  15.     k = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  16.     a = [0, 0, 0, 0]
  17.     for i in range(4):
  18.         n = randint(0, 9-i)
  19.         a[i] = k[n]
  20.         del k[n]
  21.     return a

  22.    
  23. def compare(a, b):
  24.     num_a = 0
  25.     num_b = 0
  26.     for i in range(4):
  27.         for j in range(4):
  28.             if int(a[i]) == b[j]:
  29.                 if i == j:
  30.                     num_a += 1
  31.                     break
  32.                 else:
  33.                     num_b += 1
  34.                     break
  35.     return [num_a, num_b]
  36.         
  37.         

  38. print '====****====guess number game====****====\n'
  39. print 'Rules:\nThe answer is 4 different numbers\n\
  40. A means number and position are all \
  41. correct\nB means only number is right\n'

  42. scores = {}
  43. name = raw_input('Input you name:\n')
  44. try:
  45.     f = file('scores.txt')
  46.     lines = f.readlines()
  47.     for l in lines:
  48.         s = l.split()
  49.         scores[s[0]] = s[1:]
  50. except:
  51.     print 'You are the first player!'
  52.    
  53. score = scores.get(name)
  54. if score is None:
  55.     score = [0, 0]
  56. game_time = score[0]
  57. s_turn = score[1]

  58. again = 'y'
  59. while again == 'y':
  60.     game_time += 1
  61.     num = generate_2()
  62.     #print num
  63.     answer = [0, 0]
  64.     guess_turn = 0
  65.     print 'Guess the numbers:\n'
  66.     while answer[0] != 4:
  67.         guess_turn += 1
  68.         print 'turn %d:' %guess_turn
  69.         guess = raw_input()
  70.         trans = guess.split(' ')
  71.         #print trans
  72.         answer = compare(trans, num)
  73.         #print reflect
  74.         if answer[0] != 4:
  75.             print '===>>>%dA%dB<<<===' %(answer[0],answer[1])
  76.         else:
  77.             break
  78.     if s_turn == 0 or s_turn > guess_turn:
  79.         s_turn = guess_turn
  80.     print 'Congratulations! %d %d %d %d is correct!\n' %(num[0], num[1], num[2], num[3])
  81.     print 'Player: %s\tGame time: %d\tCurrent \
  82. turns: %d\tShortest turns: %d' %(name, game_time, guess_turn, s_turn)
  83.     scores[name] = [str(game_time), str(s_turn)]
  84.     result = ''
  85.     for n in scores:
  86.         str_result = n + ' ' + ' '.join(scores[n]) + '\n'
  87.         result += str_result
  88.     o = file('scores.txt','w')
  89.     o.write(result)
  90.     o.close()
  91.     print 'Do you want to play it again? (y/n)'
  92.     again = raw_input()
复制代码

作者: crossin先生    时间: 2017-8-7 22:58
DoubleIcy 发表于 2017-8-7 22:16
当时看了先生的课,就想到了这个游戏,想着把记录成绩结合进来,感觉写的有点冗长,希望先生指点。
PS:生 ...

挺好的
随机数那里,看看random模块,有更好的方法
作者: 木鱼    时间: 2017-8-9 21:22
import random ,string

class game():
    a=0
    def start(self):
        passwd = random.sample(string.digits, 4)
        while True:
            anser=input('输入四位密码:')
            if len(anser)==4:
                ' '.join(anser).split()
                self.test(anser,passwd)
                if game.a==4:
                    break
                print('密码错误')
        print('密码正确!')
        next=input('输入‘1’进入下一轮,任意键结束。')
        if next==1:
            game.a=0
            self.start()
        exit(0)
    def test(self,ans,pd):
        j=a=b=0
        for i in range(4):
            if ans[i]==pd[i]:
                a+=1
                continue
            if ans[i] in pd:
                b+=1
        print('%dA%dB' % (a, b))
        if a==4:game.a=4
if __name__=='__main__':
    s=game()
    s.start()
作者: wolfog    时间: 2017-8-17 17:04
import random
def createPwd():
    numList = range(0, 10)
    numListStr = [str(i) for i in numList]
    return "".join(random.sample(numListStr, 4))

pwd = createPwd()
param = False
while not param:
    numA = 0
    numB = 0
    inputStr = raw_input("请输入四个数字:")
    if len(inputStr) != 4:
        print "请输入4位密码"
        break
    for i in range(0, 4):
        if inputStr[i] == pwd[i]:
            numA += 1
        elif pwd.find(inputStr[i]) != -1:
            numB += 1
        if i == 3:
            if numA == 4:
                param = True
                print "4A0B"
            else:
                print str(numA) + "A" + str(numB) + "B"

作者: FERRYMAN    时间: 2021-2-12 18:35
写得挺顺的,30分钟把主体写完了。但是修改和完善内容用了一个半小时。

老师能看看吗?

其实也有几个问题。
虽然输入4个数字,能排除其中一个是浮点数的问题,比如1.5234;但是如果刚好有四个字符,比如1.52就不行了。
虽然写的是“按回车继续”,但是实际上输入除‘quit’外的任何东西都能继续,如果用户不小心输了别的,就会发现程序的漏洞。

请老师指点一下,谢谢啦!
  1. import random

  2. print('你的面前有一个密码锁,密码为0~9中不重复的四个数字.')
  3. print('猜对正确位置上的数字为A,猜到数字但位置不正确为B.')
  4. print('每次结束后显示答案中A和B的个数.')
  5. print('比如:密码是1234.输入2345,将会显示0A3B;猜4231,将会显示2A2B.\n\n')

  6. password_l = random.sample(range(0,10),4)
  7. #  在测试各种功能的时候我“无耻地”加了右边这句  print(password_l)
  8. password_str = ''.join([str(i) for i in password_l])

  9. while True:
  10.     en_word = [1,2,3]  #  创建en_word并使其满足条件以进入while
  11.     while len(set(en_word)) != 4:  #  排除数字过多或过少或重复,和浮点数的情况
  12.         input_w = '请直接输入4个数字(0~9)作为解锁密码:\n'
  13.         input_w += '(注意!形式类似于1234,且为不重复的整数!)\n'
  14.         en_word = list(input(input_w))  
  15.     answer_d = {'A':0,'B':0}
  16.     for index in range(0,4):
  17.         if int(en_word[index]) == password_l[index]:
  18.             answer_d['A'] += 1
  19.         elif int(en_word[index]) in password_l:
  20.             answer_d['B'] += 1
  21.     result = '%dA%dB'%(answer_d['A'],answer_d['B'])
  22.     print(result)
  23.     if result == '4A0B':
  24.         break
  25.     elif result != '4A0B':
  26.         print('密码不对哟!\n')
  27.     tuichu = input('要再来吗?请按回车.如果要结束游戏就请输入"quit"\n')  #  防止玩家耐心渐消
  28.     if tuichu == 'quit':
  29.         print('游戏结束,下次再见哦!(悄悄告诉你,其实密码是%s)' % password_str)
  30.         break
复制代码

作者: crossin先生    时间: 2021-2-13 00:03
FERRYMAN 发表于 2021-2-12 18:35
写得挺顺的,30分钟把主体写完了。但是修改和完善内容用了一个半小时。

老师能看看吗?

虽然输入4个数字,能排除其中一个是浮点数的问题,比如1.5234;但是如果刚好有四个字符,比如1.52就不行了。
-----------
判断一下输入的位数是4,且都是数字,可以用 isnumberic(),昨天才说的


虽然写的是“按回车继续”,但是实际上输入除‘quit’外的任何东西都能继续,如果用户不小心输了别的,就会发现程序的漏洞。
------------
那是因为你条件就是判断用户输入的是 quit。你可以把条件改为
while tuichu != '':
    if tuichu == 'quit':
        print('游戏结束,下次再见哦!(悄悄告诉你,其实密码是%s)' % password_str)
        break
    tuichu = input('要再来吗?请按回车.如果要结束游戏就请输入"quit"\n')
作者: FERRYMAN    时间: 2021-2-13 11:39
crossin先生 发表于 2021-2-13 00:03
虽然输入4个数字,能排除其中一个是浮点数的问题,比如1.5234;但是如果刚好有四个字符,比如1.52就不行了 ...

谢谢老师,问题都解决了

但是我发现您给的代码有一点小小小错误,就是您在tuichu == 'quit'的情况下用了‘break’,它只能关闭最内层循环。而满足这个条件时本来应该关闭整个大循环。

所以我在整个循环前加了句‘active = True’,把大循环的条件改成了‘active == True’,然后在while tuichu != ‘’的if语句的break前加了句active = False

老师看是这样吗?谢谢啦
作者: crossin先生    时间: 2021-2-13 20:13
FERRYMAN 发表于 2021-2-13 11:39
谢谢老师,问题都解决了

但是我发现您给的代码有一点小小小错误,就是您在tuichu == 'quit'的情况下用了 ...

你这个方法是对的,一般要跳出多层循环都是通过变量来控制
作者: FERRYMAN    时间: 2021-2-13 20:56
crossin先生 发表于 2021-2-13 20:13
你这个方法是对的,一般要跳出多层循环都是通过变量来控制

好的,谢谢老师




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5