寫了三版解決了所有的bug,二話不說先放代碼:
# -*- coding: utf-8 -*-
import random
class GuessGame:
? ? def __init__(self):? # 類似于C++中的默認(rèn)構(gòu)造函數(shù)
? ? ? ? self.count = 0? # 用戶猜測的次數(shù)
? ? ? ? self.user_nums = []? # 用戶猜測的數(shù)字
? ? ? ? self.sys_nums = ''? # 系統(tǒng)生成的數(shù)字
? ? ? ? self.user_results = []? # 用戶猜測的結(jié)果
? ? ? ? self.is_win = False? # 最后是否猜出來
? ? def print_rules(self):? # 打印出游戲規(guī)則
? ? ? ? rules = u"""
由系統(tǒng)隨機(jī)生成不重復(fù)的四位數(shù)字线婚,用戶猜,之后系統(tǒng)進(jìn)行提示勉抓。
A代表數(shù)字正確位置正確個(gè)數(shù),
B代表數(shù)字正確位置錯誤個(gè)數(shù),
如正確答案為5234,而猜的人猜5346倍阐,則是1A2B,
接著猜的人根據(jù)出題人的幾A幾B繼續(xù)猜逗威,直到猜中(即4A0B)為止峰搪。
"""
? ? ? ? print(rules)
? ? def random_nums(self):? # 生成隨機(jī)四位數(shù)
? ? ? ? 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位數(shù)
? ? ? ? return len(num)-4
? ? def is_all_nums(self, num):? # 判斷是否都是數(shù)字
? ? ? ? return num.isdigit()
? ? def is_same_num(self, num):? # 判斷是否存在重復(fù)
? ? ? ? if len(num) == len(set(num)):
? ? ? ? ? ? return True
? ? ? ? else:
? ? ? ? ? ? return False
? ? def num_input(self):? # 接受用戶輸入的數(shù)字
? ? ? ? self.count += 1
? ? ? ? while True:
? ? ? ? ? ? num = input("請輸入一個(gè)四位數(shù):")
? ? ? ? ? ? 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("輸入有誤尽纽,不能有重復(fù)!")
? ? ? ? ? ? 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):? # 顯示結(jié)果
? ? ? ? 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("總次數(shù): %d times" % self.count)
? ? ? ? ? ? ? ? print("恭喜童漩,你猜對了!")
? ? def run(self):? # 運(yùn)行
? ? ? ? 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():? # 主函數(shù)
? ? game = GuessGame()
? ? game.run()
if __name__ == '__main__':
? ? main()
然后說一下沒弄明白的bug吧弄贿,在判斷是否存在重復(fù)板塊,之前只用循環(huán)遍歷寫的矫膨,發(fā)現(xiàn)有很多重復(fù)的數(shù)字并不能識別出來差凹,之前的代碼是這樣的:
def is_same_num(self, num):? # 判斷是否存在重復(fù)
? ? for i in range(len(num)):
????????if num.count(num[i]) == 1:
????????????return True
? ? else:
????????????return False
不明白這樣的寫法哪里出了問題,我檢查了一下這樣查詢重復(fù)元素是沒有問題的侧馅,但是在這個(gè)class里就不是很有效了危尿,希望有感興趣的可以一起討論,也歡迎大佬指點(diǎn)一二馁痴。