这里的程序并不复杂,下面主要对随机数据的生成部分进行分析
1 2 3 4 5 6 7 8
| def randNumGen(self) : numStr = '0123456789' randNum = '' for i in range(4) : n = choice(numStr) randNum += n numStr = numStr.replace(n, '') self.sysNum = randNum
|
这里由于数字是不重复的,所以可以先定义好一个 0-9 的数字串,然后用
choice 函数随机选出一个,之后删除这个数字,再次 choice,直到选出 4
位数字为止。
下面是完整的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
from string import digits from random import randint, choice class GuessNumber(object) : def __init__(self) : self.count = 0 self.usrNums = [] self.sysNum = '' self.results = [] self.isWinner = False def printRules(self) : print """由系统随机生成不重复的四位数字,用户猜,之后系统进行提示。 A代表数字正确位置正确,B代表数字正确位置错误。 如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了 ,记为1A;3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。 接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止""" def randNumGen(self) : numStr = '0123456789' randNum = '' for i in range(4) : n = choice(numStr) randNum += n numStr = numStr.replace(n, '') self.sysNum = randNum def numInput(self) : self.count += 1 while True: num = raw_input('输入您想要猜的数字:') print 'Debug >> num::',num if len(num) < 4 : print '***错误: 位数小于四位,请重新输入' continue elif len(num) > 4: print '***错误: 位数大于四位,请重新输入' continue if not self.isAllNumber(num) : print '***错误: 您输入了非数字字符,请重新输入' continue elif self.hasSameDigit(num) : print '***错误: 您输入了含有相同数字的数字串,请重新输入' continue else : self.usrNums.append(num) return num def isAllNumber(self, num) : for ch in num : if ch not in digits : return False return True
def hasSameDigit(self, num) : for i in range(len(num)) : pos = num[i + 1 :].find(num[i]) if pos >= 0 : return True return False def numJudge(self, sysNum, usrNum) : countA = 0 countB = 0 for i in range(4) : if usrNum[i] in sysNum : if i == sysNum.find(usrNum[i]) : countA += 1 else : countB += 1 result = '%dA%dB' % (countA, countB) self.results.append(result) if countA == 4 : self.isWinner = True def showResults(self, usrNums, results) : print '-' * 20 for i in range(self.count) : print '(%d)/t%s/t%s' % (i + 1, usrNums[i], results[i]) print '-' * 20 if self.isWinner : print 'Total: %d times' % self.count print 'Congratulations! Your are winner !!' def run(self) : self.printRules() self.randNumGen() while not self.isWinner: num = self.numInput() self.numJudge(self.sysNum, num) self.showResults(self.usrNums, self.results)
def main() : guessNumber = GuessNumber() guessNumber.run() if __name__ == '__main__' : main()
|