设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 77903|回复: 51
打印 上一主题 下一主题

猜密码游戏

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
#
发表于 2013-9-8 00:32:09 |只看该作者 |正序浏览
再来一个相对简单点的。

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

比如:密码是1234

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

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

以此为基础,做个游戏。
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

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

好的,谢谢老师
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

50#
发表于 2021-2-13 20:13:43 |只看该作者
FERRYMAN 发表于 2021-2-13 11:39
谢谢老师,问题都解决了

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

你这个方法是对的,一般要跳出多层循环都是通过变量来控制
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

49#
发表于 2021-2-13 11:39:17 |只看该作者
crossin先生 发表于 2021-2-13 00:03
虽然输入4个数字,能排除其中一个是浮点数的问题,比如1.5234;但是如果刚好有四个字符,比如1.52就不行了 ...

谢谢老师,问题都解决了

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

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

老师看是这样吗?谢谢啦
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

48#
发表于 2021-2-13 00:03:02 |只看该作者
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')
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

3

主题

1

好友

111

积分

注册会员

Rank: 2

47#
发表于 2021-2-12 18:35:19 |只看该作者
写得挺顺的,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
复制代码
回复

使用道具 举报

1

主题

0

好友

39

积分

新手上路

Rank: 1

46#
发表于 2017-8-17 17:04:14 |只看该作者
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"
回复

使用道具 举报

0

主题

0

好友

12

积分

新手上路

Rank: 1

45#
发表于 2017-8-9 21:22:50 |只看该作者
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()
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

挺好的
随机数那里,看看random模块,有更好的方法
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

6

积分

新手上路

Rank: 1

43#
发表于 2017-8-7 22:16:11 |只看该作者
当时看了先生的课,就想到了这个游戏,想着把记录成绩结合进来,感觉写的有点冗长,希望先生指点。
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()
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

42#
发表于 2017-7-21 22:14:16 |只看该作者
James_Danni 发表于 2017-7-21 18:15
怎么跟他们一样把代码复制上来,可以让别人复制代码呀

回复框上有个 <> 符号,里面可以贴代码
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-24 15:11 , Processed in 0.019211 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部