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