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