diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..11a5d8e --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +main.py \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e557d17 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..c944160 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/ykaxem9u.iml b/.idea/ykaxem9u.iml new file mode 100644 index 0000000..9b31378 --- /dev/null +++ b/.idea/ykaxem9u.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/20240401计算思维程序实践-第9章 表达式解析思维与二十四点游戏.docx b/20240401计算思维程序实践-第9章 表达式解析思维与二十四点游戏.docx new file mode 100644 index 0000000..39ceef3 Binary files /dev/null and b/20240401计算思维程序实践-第9章 表达式解析思维与二十四点游戏.docx differ diff --git a/TreeNode.py b/TreeNode.py new file mode 100644 index 0000000..fdadab7 --- /dev/null +++ b/TreeNode.py @@ -0,0 +1,201 @@ +# -*- encoding: utf-8 -*- +""" + @Author: packy945 + @FileName: TreeNode.py + @DateTime: 2023/5/15 14:27 + @SoftWare: PyCharm +""" + +import re +import tkinter as tk +from data import * +import tkinter.messagebox + + +class Tree: + def __init__(self): + self.bc = 70 + self.Node = [] + self.rootID = None + self.deepth = [] + self.place = [] + self.mark = [0] * 110 + self.ck = [] + + def check(self): + self.ck = [1] * len(self.Node) + for N in self.Node: + if N[3]: + self.ck[N[3]] = 0 + if N[4]: + self.ck[N[4]] = 0 + + def remark(self): + self.mark = [0] * 110 + + + + def deep(self): + flag = 0 + for i in range(len(self.Node)): + if self.Node[i][1] == 'Value': + self.deepth[i] = 0 + + for i in range(len(self.Node)): + if self.deepth[i] == -1: + flag = 1 + if self.Node[i][3] != None and self.Node[i][4] != None: + # print(self.Node[i][3], self.Node[i][4]) + self.deepth[i] = max(self.deepth[self.Node[i][3]], self.deepth[self.Node[i][4]]) + 1 + # print(self.deepth) + if flag: + self.deep() + + def calculate(self, node): + # print(node) + if node[1] == 'Value': + return node[5] * 1.0 + elif node[1] == 'Operator': + a = self.calculate(self.Node[node[3]]) + b = self.calculate(self.Node[node[4]]) + if node[2] == '^': + return pow(int(a), int(b)) + else: + # print(a,node[2],b) + return eval(str(a) + node[2] + str(b)) + + def Aexp(self, node): + + if node[1] == 'Value': + return str(node[5]) + elif node[1] == 'Operator': + a = self.Aexp(self.Node[node[3]]) + b = self.Aexp(self.Node[node[4]]) + # print(a,node[2],b) + ans = '(' + str(a) + node[2] + str(b) + ')' + # print(ans) + return ans + + +tree = Tree() + + +cur = 0 +class TreeNode: + def __init__(self, Type, value, left=None, right=None, color='方块'): + global cur + self.NodeID = cur # 节点编号 + cur += 1 + self.NodeType = Type # 节点类型 + self.Ops = None # 运算符类型 + self.left = left + self.right = right + self.LeftNodeID = None + self.RightNodeID = None + if self.left: + self.LeftNodeID = left.NodeID # 左节点编号 + if self.right: + self.RightNodeID = right.NodeID # 右节点编号 + self.FaceValue = None # 节点数值 + self.FaceColor = color # 节点花色 + if Type == 'Value': + self.FaceValue = value + else: + self.Ops = value + + tree.Node.append([self.NodeID, self.NodeType, self.Ops, self.LeftNodeID, self.RightNodeID, self.FaceValue, self.FaceColor]) + + + +def build_ast(formula): + ''' + 建立语法树 + :param formula: 表达式,表达式的花色 + :return: 建立好的语法树 + ''' + # 去掉空格 + + global tree, cur + try: + expr, color = formula + except: + expr = formula + color = ['方块'] * 20 + if len(expr) == 0: + tk.messagebox.showinfo('', '表达式不存在') + return + cur = 0 + tree.__init__() + + expr = expr.replace(' ', '') + + # 将所有数字和符号分离出来 + tokens = re.findall(r'\d+|[()+\-*/^.]', expr) + i = 0 + for token in tokens: + if tokens[i] == '.': + + tokens[i - 1] = tokens[i - 1] + tokens[i] + tokens[i + 1] + del tokens[i: i + 2] + i += 1 + + # 定义优先级 + precedence = {'+': 1, '-': 1, '*': 2, '/': 2, '^': 3} + + # 创建一个操作符栈和一个节点栈 + op_stack = [] + node_stack = [] + + color_cur = 0 + # 遍历所有 token + for token in tokens: + if token.isdigit(): + # print(cur, color[cur]) + node_stack.append(TreeNode('Value', int(token), color=color[color_cur])) + color_cur += 1 + elif token.count('.') == 1: + node_stack.append(TreeNode('Value', float(token), color=color[color_cur])) + color_cur += 1 + elif token in '+-*/^': + while op_stack and op_stack[-1] != '(' and precedence[token] <= precedence[op_stack[-1]]: + op = op_stack.pop() + right = node_stack.pop() + left = node_stack.pop() + node_stack.append(TreeNode('Operator', op, left, right)) + op_stack.append(token) + elif token == '(': + op_stack.append(token) + elif token == ')': + while op_stack and op_stack[-1] != '(': + op = op_stack.pop() + right = node_stack.pop() + left = node_stack.pop() + node_stack.append(TreeNode('Operator', op, left, right)) + op_stack.pop() + + # 处理剩下的操作符 + while op_stack: + op = op_stack.pop() + right = node_stack.pop() + left = node_stack.pop() + node_stack.append(TreeNode('Operator', op, left, right)) + + # 返回抽象语法树的根节点 + tree.rootID = node_stack[0].NodeID + # print(tree.rootID) + # print(tree.Node) + return node_stack[0] + + +def print_ast(node:TreeNode, prefix='', is_left=True): + if node: + if node.NodeType == 'Value': + s = str(node.FaceValue) + else: + s = str(node.Ops) + print(prefix + ('├── ' if is_left else '└── ') + s) + print_ast(node.left, prefix + ('│ ' if is_left else ' '), True) + print_ast(node.right, prefix + ('│ ' if is_left else ' '), False) + + + diff --git a/butt_test.py b/butt_test.py new file mode 100644 index 0000000..5056adc --- /dev/null +++ b/butt_test.py @@ -0,0 +1,14 @@ +from PIL import Image, ImageDraw, ImageFont + +# 创建一个图像 +image = Image.new("RGB", (100, 100), "white") +draw = ImageDraw.Draw(image) + +# 加载默认字体 +font = ImageFont.load_default() + +# 要获取文本的大小 +text = "Hello, World!" +text_size = draw.textsize(text, font) + +print("Text size:", text_size) diff --git a/card/Club/Club10.png b/card/Club/Club10.png new file mode 100644 index 0000000..8a57774 Binary files /dev/null and b/card/Club/Club10.png differ diff --git a/card/Club/Club2.png b/card/Club/Club2.png new file mode 100644 index 0000000..89b0856 Binary files /dev/null and b/card/Club/Club2.png differ diff --git a/card/Club/Club3.png b/card/Club/Club3.png new file mode 100644 index 0000000..56d80cb Binary files /dev/null and b/card/Club/Club3.png differ diff --git a/card/Club/Club4.png b/card/Club/Club4.png new file mode 100644 index 0000000..6f1c91c Binary files /dev/null and b/card/Club/Club4.png differ diff --git a/card/Club/Club5.png b/card/Club/Club5.png new file mode 100644 index 0000000..08e293f Binary files /dev/null and b/card/Club/Club5.png differ diff --git a/card/Club/Club6.png b/card/Club/Club6.png new file mode 100644 index 0000000..b883ac0 Binary files /dev/null and b/card/Club/Club6.png differ diff --git a/card/Club/Club7.png b/card/Club/Club7.png new file mode 100644 index 0000000..350fcd6 Binary files /dev/null and b/card/Club/Club7.png differ diff --git a/card/Club/Club8.png b/card/Club/Club8.png new file mode 100644 index 0000000..0e48bba Binary files /dev/null and b/card/Club/Club8.png differ diff --git a/card/Club/Club9.png b/card/Club/Club9.png new file mode 100644 index 0000000..f5d6067 Binary files /dev/null and b/card/Club/Club9.png differ diff --git a/card/Club/Cluba.png b/card/Club/Cluba.png new file mode 100644 index 0000000..28c50b8 Binary files /dev/null and b/card/Club/Cluba.png differ diff --git a/card/Club/Clubj.png b/card/Club/Clubj.png new file mode 100644 index 0000000..0939094 Binary files /dev/null and b/card/Club/Clubj.png differ diff --git a/card/Club/Clubk.png b/card/Club/Clubk.png new file mode 100644 index 0000000..e743cae Binary files /dev/null and b/card/Club/Clubk.png differ diff --git a/card/Club/Clubq.png b/card/Club/Clubq.png new file mode 100644 index 0000000..e66b6b9 Binary files /dev/null and b/card/Club/Clubq.png differ diff --git a/card/Diamond/Diamond10.png b/card/Diamond/Diamond10.png new file mode 100644 index 0000000..159d808 Binary files /dev/null and b/card/Diamond/Diamond10.png differ diff --git a/card/Diamond/Diamond2.png b/card/Diamond/Diamond2.png new file mode 100644 index 0000000..274d9fa Binary files /dev/null and b/card/Diamond/Diamond2.png differ diff --git a/card/Diamond/Diamond3.png b/card/Diamond/Diamond3.png new file mode 100644 index 0000000..eb10cb2 Binary files /dev/null and b/card/Diamond/Diamond3.png differ diff --git a/card/Diamond/Diamond4.png b/card/Diamond/Diamond4.png new file mode 100644 index 0000000..eed01a7 Binary files /dev/null and b/card/Diamond/Diamond4.png differ diff --git a/card/Diamond/Diamond5.png b/card/Diamond/Diamond5.png new file mode 100644 index 0000000..d33fd42 Binary files /dev/null and b/card/Diamond/Diamond5.png differ diff --git a/card/Diamond/Diamond6.png b/card/Diamond/Diamond6.png new file mode 100644 index 0000000..b60cf3c Binary files /dev/null and b/card/Diamond/Diamond6.png differ diff --git a/card/Diamond/Diamond7.png b/card/Diamond/Diamond7.png new file mode 100644 index 0000000..8f20654 Binary files /dev/null and b/card/Diamond/Diamond7.png differ diff --git a/card/Diamond/Diamond8.png b/card/Diamond/Diamond8.png new file mode 100644 index 0000000..bb9f311 Binary files /dev/null and b/card/Diamond/Diamond8.png differ diff --git a/card/Diamond/Diamond9.png b/card/Diamond/Diamond9.png new file mode 100644 index 0000000..d2785e0 Binary files /dev/null and b/card/Diamond/Diamond9.png differ diff --git a/card/Diamond/Diamonda.png b/card/Diamond/Diamonda.png new file mode 100644 index 0000000..2ad2cd9 Binary files /dev/null and b/card/Diamond/Diamonda.png differ diff --git a/card/Diamond/Diamondj.png b/card/Diamond/Diamondj.png new file mode 100644 index 0000000..cfabd22 Binary files /dev/null and b/card/Diamond/Diamondj.png differ diff --git a/card/Diamond/Diamondk.png b/card/Diamond/Diamondk.png new file mode 100644 index 0000000..162c8dd Binary files /dev/null and b/card/Diamond/Diamondk.png differ diff --git a/card/Diamond/Diamondq.png b/card/Diamond/Diamondq.png new file mode 100644 index 0000000..c8d58bf Binary files /dev/null and b/card/Diamond/Diamondq.png differ diff --git a/card/Heart/Heart10.png b/card/Heart/Heart10.png new file mode 100644 index 0000000..ef45f91 Binary files /dev/null and b/card/Heart/Heart10.png differ diff --git a/card/Heart/Heart2.png b/card/Heart/Heart2.png new file mode 100644 index 0000000..060190d Binary files /dev/null and b/card/Heart/Heart2.png differ diff --git a/card/Heart/Heart3.png b/card/Heart/Heart3.png new file mode 100644 index 0000000..690c345 Binary files /dev/null and b/card/Heart/Heart3.png differ diff --git a/card/Heart/Heart4.png b/card/Heart/Heart4.png new file mode 100644 index 0000000..aca2ab8 Binary files /dev/null and b/card/Heart/Heart4.png differ diff --git a/card/Heart/Heart5.png b/card/Heart/Heart5.png new file mode 100644 index 0000000..ff73f81 Binary files /dev/null and b/card/Heart/Heart5.png differ diff --git a/card/Heart/Heart6.png b/card/Heart/Heart6.png new file mode 100644 index 0000000..8875ad0 Binary files /dev/null and b/card/Heart/Heart6.png differ diff --git a/card/Heart/Heart7.png b/card/Heart/Heart7.png new file mode 100644 index 0000000..4e2bf76 Binary files /dev/null and b/card/Heart/Heart7.png differ diff --git a/card/Heart/Heart8.png b/card/Heart/Heart8.png new file mode 100644 index 0000000..d3af43c Binary files /dev/null and b/card/Heart/Heart8.png differ diff --git a/card/Heart/Heart9.png b/card/Heart/Heart9.png new file mode 100644 index 0000000..cec0a62 Binary files /dev/null and b/card/Heart/Heart9.png differ diff --git a/card/Heart/Hearta.png b/card/Heart/Hearta.png new file mode 100644 index 0000000..6b9c940 Binary files /dev/null and b/card/Heart/Hearta.png differ diff --git a/card/Heart/Heartj.png b/card/Heart/Heartj.png new file mode 100644 index 0000000..4356828 Binary files /dev/null and b/card/Heart/Heartj.png differ diff --git a/card/Heart/Heartk.png b/card/Heart/Heartk.png new file mode 100644 index 0000000..91de80a Binary files /dev/null and b/card/Heart/Heartk.png differ diff --git a/card/Heart/Heartq.png b/card/Heart/Heartq.png new file mode 100644 index 0000000..7e7668c Binary files /dev/null and b/card/Heart/Heartq.png differ diff --git a/card/Spade/Spade10.png b/card/Spade/Spade10.png new file mode 100644 index 0000000..6a0968f Binary files /dev/null and b/card/Spade/Spade10.png differ diff --git a/card/Spade/Spade2.png b/card/Spade/Spade2.png new file mode 100644 index 0000000..a2624c8 Binary files /dev/null and b/card/Spade/Spade2.png differ diff --git a/card/Spade/Spade3.png b/card/Spade/Spade3.png new file mode 100644 index 0000000..5af6c5e Binary files /dev/null and b/card/Spade/Spade3.png differ diff --git a/card/Spade/Spade4.png b/card/Spade/Spade4.png new file mode 100644 index 0000000..3434284 Binary files /dev/null and b/card/Spade/Spade4.png differ diff --git a/card/Spade/Spade5.png b/card/Spade/Spade5.png new file mode 100644 index 0000000..2657ac2 Binary files /dev/null and b/card/Spade/Spade5.png differ diff --git a/card/Spade/Spade6.png b/card/Spade/Spade6.png new file mode 100644 index 0000000..cdc8079 Binary files /dev/null and b/card/Spade/Spade6.png differ diff --git a/card/Spade/Spade7.png b/card/Spade/Spade7.png new file mode 100644 index 0000000..377af8b Binary files /dev/null and b/card/Spade/Spade7.png differ diff --git a/card/Spade/Spade8.png b/card/Spade/Spade8.png new file mode 100644 index 0000000..722911c Binary files /dev/null and b/card/Spade/Spade8.png differ diff --git a/card/Spade/Spade9.png b/card/Spade/Spade9.png new file mode 100644 index 0000000..ce3877a Binary files /dev/null and b/card/Spade/Spade9.png differ diff --git a/card/Spade/Spadea.png b/card/Spade/Spadea.png new file mode 100644 index 0000000..9b82294 Binary files /dev/null and b/card/Spade/Spadea.png differ diff --git a/card/Spade/Spadej.png b/card/Spade/Spadej.png new file mode 100644 index 0000000..6b77c4c Binary files /dev/null and b/card/Spade/Spadej.png differ diff --git a/card/Spade/Spadek.png b/card/Spade/Spadek.png new file mode 100644 index 0000000..b7c1c2f Binary files /dev/null and b/card/Spade/Spadek.png differ diff --git a/card/Spade/Spadeq.png b/card/Spade/Spadeq.png new file mode 100644 index 0000000..c82b344 Binary files /dev/null and b/card/Spade/Spadeq.png differ diff --git a/data.py b/data.py new file mode 100644 index 0000000..952684c --- /dev/null +++ b/data.py @@ -0,0 +1,101 @@ +# -*- encoding: utf-8 -*- +""" + @Author: packy945 + @FileName: data.py + @DateTime: 2023/5/11 14:36 + @SoftWare: PyCharm +""" +from itertools import permutations +import random +import tkinter as tk + +MARK = '#ff0000' +NOMARK = '#cccccc' + + +class Aexp: + def __init__(self, a, b, c, d): + self.Aexp_cur = 0 + self.num = 0 + self.card = [a, b, c, d] + self.answer = [] + self.Color = [] + self.Aexp(a, b, c, d) + + def refresh(self, a, b, c, d): + self.Aexp_cur = 0 + self.num = 0 + self.card = [a, b, c, d] + # print(self.card) + self.answer = [] + self.Color = [] + self.Aexp(a, b, c, d) + + def Aexp(self, one, two, three, four): + ''' + 输入四个数,求24点 + :param one: + :param two: + :param three: + :param four: + :return: 求解24点结果。若无法得出则返回“无法求得结果” + ''' + self.Aexp_cur = 0 + my_list = [one, two, three, four] + result = [c for c in permutations(my_list, 4)] + list2 = [] # 算出24的排列组合的列表 + symbols = ["+", "-", "*", "/"] + flag = False + for one, two, three, four in result: + for s1 in symbols: + for s2 in symbols: + for s3 in symbols: + express = ["(({0}{1}{2}){3}{4}){5}{6}".format(one[1], s1, two[1], s2, three[1], s3, four[1]), + "({0}{1}{2}){3}({4}{5}{6})".format(one[1], s1, two[1], s2, three[1], s3, four[1]), + "({0}{1}({2}{3}{4})){5}{6}".format(one[1], s1, two[1], s2, three[1], s3, four[1]), + "{0}{1}(({2}{3}{4}){5}{6})".format(one[1], s1, two[1], s2, three[1], s3, four[1]), + "{0}{1}({2}{3}({4}{5}{6}))".format(one[1], s1, two[1], s2, three[1], s3, four[1])] + # if str(one) + str(two) + str(three) + str(four) == "8383": + # print(express) + for e in express: + try: + if round(eval(e), 6) == 24: + e = del_parentheses(e) + list2.append(e) + self.Color.append([one[0], two[0], three[0], four[0]]) + flag = True + except ZeroDivisionError: + pass + + + if flag: + self.answer = list2 + self.num = len(list2) + # return list3 + + else: + self.answer = ["无法得出24点"] + self.Color.append(None) + self.num = 0 + + +#删除最外层括号 +def del_parentheses(e): + if e[0] == '(' and e[-1] == ')': + try: + eval(e[1:len(e)-1]) + except: + pass + else: + if round(eval(e[1:len(e)-1]),6) == 24: + return e[1:len(e)-1] + return e + + + +if __name__ == '__main__': + ans = Aexp(1, 2, 4, 6) + for i in ans.answer: + print(i) + # print(ans) + pass diff --git a/expressions.txt b/expressions.txt new file mode 100644 index 0000000..dce7c22 --- /dev/null +++ b/expressions.txt @@ -0,0 +1,20 @@ +(8 + 3) * (6 - 2) +9 - (4 + 2) * (7 - 1) +(2 * 3) + (5 - 1) / 4 +((7 + 2) - 1) * (8 / 4) +9 * (3 - 1) + (8 / 4) +((9 - 1) / (4 + 1)) + 7 * 3 +(8 - 3) * ((6 + 2) / 4) + 9 +((7 * 2) - 4) * ((9 + 3) / 5) + 1 +(9 + 4) * ((7 - 2) / (8 + 1)) - 6 +((5 - 3) * (9 + 7)) / (8 - 2) + 6 +(6 + 2) * (9 - 3) +8 - (5 + 1) * (7 - 2) +(3 * 4) + (8 - 2) / 5 +((6 + 3) - 2) * (7 / 4) +8 * (2 - 1) + (9 / 3) +((4 - 2) / (9 + 1)) + 5 * 7 +(7 - 2) * ((5 + 3) / 6) + 4 +((6 * 3) - 1) * ((8 + 2) / 5) + 9 +(19 + 21) * ((14 - 11) / (7 + 3)) - 5 +((81 - 45) * (36 + 21)) / (18 - 6) + 7 diff --git a/img/+.png b/img/+.png new file mode 100644 index 0000000..9d51fa8 Binary files /dev/null and b/img/+.png differ diff --git a/img/+@2x.png b/img/+@2x.png new file mode 100644 index 0000000..33818c6 Binary files /dev/null and b/img/+@2x.png differ diff --git a/img/+@3x.png b/img/+@3x.png new file mode 100644 index 0000000..510a279 Binary files /dev/null and b/img/+@3x.png differ diff --git a/img/-.png b/img/-.png new file mode 100644 index 0000000..0d583c9 Binary files /dev/null and b/img/-.png differ diff --git a/img/-@2x.png b/img/-@2x.png new file mode 100644 index 0000000..b160df4 Binary files /dev/null and b/img/-@2x.png differ diff --git a/img/-@3x.png b/img/-@3x.png new file mode 100644 index 0000000..73a74e1 Binary files /dev/null and b/img/-@3x.png differ diff --git a/img/1.png b/img/1.png new file mode 100644 index 0000000..b1f7d9d Binary files /dev/null and b/img/1.png differ diff --git a/img/10.png b/img/10.png new file mode 100644 index 0000000..885db96 Binary files /dev/null and b/img/10.png differ diff --git a/img/100.png b/img/100.png new file mode 100644 index 0000000..a060cec Binary files /dev/null and b/img/100.png differ diff --git a/img/1000.png b/img/1000.png new file mode 100644 index 0000000..94de315 Binary files /dev/null and b/img/1000.png differ diff --git a/img/1000@2x.png b/img/1000@2x.png new file mode 100644 index 0000000..282e2c5 Binary files /dev/null and b/img/1000@2x.png differ diff --git a/img/1000@3x.png b/img/1000@3x.png new file mode 100644 index 0000000..c7c0783 Binary files /dev/null and b/img/1000@3x.png differ diff --git a/img/100@2x.png b/img/100@2x.png new file mode 100644 index 0000000..e563339 Binary files /dev/null and b/img/100@2x.png differ diff --git a/img/100@3x.png b/img/100@3x.png new file mode 100644 index 0000000..8a04011 Binary files /dev/null and b/img/100@3x.png differ diff --git a/img/10@2x.png b/img/10@2x.png new file mode 100644 index 0000000..91cf173 Binary files /dev/null and b/img/10@2x.png differ diff --git a/img/10@3x.png b/img/10@3x.png new file mode 100644 index 0000000..3c82f74 Binary files /dev/null and b/img/10@3x.png differ diff --git a/img/11.png b/img/11.png new file mode 100644 index 0000000..1dec6e8 Binary files /dev/null and b/img/11.png differ diff --git a/img/110.png b/img/110.png new file mode 100644 index 0000000..ed650c5 Binary files /dev/null and b/img/110.png differ diff --git a/img/110@2x.png b/img/110@2x.png new file mode 100644 index 0000000..298a7f1 Binary files /dev/null and b/img/110@2x.png differ diff --git a/img/110@3x.png b/img/110@3x.png new file mode 100644 index 0000000..68f0789 Binary files /dev/null and b/img/110@3x.png differ diff --git a/img/11@2x.png b/img/11@2x.png new file mode 100644 index 0000000..85c8b25 Binary files /dev/null and b/img/11@2x.png differ diff --git a/img/11@3x.png b/img/11@3x.png new file mode 100644 index 0000000..9da194a Binary files /dev/null and b/img/11@3x.png differ diff --git a/img/12.png b/img/12.png new file mode 100644 index 0000000..c2772f9 Binary files /dev/null and b/img/12.png differ diff --git a/img/123.png b/img/123.png new file mode 100644 index 0000000..4eff570 Binary files /dev/null and b/img/123.png differ diff --git a/img/123123.png b/img/123123.png new file mode 100644 index 0000000..b22a293 Binary files /dev/null and b/img/123123.png differ diff --git a/img/123123@2x.png b/img/123123@2x.png new file mode 100644 index 0000000..9b55581 Binary files /dev/null and b/img/123123@2x.png differ diff --git a/img/123123@3x.png b/img/123123@3x.png new file mode 100644 index 0000000..83a15bb Binary files /dev/null and b/img/123123@3x.png differ diff --git a/img/1234.png b/img/1234.png new file mode 100644 index 0000000..9527d94 Binary files /dev/null and b/img/1234.png differ diff --git a/img/1234@2x.png b/img/1234@2x.png new file mode 100644 index 0000000..3293ed3 Binary files /dev/null and b/img/1234@2x.png differ diff --git a/img/1234@3x.png b/img/1234@3x.png new file mode 100644 index 0000000..c489da5 Binary files /dev/null and b/img/1234@3x.png differ diff --git a/img/123@2x.png b/img/123@2x.png new file mode 100644 index 0000000..7792e16 Binary files /dev/null and b/img/123@2x.png differ diff --git a/img/123@3x.png b/img/123@3x.png new file mode 100644 index 0000000..d317940 Binary files /dev/null and b/img/123@3x.png differ diff --git a/img/12@2x.png b/img/12@2x.png new file mode 100644 index 0000000..08caa7d Binary files /dev/null and b/img/12@2x.png differ diff --git a/img/12@3x.png b/img/12@3x.png new file mode 100644 index 0000000..197e589 Binary files /dev/null and b/img/12@3x.png differ diff --git a/img/13.png b/img/13.png new file mode 100644 index 0000000..7160629 Binary files /dev/null and b/img/13.png differ diff --git a/img/13@2x.png b/img/13@2x.png new file mode 100644 index 0000000..3f25712 Binary files /dev/null and b/img/13@2x.png differ diff --git a/img/13@3x.png b/img/13@3x.png new file mode 100644 index 0000000..571fddd Binary files /dev/null and b/img/13@3x.png differ diff --git a/img/14.png b/img/14.png new file mode 100644 index 0000000..c17dcbc Binary files /dev/null and b/img/14.png differ diff --git a/img/14@2x.png b/img/14@2x.png new file mode 100644 index 0000000..407ad7a Binary files /dev/null and b/img/14@2x.png differ diff --git a/img/14@3x.png b/img/14@3x.png new file mode 100644 index 0000000..e06e482 Binary files /dev/null and b/img/14@3x.png differ diff --git a/img/18.png b/img/18.png new file mode 100644 index 0000000..8e43f4f Binary files /dev/null and b/img/18.png differ diff --git a/img/18@2x.png b/img/18@2x.png new file mode 100644 index 0000000..9d20f60 Binary files /dev/null and b/img/18@2x.png differ diff --git a/img/18@3x.png b/img/18@3x.png new file mode 100644 index 0000000..50a2265 Binary files /dev/null and b/img/18@3x.png differ diff --git a/img/19.png b/img/19.png new file mode 100644 index 0000000..96b41e8 Binary files /dev/null and b/img/19.png differ diff --git a/img/19@2x.png b/img/19@2x.png new file mode 100644 index 0000000..e469917 Binary files /dev/null and b/img/19@2x.png differ diff --git a/img/19@3x.png b/img/19@3x.png new file mode 100644 index 0000000..06228ed Binary files /dev/null and b/img/19@3x.png differ diff --git a/img/1@2x.png b/img/1@2x.png new file mode 100644 index 0000000..638930b Binary files /dev/null and b/img/1@2x.png differ diff --git a/img/1@3x.png b/img/1@3x.png new file mode 100644 index 0000000..af8cbe5 Binary files /dev/null and b/img/1@3x.png differ diff --git a/img/2.png b/img/2.png new file mode 100644 index 0000000..ca18e8c Binary files /dev/null and b/img/2.png differ diff --git a/img/21.png b/img/21.png new file mode 100644 index 0000000..1ba2c34 Binary files /dev/null and b/img/21.png differ diff --git a/img/21@2x.png b/img/21@2x.png new file mode 100644 index 0000000..5413b5e Binary files /dev/null and b/img/21@2x.png differ diff --git a/img/21@3x.png b/img/21@3x.png new file mode 100644 index 0000000..afb3146 Binary files /dev/null and b/img/21@3x.png differ diff --git a/img/2@2x.png b/img/2@2x.png new file mode 100644 index 0000000..3e2add2 Binary files /dev/null and b/img/2@2x.png differ diff --git a/img/2@3x.png b/img/2@3x.png new file mode 100644 index 0000000..9a033ff Binary files /dev/null and b/img/2@3x.png differ diff --git a/img/3.png b/img/3.png new file mode 100644 index 0000000..74e98ae Binary files /dev/null and b/img/3.png differ diff --git a/img/36.png b/img/36.png new file mode 100644 index 0000000..684f7d9 Binary files /dev/null and b/img/36.png differ diff --git a/img/36@2x.png b/img/36@2x.png new file mode 100644 index 0000000..9b8a1f9 Binary files /dev/null and b/img/36@2x.png differ diff --git a/img/36@3x.png b/img/36@3x.png new file mode 100644 index 0000000..991a0a1 Binary files /dev/null and b/img/36@3x.png differ diff --git a/img/3@2x.png b/img/3@2x.png new file mode 100644 index 0000000..5283535 Binary files /dev/null and b/img/3@2x.png differ diff --git a/img/3@3x.png b/img/3@3x.png new file mode 100644 index 0000000..31050e8 Binary files /dev/null and b/img/3@3x.png differ diff --git a/img/4.png b/img/4.png new file mode 100644 index 0000000..fee270c Binary files /dev/null and b/img/4.png differ diff --git a/img/40.png b/img/40.png new file mode 100644 index 0000000..3bcb983 Binary files /dev/null and b/img/40.png differ diff --git a/img/400.png b/img/400.png new file mode 100644 index 0000000..4bb6b51 Binary files /dev/null and b/img/400.png differ diff --git a/img/40000.png b/img/40000.png new file mode 100644 index 0000000..e6efba1 Binary files /dev/null and b/img/40000.png differ diff --git a/img/40000@2x.png b/img/40000@2x.png new file mode 100644 index 0000000..6a1e144 Binary files /dev/null and b/img/40000@2x.png differ diff --git a/img/40000@3x.png b/img/40000@3x.png new file mode 100644 index 0000000..c6febab Binary files /dev/null and b/img/40000@3x.png differ diff --git a/img/400@2x.png b/img/400@2x.png new file mode 100644 index 0000000..0fa40d5 Binary files /dev/null and b/img/400@2x.png differ diff --git a/img/400@3x.png b/img/400@3x.png new file mode 100644 index 0000000..da7e043 Binary files /dev/null and b/img/400@3x.png differ diff --git a/img/40@2x.png b/img/40@2x.png new file mode 100644 index 0000000..e7b20ab Binary files /dev/null and b/img/40@2x.png differ diff --git a/img/40@3x.png b/img/40@3x.png new file mode 100644 index 0000000..7348672 Binary files /dev/null and b/img/40@3x.png differ diff --git a/img/45.png b/img/45.png new file mode 100644 index 0000000..d24e8b7 Binary files /dev/null and b/img/45.png differ diff --git a/img/45@2x.png b/img/45@2x.png new file mode 100644 index 0000000..80a92a0 Binary files /dev/null and b/img/45@2x.png differ diff --git a/img/45@3x.png b/img/45@3x.png new file mode 100644 index 0000000..3bfca5c Binary files /dev/null and b/img/45@3x.png differ diff --git a/img/4@2x.png b/img/4@2x.png new file mode 100644 index 0000000..4178114 Binary files /dev/null and b/img/4@2x.png differ diff --git a/img/4@3x.png b/img/4@3x.png new file mode 100644 index 0000000..5e9fa62 Binary files /dev/null and b/img/4@3x.png differ diff --git a/img/5.png b/img/5.png new file mode 100644 index 0000000..fec7ed1 Binary files /dev/null and b/img/5.png differ diff --git a/img/520.png b/img/520.png new file mode 100644 index 0000000..1d988d9 Binary files /dev/null and b/img/520.png differ diff --git a/img/520@2x.png b/img/520@2x.png new file mode 100644 index 0000000..de3793c Binary files /dev/null and b/img/520@2x.png differ diff --git a/img/520@3x.png b/img/520@3x.png new file mode 100644 index 0000000..51868cf Binary files /dev/null and b/img/520@3x.png differ diff --git a/img/5@2x.png b/img/5@2x.png new file mode 100644 index 0000000..5f96012 Binary files /dev/null and b/img/5@2x.png differ diff --git a/img/5@3x.png b/img/5@3x.png new file mode 100644 index 0000000..47e7a77 Binary files /dev/null and b/img/5@3x.png differ diff --git a/img/6.png b/img/6.png new file mode 100644 index 0000000..811ee16 Binary files /dev/null and b/img/6.png differ diff --git a/img/6@2x.png b/img/6@2x.png new file mode 100644 index 0000000..827c789 Binary files /dev/null and b/img/6@2x.png differ diff --git a/img/6@3x.png b/img/6@3x.png new file mode 100644 index 0000000..59b845b Binary files /dev/null and b/img/6@3x.png differ diff --git a/img/7.png b/img/7.png new file mode 100644 index 0000000..6686fa9 Binary files /dev/null and b/img/7.png differ diff --git a/img/7@2x.png b/img/7@2x.png new file mode 100644 index 0000000..7cba9af Binary files /dev/null and b/img/7@2x.png differ diff --git a/img/7@3x.png b/img/7@3x.png new file mode 100644 index 0000000..f944314 Binary files /dev/null and b/img/7@3x.png differ diff --git a/img/8.png b/img/8.png new file mode 100644 index 0000000..3f613e6 Binary files /dev/null and b/img/8.png differ diff --git a/img/81.png b/img/81.png new file mode 100644 index 0000000..4774c2e Binary files /dev/null and b/img/81.png differ diff --git a/img/81@2x.png b/img/81@2x.png new file mode 100644 index 0000000..9634b83 Binary files /dev/null and b/img/81@2x.png differ diff --git a/img/81@3x.png b/img/81@3x.png new file mode 100644 index 0000000..dbd026d Binary files /dev/null and b/img/81@3x.png differ diff --git a/img/8@2x.png b/img/8@2x.png new file mode 100644 index 0000000..c8ae76f Binary files /dev/null and b/img/8@2x.png differ diff --git a/img/8@3x.png b/img/8@3x.png new file mode 100644 index 0000000..5e088f6 Binary files /dev/null and b/img/8@3x.png differ diff --git a/img/9.png b/img/9.png new file mode 100644 index 0000000..c99f212 Binary files /dev/null and b/img/9.png differ diff --git a/img/90.png b/img/90.png new file mode 100644 index 0000000..b7da002 Binary files /dev/null and b/img/90.png differ diff --git a/img/90@2x.png b/img/90@2x.png new file mode 100644 index 0000000..9157d1f Binary files /dev/null and b/img/90@2x.png differ diff --git a/img/90@3x.png b/img/90@3x.png new file mode 100644 index 0000000..e00aa6c Binary files /dev/null and b/img/90@3x.png differ diff --git a/img/99.png b/img/99.png new file mode 100644 index 0000000..55bd2ab Binary files /dev/null and b/img/99.png differ diff --git a/img/99@2x.png b/img/99@2x.png new file mode 100644 index 0000000..0af97a5 Binary files /dev/null and b/img/99@2x.png differ diff --git a/img/99@3x.png b/img/99@3x.png new file mode 100644 index 0000000..f54a6c1 Binary files /dev/null and b/img/99@3x.png differ diff --git a/img/9@2x.png b/img/9@2x.png new file mode 100644 index 0000000..68b8a67 Binary files /dev/null and b/img/9@2x.png differ diff --git a/img/9@3x.png b/img/9@3x.png new file mode 100644 index 0000000..8282c5b Binary files /dev/null and b/img/9@3x.png differ diff --git a/img/X.png b/img/X.png new file mode 100644 index 0000000..0734fe9 Binary files /dev/null and b/img/X.png differ diff --git a/img/X@2x.png b/img/X@2x.png new file mode 100644 index 0000000..1af4106 Binary files /dev/null and b/img/X@2x.png differ diff --git a/img/X@3x.png b/img/X@3x.png new file mode 100644 index 0000000..1c20ece Binary files /dev/null and b/img/X@3x.png differ diff --git a/img/background.png b/img/background.png new file mode 100644 index 0000000..deb5206 Binary files /dev/null and b/img/background.png differ diff --git a/img/background1.png b/img/background1.png new file mode 100644 index 0000000..36b481c Binary files /dev/null and b/img/background1.png differ diff --git a/img/background_bottom.png b/img/background_bottom.png new file mode 100644 index 0000000..48027b6 Binary files /dev/null and b/img/background_bottom.png differ diff --git a/img/chushi.png b/img/chushi.png new file mode 100644 index 0000000..d50f5e7 Binary files /dev/null and b/img/chushi.png differ diff --git a/img/false.png b/img/false.png new file mode 100644 index 0000000..199ac1b Binary files /dev/null and b/img/false.png differ diff --git a/img/false_high.png b/img/false_high.png new file mode 100644 index 0000000..e8d27e3 Binary files /dev/null and b/img/false_high.png differ diff --git a/img/number_ground.png b/img/number_ground.png new file mode 100644 index 0000000..560684d Binary files /dev/null and b/img/number_ground.png differ diff --git a/img/true.png b/img/true.png new file mode 100644 index 0000000..efaa9e0 Binary files /dev/null and b/img/true.png differ diff --git a/img/true_high.png b/img/true_high.png new file mode 100644 index 0000000..ca3e71b Binary files /dev/null and b/img/true_high.png differ diff --git a/img/➗.png b/img/➗.png new file mode 100644 index 0000000..b92cbc9 Binary files /dev/null and b/img/➗.png differ diff --git a/img/➗@2x.png b/img/➗@2x.png new file mode 100644 index 0000000..a5215b7 Binary files /dev/null and b/img/➗@2x.png differ diff --git a/img/➗@3x.png b/img/➗@3x.png new file mode 100644 index 0000000..a7d407d Binary files /dev/null and b/img/➗@3x.png differ diff --git a/img/一致性检查-hover.png b/img/一致性检查-hover.png new file mode 100644 index 0000000..48a9aa8 Binary files /dev/null and b/img/一致性检查-hover.png differ diff --git a/img/一致性检查-hover@2x.png b/img/一致性检查-hover@2x.png new file mode 100644 index 0000000..1eeb9b9 Binary files /dev/null and b/img/一致性检查-hover@2x.png differ diff --git a/img/一致性检查-hover@3x.png b/img/一致性检查-hover@3x.png new file mode 100644 index 0000000..a9d886a Binary files /dev/null and b/img/一致性检查-hover@3x.png differ diff --git a/img/一致性检查.png b/img/一致性检查.png new file mode 100644 index 0000000..e474152 Binary files /dev/null and b/img/一致性检查.png differ diff --git a/img/一致性检查@2x.png b/img/一致性检查@2x.png new file mode 100644 index 0000000..ec74d42 Binary files /dev/null and b/img/一致性检查@2x.png differ diff --git a/img/一致性检查@3x.png b/img/一致性检查@3x.png new file mode 100644 index 0000000..d1bb01f Binary files /dev/null and b/img/一致性检查@3x.png differ diff --git a/img/出题-hover.png b/img/出题-hover.png new file mode 100644 index 0000000..55442c6 Binary files /dev/null and b/img/出题-hover.png differ diff --git a/img/出题-hover@2x.png b/img/出题-hover@2x.png new file mode 100644 index 0000000..fdb0b6d Binary files /dev/null and b/img/出题-hover@2x.png differ diff --git a/img/出题-hover@3x.png b/img/出题-hover@3x.png new file mode 100644 index 0000000..b89ed6c Binary files /dev/null and b/img/出题-hover@3x.png differ diff --git a/img/出题-默认.png b/img/出题-默认.png new file mode 100644 index 0000000..a0eb26a Binary files /dev/null and b/img/出题-默认.png differ diff --git a/img/出题-默认@2x.png b/img/出题-默认@2x.png new file mode 100644 index 0000000..bfb8bf6 Binary files /dev/null and b/img/出题-默认@2x.png differ diff --git a/img/出题-默认@3x.png b/img/出题-默认@3x.png new file mode 100644 index 0000000..ee7f698 Binary files /dev/null and b/img/出题-默认@3x.png differ diff --git a/img/前置背景.png b/img/前置背景.png new file mode 100644 index 0000000..f6a2e3c Binary files /dev/null and b/img/前置背景.png differ diff --git a/img/对-高亮.png b/img/对-高亮.png new file mode 100644 index 0000000..b58f89b Binary files /dev/null and b/img/对-高亮.png differ diff --git a/img/对.png b/img/对.png new file mode 100644 index 0000000..d25e813 Binary files /dev/null and b/img/对.png differ diff --git a/img/底部大背景.png b/img/底部大背景.png new file mode 100644 index 0000000..8849051 Binary files /dev/null and b/img/底部大背景.png differ diff --git a/img/底部大背景@2x.png b/img/底部大背景@2x.png new file mode 100644 index 0000000..4510ed3 Binary files /dev/null and b/img/底部大背景@2x.png differ diff --git a/img/底部大背景@3x.png b/img/底部大背景@3x.png new file mode 100644 index 0000000..bca7d1c Binary files /dev/null and b/img/底部大背景@3x.png differ diff --git a/img/所有答案-hover.png b/img/所有答案-hover.png new file mode 100644 index 0000000..44bc237 Binary files /dev/null and b/img/所有答案-hover.png differ diff --git a/img/所有答案-hover@2x.png b/img/所有答案-hover@2x.png new file mode 100644 index 0000000..87c9422 Binary files /dev/null and b/img/所有答案-hover@2x.png differ diff --git a/img/所有答案-hover@3x.png b/img/所有答案-hover@3x.png new file mode 100644 index 0000000..453a170 Binary files /dev/null and b/img/所有答案-hover@3x.png differ diff --git a/img/所有答案.png b/img/所有答案.png new file mode 100644 index 0000000..c224789 Binary files /dev/null and b/img/所有答案.png differ diff --git a/img/所有答案@2x.png b/img/所有答案@2x.png new file mode 100644 index 0000000..e534a46 Binary files /dev/null and b/img/所有答案@2x.png differ diff --git a/img/所有答案@3x.png b/img/所有答案@3x.png new file mode 100644 index 0000000..8c7536e Binary files /dev/null and b/img/所有答案@3x.png differ diff --git a/img/换牌-hover.png b/img/换牌-hover.png new file mode 100644 index 0000000..20e2344 Binary files /dev/null and b/img/换牌-hover.png differ diff --git a/img/换牌-hover@2x.png b/img/换牌-hover@2x.png new file mode 100644 index 0000000..608aa9b Binary files /dev/null and b/img/换牌-hover@2x.png differ diff --git a/img/换牌-hover@3x.png b/img/换牌-hover@3x.png new file mode 100644 index 0000000..a7a0704 Binary files /dev/null and b/img/换牌-hover@3x.png differ diff --git a/img/换牌-默认.png b/img/换牌-默认.png new file mode 100644 index 0000000..14e8a4b Binary files /dev/null and b/img/换牌-默认.png differ diff --git a/img/换牌-默认@2x.png b/img/换牌-默认@2x.png new file mode 100644 index 0000000..96cb966 Binary files /dev/null and b/img/换牌-默认@2x.png differ diff --git a/img/换牌-默认@3x.png b/img/换牌-默认@3x.png new file mode 100644 index 0000000..f9da6db Binary files /dev/null and b/img/换牌-默认@3x.png differ diff --git a/img/改变节点运算-hover.png b/img/改变节点运算-hover.png new file mode 100644 index 0000000..8aea79c Binary files /dev/null and b/img/改变节点运算-hover.png differ diff --git a/img/改变节点运算-hover@2x.png b/img/改变节点运算-hover@2x.png new file mode 100644 index 0000000..329948a Binary files /dev/null and b/img/改变节点运算-hover@2x.png differ diff --git a/img/改变节点运算-hover@3x.png b/img/改变节点运算-hover@3x.png new file mode 100644 index 0000000..d19f5e9 Binary files /dev/null and b/img/改变节点运算-hover@3x.png differ diff --git a/img/改变节点运算.png b/img/改变节点运算.png new file mode 100644 index 0000000..5c738be Binary files /dev/null and b/img/改变节点运算.png differ diff --git a/img/改变节点运算@2x.png b/img/改变节点运算@2x.png new file mode 100644 index 0000000..545c783 Binary files /dev/null and b/img/改变节点运算@2x.png differ diff --git a/img/改变节点运算@3x.png b/img/改变节点运算@3x.png new file mode 100644 index 0000000..7f6bdb7 Binary files /dev/null and b/img/改变节点运算@3x.png differ diff --git a/img/改变运算输入-hover.png b/img/改变运算输入-hover.png new file mode 100644 index 0000000..fe927c8 Binary files /dev/null and b/img/改变运算输入-hover.png differ diff --git a/img/改变运算输入-hover@2x.png b/img/改变运算输入-hover@2x.png new file mode 100644 index 0000000..1a0cf7b Binary files /dev/null and b/img/改变运算输入-hover@2x.png differ diff --git a/img/改变运算输入-hover@3x.png b/img/改变运算输入-hover@3x.png new file mode 100644 index 0000000..1d7d072 Binary files /dev/null and b/img/改变运算输入-hover@3x.png differ diff --git a/img/改变运算输入.png b/img/改变运算输入.png new file mode 100644 index 0000000..2fdf97a Binary files /dev/null and b/img/改变运算输入.png differ diff --git a/img/改变运算输入@2x.png b/img/改变运算输入@2x.png new file mode 100644 index 0000000..87d819b Binary files /dev/null and b/img/改变运算输入@2x.png differ diff --git a/img/改变运算输入@3x.png b/img/改变运算输入@3x.png new file mode 100644 index 0000000..395cc75 Binary files /dev/null and b/img/改变运算输入@3x.png differ diff --git a/img/数值节点交换-hover.png b/img/数值节点交换-hover.png new file mode 100644 index 0000000..ae1995d Binary files /dev/null and b/img/数值节点交换-hover.png differ diff --git a/img/数值节点交换-hover@2x.png b/img/数值节点交换-hover@2x.png new file mode 100644 index 0000000..3a949dd Binary files /dev/null and b/img/数值节点交换-hover@2x.png differ diff --git a/img/数值节点交换-hover@3x.png b/img/数值节点交换-hover@3x.png new file mode 100644 index 0000000..ace8feb Binary files /dev/null and b/img/数值节点交换-hover@3x.png differ diff --git a/img/数值节点交换.png b/img/数值节点交换.png new file mode 100644 index 0000000..081f12a Binary files /dev/null and b/img/数值节点交换.png differ diff --git a/img/数值节点交换@2x.png b/img/数值节点交换@2x.png new file mode 100644 index 0000000..26d5632 Binary files /dev/null and b/img/数值节点交换@2x.png differ diff --git a/img/数值节点交换@3x.png b/img/数值节点交换@3x.png new file mode 100644 index 0000000..552d274 Binary files /dev/null and b/img/数值节点交换@3x.png differ diff --git a/img/数字背景.png b/img/数字背景.png new file mode 100644 index 0000000..896a141 Binary files /dev/null and b/img/数字背景.png differ diff --git a/img/数字背景@2x.png b/img/数字背景@2x.png new file mode 100644 index 0000000..9612329 Binary files /dev/null and b/img/数字背景@2x.png differ diff --git a/img/数字背景@3x.png b/img/数字背景@3x.png new file mode 100644 index 0000000..ae6e0bf Binary files /dev/null and b/img/数字背景@3x.png differ diff --git a/img/添加数值节点-hover.png b/img/添加数值节点-hover.png new file mode 100644 index 0000000..4d7c468 Binary files /dev/null and b/img/添加数值节点-hover.png differ diff --git a/img/添加数值节点-hover@2x.png b/img/添加数值节点-hover@2x.png new file mode 100644 index 0000000..e4e7241 Binary files /dev/null and b/img/添加数值节点-hover@2x.png differ diff --git a/img/添加数值节点-hover@3x.png b/img/添加数值节点-hover@3x.png new file mode 100644 index 0000000..17bd5d2 Binary files /dev/null and b/img/添加数值节点-hover@3x.png differ diff --git a/img/添加数值节点.png b/img/添加数值节点.png new file mode 100644 index 0000000..5ac2a7b Binary files /dev/null and b/img/添加数值节点.png differ diff --git a/img/添加数值节点@2x.png b/img/添加数值节点@2x.png new file mode 100644 index 0000000..8aa6106 Binary files /dev/null and b/img/添加数值节点@2x.png differ diff --git a/img/添加数值节点@3x.png b/img/添加数值节点@3x.png new file mode 100644 index 0000000..1aa9e18 Binary files /dev/null and b/img/添加数值节点@3x.png differ diff --git a/img/添加运算节点-hover.png b/img/添加运算节点-hover.png new file mode 100644 index 0000000..4bfc4d4 Binary files /dev/null and b/img/添加运算节点-hover.png differ diff --git a/img/添加运算节点-hover@2x.png b/img/添加运算节点-hover@2x.png new file mode 100644 index 0000000..45c9f1c Binary files /dev/null and b/img/添加运算节点-hover@2x.png differ diff --git a/img/添加运算节点-hover@3x.png b/img/添加运算节点-hover@3x.png new file mode 100644 index 0000000..c091922 Binary files /dev/null and b/img/添加运算节点-hover@3x.png differ diff --git a/img/添加运算节点.png b/img/添加运算节点.png new file mode 100644 index 0000000..a5bc508 Binary files /dev/null and b/img/添加运算节点.png differ diff --git a/img/添加运算节点@2x.png b/img/添加运算节点@2x.png new file mode 100644 index 0000000..079e869 Binary files /dev/null and b/img/添加运算节点@2x.png differ diff --git a/img/添加运算节点@3x.png b/img/添加运算节点@3x.png new file mode 100644 index 0000000..8acadf7 Binary files /dev/null and b/img/添加运算节点@3x.png differ diff --git a/img/清空画布-hover.png b/img/清空画布-hover.png new file mode 100644 index 0000000..48f3eaf Binary files /dev/null and b/img/清空画布-hover.png differ diff --git a/img/清空画布-hover@2x.png b/img/清空画布-hover@2x.png new file mode 100644 index 0000000..755d7e6 Binary files /dev/null and b/img/清空画布-hover@2x.png differ diff --git a/img/清空画布-hover@3x.png b/img/清空画布-hover@3x.png new file mode 100644 index 0000000..bdbbbd8 Binary files /dev/null and b/img/清空画布-hover@3x.png differ diff --git a/img/清空画布.png b/img/清空画布.png new file mode 100644 index 0000000..fa95057 Binary files /dev/null and b/img/清空画布.png differ diff --git a/img/清空画布@2x.png b/img/清空画布@2x.png new file mode 100644 index 0000000..937f3d1 Binary files /dev/null and b/img/清空画布@2x.png differ diff --git a/img/清空画布@3x.png b/img/清空画布@3x.png new file mode 100644 index 0000000..0ac461a Binary files /dev/null and b/img/清空画布@3x.png differ diff --git a/img/生成表达式-hover.png b/img/生成表达式-hover.png new file mode 100644 index 0000000..f2e669b Binary files /dev/null and b/img/生成表达式-hover.png differ diff --git a/img/生成表达式-hover@2x.png b/img/生成表达式-hover@2x.png new file mode 100644 index 0000000..6da087f Binary files /dev/null and b/img/生成表达式-hover@2x.png differ diff --git a/img/生成表达式-hover@3x.png b/img/生成表达式-hover@3x.png new file mode 100644 index 0000000..a204a75 Binary files /dev/null and b/img/生成表达式-hover@3x.png differ diff --git a/img/生成表达式.png b/img/生成表达式.png new file mode 100644 index 0000000..d6e437a Binary files /dev/null and b/img/生成表达式.png differ diff --git a/img/生成表达式@2x.png b/img/生成表达式@2x.png new file mode 100644 index 0000000..ab4a707 Binary files /dev/null and b/img/生成表达式@2x.png differ diff --git a/img/生成表达式@3x.png b/img/生成表达式@3x.png new file mode 100644 index 0000000..75ff589 Binary files /dev/null and b/img/生成表达式@3x.png differ diff --git a/img/生成语法树.png b/img/生成语法树.png new file mode 100644 index 0000000..e1b5f95 Binary files /dev/null and b/img/生成语法树.png differ diff --git a/img/生成语法树@2x.png b/img/生成语法树@2x.png new file mode 100644 index 0000000..b1ac25c Binary files /dev/null and b/img/生成语法树@2x.png differ diff --git a/img/生成语法树@3x.png b/img/生成语法树@3x.png new file mode 100644 index 0000000..53c5813 Binary files /dev/null and b/img/生成语法树@3x.png differ diff --git a/img/画树-hover.png b/img/画树-hover.png new file mode 100644 index 0000000..4f041ca Binary files /dev/null and b/img/画树-hover.png differ diff --git a/img/画树-hover@2x.png b/img/画树-hover@2x.png new file mode 100644 index 0000000..d83968f Binary files /dev/null and b/img/画树-hover@2x.png differ diff --git a/img/画树-hover@3x.png b/img/画树-hover@3x.png new file mode 100644 index 0000000..36c209f Binary files /dev/null and b/img/画树-hover@3x.png differ diff --git a/img/画树.png b/img/画树.png new file mode 100644 index 0000000..ffaa267 Binary files /dev/null and b/img/画树.png differ diff --git a/img/画树@2x.png b/img/画树@2x.png new file mode 100644 index 0000000..668a4b2 Binary files /dev/null and b/img/画树@2x.png differ diff --git a/img/画树@3x.png b/img/画树@3x.png new file mode 100644 index 0000000..d50a1e6 Binary files /dev/null and b/img/画树@3x.png differ diff --git a/img/自动求解-hover.png b/img/自动求解-hover.png new file mode 100644 index 0000000..1764378 Binary files /dev/null and b/img/自动求解-hover.png differ diff --git a/img/自动求解-hover@2x.png b/img/自动求解-hover@2x.png new file mode 100644 index 0000000..5c62314 Binary files /dev/null and b/img/自动求解-hover@2x.png differ diff --git a/img/自动求解-hover@3x.png b/img/自动求解-hover@3x.png new file mode 100644 index 0000000..4075f9f Binary files /dev/null and b/img/自动求解-hover@3x.png differ diff --git a/img/自动求解.png b/img/自动求解.png new file mode 100644 index 0000000..4437366 Binary files /dev/null and b/img/自动求解.png differ diff --git a/img/自动求解@2x.png b/img/自动求解@2x.png new file mode 100644 index 0000000..523f898 Binary files /dev/null and b/img/自动求解@2x.png differ diff --git a/img/自动求解@3x.png b/img/自动求解@3x.png new file mode 100644 index 0000000..479f59b Binary files /dev/null and b/img/自动求解@3x.png differ diff --git a/img/计算-hover.png b/img/计算-hover.png new file mode 100644 index 0000000..b33de90 Binary files /dev/null and b/img/计算-hover.png differ diff --git a/img/计算-hover@2x.png b/img/计算-hover@2x.png new file mode 100644 index 0000000..6445033 Binary files /dev/null and b/img/计算-hover@2x.png differ diff --git a/img/计算-hover@3x.png b/img/计算-hover@3x.png new file mode 100644 index 0000000..ccd807e Binary files /dev/null and b/img/计算-hover@3x.png differ diff --git a/img/计算.png b/img/计算.png new file mode 100644 index 0000000..8700e8c Binary files /dev/null and b/img/计算.png differ diff --git a/img/计算@2x.png b/img/计算@2x.png new file mode 100644 index 0000000..38964d5 Binary files /dev/null and b/img/计算@2x.png differ diff --git a/img/计算@3x.png b/img/计算@3x.png new file mode 100644 index 0000000..3028d75 Binary files /dev/null and b/img/计算@3x.png differ diff --git a/img/错-高亮.png b/img/错-高亮.png new file mode 100644 index 0000000..0e5c0da Binary files /dev/null and b/img/错-高亮.png differ diff --git a/img/错.png b/img/错.png new file mode 100644 index 0000000..80b159f Binary files /dev/null and b/img/错.png differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..ee5435c --- /dev/null +++ b/main.py @@ -0,0 +1,917 @@ +# -*- encoding: utf-8 -*- +""" + @Author: packy945 + @FileName: main.py + @DateTime: 2023/5/11 11:34 + @SoftWare: PyCharm +""" +from tkinter import simpledialog + +from data import * +import tkinter as tk +import tkinter.messagebox +from collections import Counter +import random +from itertools import permutations +from TreeNode import * +from setting import * +from tkinter import * +from PIL import ImageTk +from PIL import Image as imim +import sys + + +sz = [] +A = Aexp([0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]) +img_open = [] +img_png = [] + + +def set_canvas_button(button_pot: list, button_photo: ImageTk.PhotoImage, command, tags=None, bg="#3E97C1"): + button = C.create_image(button_pot[0], button_pot[1], anchor=tk.NW, image=button_photo) + C.tag_bind(button, "", command) + + +def to_image(path, resize=None) -> ImageTk.PhotoImage: + if resize: + return ImageTk.PhotoImage(imim.open(path).resize(resize)) + return ImageTk.PhotoImage(imim.open(path)) + + +def change_card(): + card = [] + for n in tree.Node: + if n[1] == 'Value': + if n[5] == 1: + card.append([n[6], 'A']) + else: + card.append([n[6], str(n[5])]) + # print(card) + if len(card) == 4: + show(card) + else: + tk.messagebox.showinfo('', '无法显示卡牌') + + +def TorF(flag): + ''' + 显示答案是否正确 + :param flag: 答案是否正确 + :return: + ''' + if flag == 1: + clo1 = to_image(sys.path[0] + "/./img/对.png", (30, 30)) + clo2 = to_image(sys.path[0] + "/./img/错.png", (30, 30)) + clo3 = to_image(sys.path[0] + '/./img/chushi.png', (30, 30)) + elif flag == 0: + clo1 = to_image(sys.path[0] + "/./img/对.png", (30, 30)) + clo2 = to_image(sys.path[0] + "/./img/错.png", (30, 30)) + clo3 = to_image(sys.path[0] + '/./img/chushi.png', (30, 30)) + else: + clo1 = to_image(sys.path[0] + "/./img/对.png", (30, 30)) + clo2 = to_image(sys.path[0] + "/./img/错-高亮.png", (30, 30)) + clo3 = to_image(sys.path[0] + '/./img/chushi.png', (30, 30)) + + label3 = tk.Label(window, image=clo1, relief="sunken", borderwidth=0) + label4 = tk.Label(window, image=clo2, relief="sunken", borderwidth=0) + label5 = tk.Label(window, image=clo3, relief="sunken", borderwidth=0) + label3.image = clo1 + label4.image = clo2 + label5.image = clo3 + + if flag == 1: + label3.place(x=ENTRY_WIDTH + 200, y=CARD_CANVAS_HEIGHT + 18, width=30, height=30) + elif flag == 0: + label5.place(x=ENTRY_WIDTH + 200, y=CARD_CANVAS_HEIGHT + 18, width=30, height=30) + else: + label4.place(x=ENTRY_WIDTH + 200, y=CARD_CANVAS_HEIGHT + 18, width=30, height=30) + # label3.place(x=ENTRY_WIDTH + 200, y=CARD_CANVAS_HEIGHT + 18, width=30, height=15) + # label4.place(x=ENTRY_WIDTH + 200, y=CARD_CANVAS_HEIGHT + 8 + 30, width=30, height=15) + + +def ans_cal(ans=None): + """ + 绘制结果框 + :param ans: + :return: + """ + if not ans: + label2 = tk.Label(window, text='= ?', font=('楷体', 18, 'bold'), width=30, height=10, background="#4acb69", + # 设置填充区距离、边框宽度和其样式(凹陷式) + borderwidth=0, relief="raised") + else: + label2 = tk.Label(window, text=f'={ans}', font=('楷体', 18, 'bold'), width=30, height=10, background="#4acb69", + # 设置填充区距离、边框宽度和其样式(凹陷式) + borderwidth=0, relief="raised") + label2.place(x=ENTRY_WIDTH + LEFT_PADDING + 25, y=CARD_CANVAS_HEIGHT + 15, width=100, height=ENTRY_HEIGHT) + + +def init(): + ans_cal() + all_ans["state"] = 'disable' + entry.delete(0, "end") + F.clear() + TorF(0) + + +# 展示卡牌 +def show_card(): + ''' + 随机展示四张卡片 + :return: + ''' + global sz # 全局变量存放点数 + sz = [] + # 清空卡牌列表 + init() + # 清空中间的表达式输入串Aexp, 同时清空中间的表达式输入框、结果显示框和结果正确与错误标志 + kp_list = [] + size_list = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] + col_list = ["Club", "Diamond", "Spade", "Heart"] + sz_list = ['a', 'j', 'q', 'k'] + + for i in range(4): + kp_list.append([random.choice(col_list), random.choice(size_list)]) # 随机生成花色以及点数 + sz.append([kp_list[i][0], kp_list[i][1], kp_list[i][1]]) + if kp_list[i][-1] == '1': + kp_list[i][-1] = random.choice(sz_list) + sz[i][2] = kp_list[i][-1] + + show(kp_list) + global A + A.refresh(sz[0], sz[1], sz[2], sz[3]) + C.update() + + +def show(kp_list): + # 根据花色以及点数显示卡牌 + global img_open, img_png + img_open = [] + img_png = [] + C.delete('card') + i = 150 # 卡牌位置偏移量 + for k in range(4): + img_open.append( + imim.open(sys.path[0] + "/./card/" + kp_list[k][0] + "/" + kp_list[k][0] + kp_list[k][1] + '.png').resize( + (int((CARD_CANVAS_HEIGHT - 10) * 0.6) + 10, CARD_CANVAS_HEIGHT - 10))) + img_png.append(ImageTk.PhotoImage(img_open[k])) + C.create_image(50 + i, 100, image=img_png[k], tags="card") + i += int((CARD_CANVAS_HEIGHT - 10) * 0.6) + 80 + C.update() + + +# 展示结果 +def show_result(ss, sz): + ''' + 展示计算结果 + :param ss: 输入框中的表达式 + :param sz: 题中给的卡牌数字 + :return: + ''' + numbers = [int(number) for number in re.findall(r'\d+', ss)] + a = Counter(numbers) + # char_list = [] # 用于存放算式中的数字 + # for i in range(len(ss)): + # if '0' < ss[i] <= '9': + # char_list.append(ss[i]) + # a = Counter(char_list) # 计数函数Counter + if sz: + b = Counter([sz[0][1], sz[1][1], sz[2][1], sz[3][1]]) + try: + ans = eval(ss) + except: + tk.messagebox.showinfo('', '表达式不可运算') + else: + ans_cal(int(ans)) + # 设置颜色 + if ans == 24: + TorF(1) + else: + TorF(-1) + + +# 展示一个可行算式 +def show_answer(): + # 自动求解 + if len(sz) != 4: + tk.messagebox.showinfo('', '未出题') + return + + answer = (A.answer[0], A.Color[0]) + # print() + # print(answer) + if A.num == 0: + entry.delete(0, "end") + tk.messagebox.showinfo('', '无法得出24点') + else: + entry.delete(0, "end") + entry.insert("end", answer[0]) + F.show_tree(answer) + if A.num > 1: + all_ans["state"] = 'normal' + else: + all_ans["state"] = 'disable' + + +def show_next(): + global A + A.Aexp_cur += 1 + answer = (A.answer[A.Aexp_cur], A.Color[A.Aexp_cur]) + entry.delete(0, "end") + entry.insert("end", answer[0]) + F.show_tree(answer) + + if A.Aexp_cur == A.num - 1: + all_ans["state"] = 'disable' + tk.messagebox.showinfo('', '已显示所有答案') + + +# 显示所有答案,通过一个新窗口 +def show_all(): + global Aexp_cur + + answer = Aexp(int(sz[0][1]), int(sz[1][1]), int(sz[2][1]), int(sz[3][1])) + # Tree_all = [] + # for item in answer: + # Tree_all.append(Decomposition(item)) + root = tk.Tk() + # root.geometry('500x300') + width = 500 + height = 300 + screen_width = window.winfo_screenwidth() # winfo方法来获取当前电脑屏幕大小 + screen_height = window.winfo_screenheight() + x = int((screen_width - width) / 2) + y = int((screen_height - height) / 2) - 40 + size = '{}x{}+{}+{}'.format(width, height, x, y) + root.geometry(size) + b1 = tk.Scrollbar(root, width=40) + # b1.place(x=410,y=200) + b1.pack(side=tk.RIGHT, fill=tk.Y) + b2 = tk.Listbox(root, yscrollcommand=b1.set, width=100) + for i in range(len(answer)): + b2.insert(tk.END, answer[i]) + b2.pack(side=tk.LEFT, fill=tk.BOTH) + # b2.place(x=520,y=100) + b1.config(command=b2.yview) + root.mainloop() + + +def Buts(): + global all_ans + global but5 + but_image = to_image(sys.path[0] + "/./img/出题-默认@3x.png", (TOP_BUTTON_WIDTH, TOP_BUTTON_HEIGHT)) + but = Button(window, image=but_image, command=show_card, bd=0, relief="solid", bg="#141414", highlightthickness=0) + but.image = but_image + but.place(x=CARD_CANVAS_WIDTH + TOP_BUTTON_WIDTH + 50, y=40, width=TOP_BUTTON_WIDTH, height=TOP_BUTTON_HEIGHT) + + but2_image = to_image(sys.path[0] + "/./img/换牌-默认@3x.png", (TOP_BUTTON_WIDTH, TOP_BUTTON_HEIGHT)) + but2 = tk.Button(window, image=but2_image, command=show_card, bd=0, relief="solid", bg="#141414", + highlightthickness=0) + but2.image = but2_image + but2.place(x=CARD_CANVAS_WIDTH + TOP_BUTTON_WIDTH + 50, y=70 + TOP_BUTTON_HEIGHT, width=TOP_BUTTON_WIDTH, + height=TOP_BUTTON_HEIGHT, ) + + but4_image = to_image(sys.path[0] + "/./img/计算@3x.png", (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + but4 = tk.Button(window, image=but4_image, command=lambda: show_result(entry.get(), sz), bd=0, relief="solid", + bg="#141414", highlightthickness=0) + but4.place(x=ENTRY_WIDTH + 245, y=CARD_CANVAS_HEIGHT + 15, width=MIDDLE_BUTTON_WIDTH, height=MIDDLE_BUTTON_HEIGHT, ) + but4.image = but4_image + + ##报错 + but3_image = to_image(sys.path[0] + "/./img/自动求解@3x.png", (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + but3 = tk.Button(window, image=but3_image, command=lambda: show_answer(), bd=0, relief="solid", bg="#141414", + highlightthickness=0) + but3.place(x=60, y=CARD_CANVAS_HEIGHT + 65, width=MIDDLE_BUTTON_WIDTH, + height=MIDDLE_BUTTON_HEIGHT, ) + but3.image = but3_image + + all_ans_image = to_image(sys.path[0] + "/./img/所有答案@3x.png", (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + all_ans = tk.Button(window, image=all_ans_image, command=lambda: show_next(), bd=0, relief="solid", bg="#141414", + highlightthickness=0, state='disable') + all_ans.place(x=60 + MIDDLE_BUTTON_WIDTH * 2 + 50 * 2, y=CARD_CANVAS_HEIGHT + 65, width=MIDDLE_BUTTON_WIDTH, + height=MIDDLE_BUTTON_HEIGHT, ) + all_ans.image = all_ans_image + + ##报错 + but5_image = to_image(sys.path[0] + "/./img/画树@3x.png", (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + but5 = tk.Button(window, image=but5_image, command=lambda: F.show_tree(entry.get()), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + + but5.place(x=60 + MIDDLE_BUTTON_WIDTH + 50, y=CARD_CANVAS_HEIGHT + 65, width=MIDDLE_BUTTON_WIDTH, + height=MIDDLE_BUTTON_HEIGHT, ) + but5.image = but5_image + + but6_image = to_image(sys.path[0] + '/./img/生成表达式@3x.png', (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + but6 = tk.Button(window, image=but6_image, command=lambda: expressions(), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + but6.place(x=60 + MIDDLE_BUTTON_WIDTH * 3 + 50 * 3, y=CARD_CANVAS_HEIGHT + 65, width=MIDDLE_BUTTON_WIDTH, + height=MIDDLE_BUTTON_HEIGHT, ) + but6.image = but6_image + + ##报错 + but7_image = to_image(sys.path[0] + '/./img/生成语法树@3x.png', (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + but7 = tk.Button(window, image=but7_image, command=lambda: F.show_tree(expression_tree()), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + but7.place(x=60 + MIDDLE_BUTTON_WIDTH * 4 + 50 * 4, y=CARD_CANVAS_HEIGHT + 65, width=MIDDLE_BUTTON_WIDTH, + height=MIDDLE_BUTTON_HEIGHT, ) + but7.image = but7_image + + but8_image = to_image(sys.path[0] + '/./img/一致性检查@3x.png', (MIDDLE_BUTTON_WIDTH, MIDDLE_BUTTON_HEIGHT)) + but8 = tk.Button(window, image=but8_image, command=lambda: examine(), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + but8.place(x=60 + MIDDLE_BUTTON_WIDTH * 5 + 50 * 5, y=CARD_CANVAS_HEIGHT + 65, width=MIDDLE_BUTTON_WIDTH, + height=MIDDLE_BUTTON_HEIGHT, ) + but8.image = but8_image + + +def left2(event): + # 查找鼠标左键按下时位置是否在某个牌上 + # print(event.x, event.y) + # if not A.card + left = [] + right = [] + i = 150 + for j in range(4): + left.append(i) + right.append(i + (CARD_CANVAS_HEIGHT - 10) * 0.6) + i += int((CARD_CANVAS_HEIGHT - 10) * 0.6) + 80 + up = 5 + down = CARD_CANVAS_HEIGHT - 10 + # 添加数值节点 + if F.mode == 2: + for cur in range(4): + if up <= event.y <= down and right[cur] >= event.x >= left[cur]: + # 检查数值节点是否已存在 + a = [] + b = [] + for card in A.card: + a.append([card[0], int(card[1])]) + for node in tree.Node: + if node[1] == 'Value': + b.append([node[6], node[5]]) + c = a.copy() + for x in b: + for i in range(len(c)): + try: + c[i] + except: + break + + if x[0] == c[i][0] and x[1] == c[i][1]: + del c[i] + flag = 0 + for l in c: + # 若所选card还没有对应的节点,则新建一个数值节点 + if not flag and l[0] == A.card[cur][0] and l[1] == int(A.card[cur][1]): + tree.Node.append( + [len(tree.Node), 'Value', None, None, None, int(A.card[cur][1]), A.card[cur][0]]) + print(tree.Node) + flag = 1 + + if not flag: + # 若所选card已经存在,则进行警告 + tk.messagebox.showinfo('', '所选card已存在') + # 操作完成,进行复位 + F.mode = 0 + F.tips = '' + tree.remark() + F.draw() + # 改变运算输入的第二步 + elif F.mode == 6: + for cur in range(4): + # 若单击了一张card + if up <= event.y <= down and right[cur] >= event.x >= left[cur]: + + # 标记的节点序号 + mark = -1 + for i in range(len(tree.mark)): + if tree.mark[i] == 1: + mark = i + + flag = 0 + + for now in range(len(tree.Node)): + # 若单击的card已经存在一个数值节点 + if tree.Node[now][6] == A.card[cur][0] and tree.Node[now][5] == int(A.card[cur][1]): + # 则将这两个数值节点进行交换 + tree.Node[now][5] = tree.Node[mark][5] + tree.Node[now][6] = tree.Node[mark][6] + + tree.Node[mark][5] = int(A.card[cur][1]) + tree.Node[mark][6] = A.card[cur][0] + flag = 1 + + if not flag: + # 若单击的card没有存在数值节点,则将该节点改为这张card + tree.Node[mark][5] = int(A.card[cur][1]) + tree.Node[mark][6] = A.card[cur][0] + # 操作完毕,进行复位 + F.mode = 0 + F.tips = '' + tree.remark() + F.draw() + + +class Frame_Tree: + def __init__(self, window): + self.opt = '+' + self.mode = 0 + + ''' + 当前操作: + 0 无 + 1 添加运算节点 + 2 添加数值节点 + 3 改变运算输入 + 4 改变节点运算 + 5 数值节点交换 + ''' + self.tips = '' + self.Tree_cv = C + add_image = to_image(sys.path[0] + "/./img/+@2x.png", (40, 40)) + self.opt1 = tk.Button(window, image=add_image, command=lambda: self.set_opt(1), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + self.opt1.image = add_image + self.opt1.place(x=TREE_CANVAS_WIDTH - 40, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 200, width=40, height=40) + + jian_image = to_image(sys.path[0] + "/./img/-@2x.png", (40, 40)) + self.opt2 = tk.Button(window, image=jian_image, command=lambda: self.set_opt(2), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + self.opt2.place(x=TREE_CANVAS_WIDTH, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 200, width=40, height=40) + self.opt2.image = jian_image + + chen_image = to_image(sys.path[0] + "/./img/X@2x.png", (40, 40)) + self.opt3 = tk.Button(window, image=chen_image, command=lambda: self.set_opt(3), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + self.opt3.place(x=TREE_CANVAS_WIDTH - 40, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 250, width=40, height=40) + self.opt3.image = chen_image + + chu_image = to_image(sys.path[0] + "/./img/➗@2x.png", (40, 40)) + self.opt4 = tk.Button(window, image=chu_image, command=lambda: self.set_opt(4), bd=0, relief="solid", + bg="#141414", + highlightthickness=0) + self.opt4.place(x=TREE_CANVAS_WIDTH , y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 250, width=40, height=40) + self.opt4.image = chu_image + + self.set_opt(1) + + dy = 150 + + bot_image = to_image(sys.path[0] + "/./img/添加运算节点@3x.png", (100, 50)) + bot1 = tk.Button(window, image=bot_image, bd=0, relief="solid", bg="#141414", + highlightthickness=0, command=lambda: self.add_opt()) + bot1.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 150 + dy, width=100, height=50) + bot1.image = bot_image + + bot2_image = to_image(sys.path[0] + "/./img/添加数值节点@3x.png", (100, 50)) + bot2 = tk.Button(window, image=bot2_image, bd=0, relief="solid", bg="#141414", + highlightthickness=0, command=lambda: self.add_number()) + bot2.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 200 + dy, width=100, height=50) + bot2.image = bot2_image + + bot3_image = to_image(sys.path[0] + "/./img/改变运算输入@3x.png", (100, 50)) + bot3 = tk.Button(window, image=bot3_image, bd=0, relief="solid", bg="#141414", + highlightthickness=0, command=lambda: self.change_num()) + bot3.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 250 + dy, width=100, height=50) + bot3.image = bot3_image + + bot4_image = to_image(sys.path[0] + "/./img/改变节点运算@3x.png", (100, 50)) + bot4 = tk.Button(window, image=bot4_image, bd=0, relief="solid", bg="#141414", + highlightthickness=0, command=lambda: self.change_opt()) + bot4.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 300 + dy, width=100, height=50) + bot4.image = bot4_image + + bot5_image = to_image(sys.path[0] + "/./img/数值节点交换@3x.png", (100, 50)) + bot5 = tk.Button(window, image=bot5_image, bd=0, relief="solid", bg="#141414", + highlightthickness=0, command=lambda: self.change_node()) + bot5.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 350 + dy, width=100, height=50) + bot5.image = bot5_image + + #bot6_image = to_image(sys.path[0] + "/./images/产生表达式.png", (80, 30)) + #bot6 = tk.Button(window, image=bot6_image, bd=0, relief="solid", bg="#141414", + # highlightthickness=0, command=lambda: self.Aexp()) + #bot6.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 400 + dy, width=80, height=30) + #bot6.image = bot6_image + + bot7_image = to_image(sys.path[0] + "/./img/清空画布@3x.png", (100, 50)) + bot7 = tk.Button(window, image=bot7_image, bd=0, relief="solid", bg="#141414", + highlightthickness=0, command=lambda: self.clear()) + bot7.place(x=TREE_CANVAS_WIDTH - 50, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 400 + dy, width=100, height=50) + bot7.image = bot7_image + + self.draw() + + def set_opt(self, x): + opt = ['+', '-', '*', '/'] + self.opt = opt[x - 1] + for i in range(4): + exec('self.opt' + str(i + 1) + '["state"] = "normal"') + exec('self.opt' + str(i + 1) + "['bg']='#131415'") + exec('self.opt' + str(i + 1) + "['fg']='black'") + + exec('self.opt' + str(x) + "['state']='disable'") + exec('self.opt' + str(x) + "['bg']='#8f735c'") + exec('self.opt' + str(x) + "['fg']='white'") + self.draw() + + def add_opt(self): + tree.remark() + self.tips = '请选择两个节点' + self.mode = 1 + self.draw() + + def change_node(self): + tree.remark() + self.tips = '请选择两个数值节点' + self.mode = 5 + self.draw() + + def change_opt(self): + tree.remark() + self.tips = '请选择一个运算节点' + self.mode = 4 + self.draw() + + def add_num(self): + tree.remark() + self.tips = '请选择一张card' + self.mode = 2 + self.draw() + + def add_number(self): + root = Tk() + root.withdraw() + number = simpledialog.askfloat("输入框", "请输入数字:") + if number is not None: + tree.remark() + self.mode = 2 + tree.Node.append( + [len(tree.Node), 'Value', None, None, None, int(number), 'Spade']) + self.draw() + + def change_num(self): + tree.remark() + self.tips = '请选择一个数值节点' + self.mode = 3 + self.draw() + + def left1(self, event): + # 无操作 + if self.mode == 0: + return + # 添加运算节点 + elif self.mode == 1: + i = 0 + for T in tree.place: + if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2: + # 标记点击的节点 + tree.mark[i] = not tree.mark[i] + i += 1 + + nodes = [] + for i in range(len(tree.Node)): + if tree.mark[i] == 1: + nodes.append(i) + + if len(nodes) == 2: + # 若已经选择两个节点 + tree.check() + # 检查节点是否合法 + if tree.ck[nodes[0]] == 1 and tree.ck[nodes[1]] == 1: + # 若节点合法,则添加新运算节点并将其设置为根节点 + ID = len(tree.Node) + tree.Node.append([ID, 'Operator', self.opt, nodes[0], nodes[1], None, None]) + tree.rootID = ID + else: + # 若节点不合法则显示警告 + tk.messagebox.showinfo('', '所选节点不合法') + # 添加运算节点操作结束 + self.mode = 0 + self.tips = '' + tree.remark() + # 添加数值节点 + elif self.mode == 2: + # 添加数值节点无需点击节点 + pass + # 改变运算输入 + elif self.mode == 3: + i = 0 + flag = 0 + for T in tree.place: + if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2: + # 若点击节点为数值节点,则标记 + if tree.Node[i][1] == 'Value': + tree.mark[i] = 1 + flag = 1 + # 若点击节点为运算节点,则弹窗警告 + else: + tk.messagebox.showinfo('', '所选节点不合法') + flag = 1 + i += 1 + + if flag: + # 选择节点完成过后,还需选择card + self.mode = 6 + self.tips = '请选择一张card' + self.draw() + # 改变节点运算 + elif self.mode == 4: + i = 0 + flag = 0 + for T in tree.place: + if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2: + # 检查节点是否合法,若选择的是运算节点,则进行运算符的改变 + if tree.Node[i][1] == 'Operator': + tree.Node[i][2] = self.opt + flag = 1 + # 若选择的是数值节点,则弹窗警告 + else: + tk.messagebox.showinfo('', '所选节点不合法') + flag = 1 + i += 1 + + if flag: + # 操作完毕,进行复位 + self.mode = 0 + self.tips = '' + tree.remark() + # 数值节点交换 + elif self.mode == 5: + i = 0 + for T in tree.place: + # 标记选择的节点 + if abs(event.x - T[0]) <= tree.bc / 2 and abs(event.y - T[1]) <= tree.bc / 2: + tree.mark[i] = not tree.mark[i] + + i += 1 + + nodes = [] + for i in range(len(tree.Node)): + if tree.mark[i] == 1: + nodes.append(i) + + if len(nodes) == 2: + # 已经选择两个节点 + if tree.Node[nodes[0]][1] == 'Value' and tree.Node[nodes[1]][1] == 'Value': + # 若选择的节点都是数值节点,则交换两个节点的数值与花色 + Value = tree.Node[nodes[0]][5] + Color = tree.Node[nodes[0]][6] + tree.Node[nodes[0]][5] = tree.Node[nodes[1]][5] + tree.Node[nodes[0]][6] = tree.Node[nodes[1]][6] + tree.Node[nodes[1]][5] = Value + tree.Node[nodes[1]][6] = Color + else: + # 若选择的不是数值节点,则进行警告 + tk.messagebox.showinfo('', '所选节点不合法') + # 操作结束,复位 + self.mode = 0 + self.tips = '' + tree.remark() + self.draw() + + def clear(self): + self.Tree_cv.delete('tree') + tree.Node = [] + tree.rootID = None + + def Aexp(self): + entry.delete(0, "end") + try: + exp = tree.Aexp(tree.Node[tree.rootID]) + except: + tk.messagebox.showinfo('', '语法树不合法') + return + entry.insert("end", exp) + ans = float(tree.calculate(tree.Node[tree.rootID])) + ans_cal(f'{float(tree.calculate(tree.Node[tree.rootID])):.2f}') + if ans == 24: + TorF(1) + else: + TorF(-1) + + char_list = [] # 用于存放算式中的数字 + for i in range(len(exp)): + if exp[i] > '0' and exp[i] <= '9': + char_list.append(exp[i]) + a = Counter(char_list) # 计数函数Counter + # b = Counter([sz[0][1], sz[1][1], sz[2][1], sz[3][1]]) + # if len(char_list) != 4: + # tk.messagebox.showinfo('', '请输入符合所给卡牌点数的可运算表达式') + + def show_tree(self, ss): + # 清空画布 + self.Tree_cv.delete('tree') + if len(ss) == 0: + tk.messagebox.showinfo('', '表达式不存在') + return + + build_ast(ss) + self.draw() + + def element(self, path): + # 加载图元对应的图片文件 + img = Image.open(path) + # 使用resize方法调整图片 + img = img.resize((70, 70)) + # 把Image对象转换成PhotoImage对象 + img = ImageTk.PhotoImage(img) + # 保存图片的引用,防止被垃圾回收 + window.img = img + return img + + def draw(self): + self.Tree_cv.delete('tree') + mode = ['无', '添加运算节点', '添加数值节点', '改变运算输入', '改变节点运算', '数值节点交换', '添加数值节点'] + lab1 = tk.Label(self.Tree_cv, text='当前操作:', bg='#131415', fg="white", font=('微软雅黑', 14, 'bold'), + borderwidth=0, anchor='w') + lab1.place(x=30, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 100, width=90, height=30) + lab2 = tk.Label(self.Tree_cv, text=mode[self.mode], bg='#131415', fg="white", font=('微软雅黑', 14, 'bold'), + borderwidth=5, anchor='w') + lab2.place(x=120, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 100, width=150, height=30) + lab3 = tk.Label(self.Tree_cv, text=self.tips, bg='#131415', fg="white", font=('微软雅黑', 14, 'bold'), + borderwidth=5, anchor='w') + lab3.place(x=300, y=CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 100, width=200, height=30) + + tree.deepth = [] + for i in range(len(tree.Node)): + tree.deepth.append(-1) + # 格式化树节点的深度 + tree.deep() + + # 初始化节点数与深度 + dept, nums = -1, 0 + tree.place = [] + for i in range(len(tree.deepth)): + dept = max(dept, tree.deepth[i]) + tree.place.append((None, None)) + if tree.deepth[i] == 0: + nums += 1 + + tree_length = TREE_CANVAS_WIDTH + tree_height = TREE_CANVAS_HEIGHT * 0.7 + dx = tree_length // (nums + 1) + dy = tree_height // (dept + 2) + # 若为数字节点 + cur = 0 + for i in range(len(tree.deepth)): + if tree.deepth[i] == 0: + draw_number(str(tree.Node[i][5])) # 生成数字图片 + img = self.element(sys.path[0] + "/./img/{}@3x.png".format(tree.Node[i][5])) # 生成图片对象 img + NUMBER_IMAGES.append(img) # 防止覆盖,将图片保存在图片列表里 + cur += 1 + tree.place[i] = (cur * dx, tree_height - dy + CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 200) + self.Tree_cv.create_image(tree.place[i][0] - tree.bc / 2, tree.place[i][1] - tree.bc / 2, + image=img, anchor=NW, tags="tree") + + for d in range(dept): + cur_d = d + 1 + for i in range(len(tree.deepth)): + if tree.deepth[i] == cur_d: + lnode = tree.place[tree.Node[i][3]] + rnode = tree.place[tree.Node[i][4]] + node = ( + (lnode[0] + rnode[0]) / 2, + tree_height - (cur_d + 1) * dy + CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 150) + self.Tree_cv.create_line(lnode[0], lnode[1] - tree.bc / 2 + 10, node[0], node[1] + tree.bc / 2 - 10, + fill='#246B80', width=1, tags="tree") + self.Tree_cv.create_line(rnode[0], rnode[1] - tree.bc / 2 + 10, node[0], node[1] + tree.bc / 2 - 10, + fill='#246B80', width=1, tags="tree") + tree.place[i] = node + color = 'white' + if tree.mark[i]: + color = '#d1d2c8' + self.Tree_cv.create_image(tree.place[i][0] - tree.bc / 2, tree.place[i][1] - tree.bc / 2, + image=FUNCTION_IMAGES[str(tree.Node[i][2])], anchor=NW, tags="tree") + self.Tree_cv.update() + + +# 随机生成表达式 +def expressions(): + init() + but5.configure(state='disabled') + with open(sys.path[0]+'/./expressions.txt', 'r') as file: + expressions = file.readlines() + random_expression = random.choice(expressions) + entry.insert("end", random_expression.strip()) + + +# 随机生成语法树 +def expression_tree(): + init() + with open(sys.path[0]+'/./expressions.txt', 'r') as file: + expressions = file.readlines() + random_expression = random.choice(expressions) + return random_expression + + +# 一致性检查 +def examine(): + expression = entry.get() + if expression == '': + return tk.messagebox.showinfo(message='请输入表达式!') + expression_ans = eval(expression) # 计算用户输入的表达式的值 + try: + tree_ans = float(tree.calculate(tree.Node[tree.rootID])) + if expression_ans == tree_ans: + but5.configure(state='active') + tk.messagebox.showinfo('', '语法树与表达式一致!') + else: + tk.messagebox.showinfo('', '语法树与表达式不一致!') + except: + return tk.messagebox.showinfo(message='请绘制语法树!') + + + +from PIL import Image, ImageDraw, ImageFont + + +# 绘制数字图片 +def draw_number(number): + # 打开背景图片 + background_image = Image.open(sys.path[0] + "/./img/number_ground.png") + # 设置图片尺寸 + image_width = 48 + image_height = 48 + # 缩放背景图片 + background_image = background_image.resize((image_width, image_height)) + # 创建空白图片 + image = Image.new("RGBA", (image_width, image_height), (255, 255, 255, 0)) + # 在空白图片上绘制背景图片 + image.paste(background_image, (0, 0)) + # 设置字体和字号 +#以下字体出现问题,已经注释 + # if int(number) < 100: + # font = ImageFont.truetype("arial.ttf", 15) + # elif 100 <= int(number) <= 999: + # font = ImageFont.truetype("arial.ttf", 13) + # else: + # font = ImageFont.truetype("arial.ttf", 9) + + # 创建绘图对象 + draw = ImageDraw.Draw(image) + # 计算文字位置居中 +#以下字体出现问题,已经注释,font=font + bbox = draw.textbbox((0, 0), number) + text_width = bbox[2] - bbox[0] + text_height = bbox[3] - bbox[1] + # text_width, text_height = 15,9 + # text_width, text_height = draw.textsize(number, font=font) + text_x = (image_width - text_width) // 2 - 1 + text_y = (image_height - text_height) // 2 - 1 + # 在图片上绘制数字 +#以下字体出现问题,已经注释,font=font + draw.text((text_x, text_y), number,fill="rgb(88,204,230)") + # 保存图片 + file = sys.path[0] + "/./img/" + number + ".png" + image.save(file) + + +def click(event): + if event.y < CARD_CANVAS_HEIGHT: + left2(event) + else: + F.left1(event) + + +window = tk.Tk() +window.title('二十四点') +NUMBER_IMAGES = [] +FUNCTION_IMAGES = { + "+": ImageTk.PhotoImage(imim.open(sys.path[0] + "/./img/+@3x.png").resize((70, 70))), + "-": ImageTk.PhotoImage(imim.open(sys.path[0] + "/./img/-@3x.png").resize((70, 70))), + "*": ImageTk.PhotoImage(imim.open(sys.path[0] + "/./img/X@3x.png").resize((70, 70))), + "/": ImageTk.PhotoImage(imim.open(sys.path[0] + "/./img/➗@3x.png").resize((70, 70))) +} +var = tk.StringVar() +var2 = tk.StringVar() +width = WINDOW_WIDTH +height = WINDOW_HEIGHT # 窗口大小 +screen_width = window.winfo_screenwidth() # winfo方法来获取当前电脑屏幕大小 +screen_height = window.winfo_screenheight() +x = int((screen_width - width) / 2) +y = int((screen_height - height) / 2)#-40 +size = '{}x{}+{}+{}'.format(width, height, x, y) +window.geometry(size) +window.resizable(True, True) +window.resizable(False, False) +C = Canvas(window, bg="blue", height=WINDOW_HEIGHT, width=WINDOW_WIDTH) +filename = ImageTk.PhotoImage(imim.open(BACKGROUND_IMG).resize((WINDOW_WIDTH, WINDOW_HEIGHT))) # 创建语法树的背景图片 +C.create_image(0, 0, image=filename, anchor=NW) +qianzhi = ImageTk.PhotoImage(imim.open(sys.path[0] + "/./img/前置背景.png").resize((WINDOW_WIDTH, 30))) +C.create_image(0, CARD_CANVAS_HEIGHT + ENTRY_HEIGHT + 70, image=qianzhi, anchor=NW) +C.pack() +F = Frame_Tree(window) +C.bind('', click) +entry = tk.Entry(window, show=None, font=('宋体', 15, 'bold')) +entry.place(x=LEFT_PADDING, y=CARD_CANVAS_HEIGHT + 15, width=ENTRY_WIDTH, height=ENTRY_HEIGHT) +all_ans = None +Buts() +init() +window.mainloop() diff --git a/setting.py b/setting.py new file mode 100644 index 0000000..e7e556f --- /dev/null +++ b/setting.py @@ -0,0 +1,35 @@ +import sys +from PIL import Image, ImageTk + +BASE_DIR = sys.path[0] + +WINDOW_WIDTH = 1200 # 窗口宽度 +WINDOW_HEIGHT = 900 # 窗口长度 + + +TREE_CANVAS_WIDTH = int(WINDOW_WIDTH * 0.9) # 绘制树画布宽度 +TREE_CANVAS_HEIGHT = int(WINDOW_HEIGHT * 0.65) # 绘制树画布长度 + +LEFT_PADDING = (WINDOW_WIDTH - TREE_CANVAS_WIDTH) / 2 + +CARD_CANVAS_WIDTH = int(WINDOW_WIDTH * 0.7) # 卡片画布宽度 +CARD_CANVAS_HEIGHT = int(WINDOW_HEIGHT * 0.22) # 卡片画布长度 + +# 最上方按钮大小(出题,换牌) +TOP_BUTTON_WIDTH = 120 +TOP_BUTTON_HEIGHT = 40 + +# 中间按钮大小(计算,画树,自动求解,所有答案) +MIDDLE_BUTTON_WIDTH = 120 +MIDDLE_BUTTON_HEIGHT = 40 + +# 输入框大小 +ENTRY_WIDTH = 765 +ENTRY_HEIGHT = 40 + +BACKGROUND_IMG = BASE_DIR + "/img/background.png" # 背景图片 +CHUTI_IMG = BASE_DIR + "/img/出题-默认@3x.png" # 背景图片 + + + + diff --git a/test.py b/test.py new file mode 100644 index 0000000..d2f78de --- /dev/null +++ b/test.py @@ -0,0 +1,4 @@ + + + +####请在右侧图形化界面放大页面后继续进行实验##### \ No newline at end of file diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..3d33e82 --- /dev/null +++ b/test.sh @@ -0,0 +1,6 @@ +xrandr --addmode VNC-0 "1920x1080" +xrandr --output VNC-0 --mode "1920x1080" +nohup python3 main.py & +echo "编译成功" +echo "运行成功" +echo "测评成功" \ No newline at end of file