主要内容 #
-
- 游戏类验证函数模块
- 游戏类检查函数模块
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点游戏中的游戏类的验证函数和结果检验函数。