跳至正文
View Categories

1 min read

主要内容 #

    1. 游戏类验证函数模块
    2. 游戏类检查函数模块

1.游戏类验证函数模块 #

上一节课,我们知晓了如何随机生成一组数据,但是没有做任何校验,该模块实现的功能为:校验生成的一组数据是否能完成24点的游戏,不能完成的数据要重新生成。
该部分代码如下:

    def __verify(self):
        '''
        验证生成的数字是否有答案,主要就是经过不断循环四则运算,检测是否有符合要求的运算
        '''
        answers = []
        for item in self.__iter(self.numbers_ori, len(self.numbers_ori)):
            item_dict = []
            list(map(lambda i: item_dict.append({str(i): i}), item))
            #  一共有两种计算方法如下,由于有乘除法,所以第一组方法是顺序计算最后再计算,第二组方法是两两配对最后再计算
            solution1 = self.__func(self.__func(self.__func(item_dict[0], item_dict[1]), item_dict[2]), item_dict[3])
            solution2 = self.__func(self.__func(item_dict[0], item_dict[1]), self.__func(item_dict[2], item_dict[3]))
            solution = dict()
            solution.update(solution1)
            solution.update(solution2)
            for key, value in solution.items():
                if float(value) == self.target:
                    answers.append(key)  # 添加到答案列表
        # 避免有数字重复时表达式重复
        answers = list(set(answers))
        return answers

    def __iter(self, items, n):
        '''
        递归枚举
        '''
        for idx, item in enumerate(items):
            if n == 1:
                yield [item]
            else:
                for each in self.__iter(items[:idx] + items[idx + 1:], n - 1):
                    yield [item] + each

    def __func(self, a, b):
        '''
        计算函数
        '''
        res = dict()
        for key1, value1 in a.items():
            for key2, value2 in b.items():  # 分别计算两个数的加减乘除
                res.update({'(' + key1 + '+' + key2 + ')': value1 + value2})
                res.update({'(' + key1 + '-' + key2 + ')': value1 - value2})
                res.update({'(' + key2 + '-' + key1 + ')': value2 - value1})
                res.update({'(' + key1 + '×' + key2 + ')': value1 * value2})
                value2 > 0 and res.update({'(' + key1 + '÷' + key2 + ')': value1 / value2})
                value1 > 0 and res.update({'(' + key2 + '÷' + key1 + ')': value2 / value1})
        return res

将以上所有代码加入到游戏类代码中,作为成员函数,这里的验证模块尤其重要,还请大家细致理解代码原理。

接下来需要在各个模块中添加和修改代码,具体如下。

    # 在Game24Generator类中的generate()函数中找到如下代码
	self.answers = True
    # self.answers = self.__verify()  # 答案列表

    # 将代码修改为如下格式
	# self.answers = True
    self.answers = self.__verify()  # 答案列表

全部修改完之后,运行整体代码,看整体效果,这样在shell终端输出的列表就是满足24点的一组数字,大家可以验证一下。

2.游戏类检查函数模块 #

该模块函数的主要目的是检查最后的结果是否满足24点胜利的条件。
代码如下所示:

    def check(self):
        '''
        只剩下一个数字时检查是否为24
        '''
        if len(self.numbers_now) == 1 and float(self.numbers_now[0]) == self.target:
            return True
        return False

将以上所有代码加入到游戏类代码中,作为成员函数,该部分函数用于后续的检验部分。

小结 #

  • 本节主要介绍了24点游戏中的游戏类的验证函数和结果检验函数。