写了三版解决了所有的bug,二话不说先放代码:
# -*- coding: utf-8 -*-
import random
class GuessGame:
def __init__(self): # 类似于C++中的默认构造函数
self.count = 0 # 用户猜测的次数
self.user_nums = [] # 用户猜测的数字
self.sys_nums = '' # 系统生成的数字
self.user_results = [] # 用户猜测的结果
self.is_win = False # 最后是否猜出来
def print_rules(self): # 打印出游戏规则
rules = u"""
由系统随机生成不重复的四位数字,用户猜,之后系统进行提示。
A代表数字正确位置正确个数,
B代表数字正确位置错误个数,
如正确答案为5234,而猜的人猜5346,则是1A2B,
接着猜的人根据出题人的几A几B继续猜,直到猜中(即4A0B)为止。
"""
print(rules)
def random_nums(self): # 生成随机四位数
num_list = range(0, 9)
ran_nums = random.sample(num_list, 4)
for i in range(4):
self.sys_nums = self.sys_nums + str(ran_nums[i])
# print(self.sys_nums)
def is_four_len(self, num): # 判断是否是4位数
return len(num)-4
def is_all_nums(self, num): # 判断是否都是数字
return num.isdigit()
def is_same_num(self, num): # 判断是否存在重复
if len(num) == len(set(num)):
return True
else:
return False
def num_input(self): # 接受用户输入的数字
self.count += 1
while True:
num = input("请输入一个四位数:")
if self.is_four_len(num) != 0:
print("输入有误,只能四位!")
continue
elif not self.is_all_nums(num):
print("输入有误,不能含有字符!")
elif not self.is_same_num(num):
print("输入有误,不能有重复!")
else:
self.user_nums.append(num)
return num
def num_judge(self, sys_nums, user_nums): # 判断%A%B
countA = 0
countB = 0
for i in range(4):
if user_nums[i] in sys_nums:
if i == sys_nums.find(user_nums[i]):
countA += 1
else:
countB += 1
result = "%dA%dB" % (countA, countB)
self.user_results.append(result)
if countA == 4:
self.is_win = True
def show_result(self, user_nums, result): # 显示结果
print("_"*30)
for i in range(self.count):
print('(%d)%s||%s' % (i+1, user_nums[i], result[i]))
print("_"*30)
if self.is_win:
print("总次数: %d times" % self.count)
print("恭喜,你猜对了!")
def run(self): # 运行
self.print_rules()
self.random_nums()
while not self.is_win:
num = self.num_input()
self.num_judge(self.sys_nums, num)
self.show_result(self.user_nums, self.user_results)
def main(): # 主函数
game = GuessGame()
game.run()
if __name__ == '__main__':
main()
然后说一下没弄明白的bug吧,在判断是否存在重复板块,之前只用循环遍历写的,发现有很多重复的数字并不能识别出来,之前的代码是这样的:
def is_same_num(self, num): # 判断是否存在重复
for i in range(len(num)):
if num.count(num[i]) == 1:
return True
else:
return False
不明白这样的写法哪里出了问题,我检查了一下这样查询重复元素是没有问题的,但是在这个class里就不是很有效了,希望有感兴趣的可以一起讨论,也欢迎大佬指点一二。