美文网首页
python3_1A2B猜数字游戏

python3_1A2B猜数字游戏

作者: xyb_python | 来源:发表于2020-05-20 11:32 被阅读0次

    写了三版解决了所有的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里就不是很有效了,希望有感兴趣的可以一起讨论,也欢迎大佬指点一二。

    相关文章

      网友评论

          本文标题:python3_1A2B猜数字游戏

          本文链接:https://www.haomeiwen.com/subject/shygohtx.html