异度部落格

学习是一种生活态度。

0%

Python学习 猜数字游戏

这里的程序并不复杂,下面主要对随机数据的生成部分进行分析

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
#!/usr/bin/env python
#猜数字游戏
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
#print 'Debug >> SysNum::', self.sysNum
#数字输入
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()