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