python猜数字统计游戏次数_猜数字游戏的实现(Python3.5)

标签:

最近实现了一个猜数字的游戏,用python写的,本人python技术很渣,在不断百度的情况下,总算完成了这个猜数字的游戏,写上一点心得,也许以后有用。

猜数字游戏规则特别简单,就是用户猜一个4位数字,如果位置正确则记为A,数字正确则记为B(例如:被猜数字1234,用户输入了1456;则返回1A1B)

首先,我定义了一个猜数字的大类,写入了初始化方法后,加了一个生成4位不重复数字的方法,具体逻辑是这样:首先生成一个10位不重复的序列,然后利用List的pop方法,返回结果,然后把每个结果用字符串累加的方法加起来,用while循环控制次数,最后得到4位不重复的数字字符串,其它额外要求根据实际情况增加。这里用到了random模块,所以要import random

第一步:

import random

class guessNumber():

‘‘‘

猜数字游戏:

1、用户输入一组数字后,返回以*A*B的方式返回结果

2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

‘‘‘

def __init__(self):

self.guess_number = ‘‘ #被猜测的数字

#生成随机不重复的4位数,包括首位位0的数字,如(0567)

def genRandomNum(self):

if self.guess_number == ‘‘: #对象中guess_number参数有没有纸,如果有就直接返回传入的值

result = ‘‘ #生成的数字

l1 = [str(i) for i in range(10)] #l1是一个类似[0,1,2,3,4,5,6,7,8,9]序列

while(result.__len__() < 4): #用while循环控制生成数字的位数

tmp = l1.pop(random.randrange(l1.__len__())) #用list的pop方法返回对应的数字,这样可以避免重复

if tmp == ‘0‘: #判断首位是否为0,如果是0,那么需要加上之前去除的元素

l1.append(‘0‘) #把之前删除的“0”重新加上

tmp = l1.pop(random.randrange(l1.__len__())) #再来一次

result += tmp #字符串累加,响应while的循环条件,到4位时停止循环

else:

result += tmp

else:

result = str(self.guess_number) #如果已经设置了guess_number,那么直接返回设置的结果

return result #返回生成的4位不重复的数字(仅限于自动生成,其它途径传入的不算)

if __name__ == ‘__main__‘:

guess = guessNumber()

target = guess.genRandomNum()

print(target)

第二步:实现生成随机不重复的4位数字后,接下来就考虑用户输入的数字了。

用户输入的数字有这么几种情况:

1、长度不符合要求

2、输入其它非数字字符

3、不输入

这些异常都要过滤

在类guessNumber中添加这个方法:

import random

class guessNumber():

‘‘‘

猜数字游戏:

1、用户输入一组数字后,返回以*A*B的方式返回结果

2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

‘‘‘

def __init__(self):

self.guess_number = ‘‘ #被猜测的数字

#因为没有参数,所以在要加静态方法的声明

@staticmethod

def user():

result = ‘‘

while True:

primary_number = input("请输入您猜测的数字:")

#其它准出条件,如果用户输入了q,Q,quit字符,则退出游戏

if primary_number == ‘q‘ or primary_number == ‘Q‘ or primary_number == ‘quit‘:

return 1

#判断用户输入的是不是数字以及长度是不是刚好4位

elif primary_number.isdigit() and len(primary_number) == 4:

tmp = list(str(primary_number)) #把用户输入的数字转换成list方便操作

a1 = tmp.pop(0) #去掉其中两个字符,并穿给对应的变量(为什么这么做?一种实现方法,勿喷。囧)

a2 = tmp.pop(0)

#如果输入的数字大于1000,小于10000

if int(primary_number) > 1000 and int(primary_number) < 10000:

#如果a1和a2有一个在tmp里面,或者tmp里面的两个值相等,那么意味着有重复数字

if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:

print("您输入的数字不符合要求")

else:

break;

#同上

elif(int(primary_number)<1000 and int(primary_number) >= 100):

if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:

print("您输入的数字不符合要求")

else:

break;

else:

print("您输入的数字不符合要求")

else:

print("不要输入非数字字符")

result = primary_number #把值给result

return result

if __name__ == ‘__main__‘:

guess = guessNumber()

target = guess.user()

print(target)

第三步:第二步的代码写得很啰嗦,但是不影响使用……,用户输入数字后,需要判断用户输入的数字于被猜测的数字之间差了多远,所以要写一个逻辑判断语句

import random

class guessNumber():

‘‘‘

猜数字游戏:

1、用户输入一组数字后,返回以*A*B的方式返回结果

2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

‘‘‘

def __init__(self):

self.guess_number = ‘‘ #被猜测的数字

self.number = ‘‘ #猜测的数字

self.history = {} #存储猜测的结果

#我把方法命名成提示

def tip(self):

input_list = list(str(self.number)) #将类中的猜测的数转换成一个list

target_list = list(str(self.guess_number)) #将类中的被猜测的数转换成一个list

a = 0 #A的个数

b = "" #B的字符串

for i in range(input_list.__len__()): #遍历猜测的数字,如果其中有一个数字在被猜测的数中,那么b中增加一个B,如果对应位置的数正好相等,那么a自增1

if input_list[i] == target_list[i]:

a += 1

if input_list[i] in target_list and input_list[i] != target_list[i]:

b += ‘B‘

result = ("%sA%sB" % (a, len(b)))

#将猜测的结果写入结果集,不重复记录

tmp = []

for key in self.history:

tmp.append(key)

if self.number in tmp:

pass

else:

self.history[self.number] = result

return result

if __name__ == ‘__main__‘:

a = guessNumber()

a.guess_number = ‘1234‘

a.number = ‘1456‘

print(a.tip()) #应该打印出:1A1B

第四步:整合

import random

class guessNumber():

‘‘‘

猜数字游戏:

1、用户输入一组数字后,返回以*A*B的方式返回结果

2、1A代表有一个正确的数字位置正确,1B代表有一个数字正确,但是位置不正确

‘‘‘

def __init__(self):

self.guess_number = ‘‘ #被猜测的数字

self.number = ‘‘ #猜测的数字

self.history = {} #存储猜测的结果

#生成随机不重复的4位数,包括首位位0的数字,如(0567)

def genRandomNum(self):

if self.guess_number == ‘‘: #对象中guess_number参数有没有纸,如果有就直接返回传入的值

result = ‘‘ #生成的数字

l1 = [str(i) for i in range(10)] #l1是一个类似[0,1,2,3,4,5,6,7,8,9]序列

while(result.__len__() < 4): #用while循环控制生成数字的位数

tmp = l1.pop(random.randrange(l1.__len__())) #用list的pop方法返回对应的数字,这样可以避免重复

if tmp == ‘0‘: #判断首位是否为0,如果是0,那么需要加上之前去除的元素

l1.append(‘0‘) #把之前删除的“0”重新加上

tmp = l1.pop(random.randrange(l1.__len__())) #再来一次

result += tmp #字符串累加,响应while的循环条件,到4位时停止循环

else:

result += tmp

else:

result = str(self.guess_number) #如果已经设置了guess_number,那么直接返回设置的结果

return result #返回生成的4位不重复的数字(仅限于自动生成,其它途径传入的不算)

@staticmethod

def user():

result = ‘‘

while True:

primary_number = input("请输入您猜测的数字:")

#其它准出条件,如果用户输入了q,Q,quit字符,则退出游戏

if primary_number == ‘q‘ or primary_number == ‘Q‘ or primary_number == ‘quit‘:

return 1

#判断用户输入的是不是数字以及长度是不是刚好4位

elif primary_number.isdigit() and len(primary_number) == 4:

tmp = list(str(primary_number)) #把用户输入的数字转换成list方便操作

a1 = tmp.pop(0) #去掉其中两个字符,并穿给对应的变量(为什么这么做?一种实现方法,勿喷。囧)

a2 = tmp.pop(0)

#如果输入的数字大于1000,小于10000

if int(primary_number) > 1000 and int(primary_number) < 10000:

#如果a1和a2有一个在tmp里面,或者tmp里面的两个值相等,那么意味着有重复数字

if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:

print("您输入的数字不符合要求")

else:

break;

#同上

elif(int(primary_number)<1000 and int(primary_number) >= 100):

if a1 in tmp or a2 in tmp or tmp[0] == tmp[1]:

print("您输入的数字不符合要求")

else:

break;

else:

print("您输入的数字不符合要求")

else:

print("不要输入非数字字符")

result = primary_number #把值给result

return result

def tip(self):

input_list = list(str(self.number)) #将类中的猜测的数转换成一个list

target_list = list(str(self.guess_number)) #将类中的被猜测的数转换成一个list

a = 0 #A的个数

b = "" #B的字符串

for i in range(input_list.__len__()): #遍历猜测的数字

if input_list[i] == target_list[i]:

a += 1

if input_list[i] in target_list and input_list[i] != target_list[i]:

b += ‘B‘

result = ("%sA%sB" % (a, len(b)))

#将猜测的结果写入结果集,不重复记录

tmp = []

for key in self.history:

tmp.append(key)

if self.number in tmp:

pass

else:

self.history[self.number] = result

return result

#在start函数中调用

def start(self):

self.guess_number = guessNumber.genRandomNum(self) #先生成被猜测的数字,写入类中

while True: #呼应user方法的返回值:1

self.number = guessNumber.user() #然后用户开始猜测

if self.number != 1:

result = guessNumber.tip(self)

if result == ‘4A0B‘: #准出条件,还有隐藏的q/Q/quit!

print("恭喜你,你赢了!")

break

else:

print("你猜测的数字是: " + self.number + " 结果是: " + result)

else:

print("游戏结束,欢迎下次游戏!")

break

if __name__ == ‘__main__‘:

game = guessNumber()

game.start()

总结:

1、还可以继续优化

2、可以尝试实现电脑和人脑对局。第一种是猜同一组数字,电脑必须分析并返回最大结果给玩家,但是另外却存储最有可能的数据集合,直到运行出唯一正确答案后直接战胜玩家。另外一种是玩家和电脑对猜对方的数字,先猜正确的先赢。

标签:

原文地址:http://www.cnblogs.com/stanmao/p/5599338.html

你可能感兴趣的:(python猜数字统计游戏次数)