python3_1A2B猜数字游戏

2020-05-20  本文已影响0人  xyb_python

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

上一篇 下一篇

猜你喜欢

热点阅读