更新谜题生成器

This commit is contained in:
2025-08-05 19:40:36 +08:00
parent 961f0ba785
commit 44f75bca90
2 changed files with 77 additions and 1 deletions

View File

@@ -43,6 +43,7 @@ class Finished(Composition):
def compose(self): def compose(self):
yield Label("本次记忆进程结束", id=self.regid("msg")) yield Label("本次记忆进程结束", id=self.regid("msg"))
#yield Button("示例按钮", id="testbtn") #yield Button("示例按钮", id="testbtn")
class Placeholder(Composition): class Placeholder(Composition):
def __init__(self, screen: Screen): def __init__(self, screen: Screen):
self.screen = screen self.screen = screen
@@ -147,6 +148,12 @@ class FillBlank(Composition):
if event.button.id == "ok": if event.button.id == "ok":
return 1 return 1
class DrawCard(Composition):
def __init__(self, screen: Screen, reactor, atom: Tuple[pt.Electron, pt.Nucleon, Dict] = pt.Atom.placeholder()):
super().__init__(screen, reactor, atom)
def compose(self):
def handler(self, event, type_):
registry = { registry = {
"sample": Composition, "sample": Composition,

View File

@@ -41,4 +41,73 @@ class BlankPuzzle(Puzzle):
return f"{self.wording}\n{str(self.answer)}" return f"{self.wording}\n{str(self.answer)}"
class SelectionPuzzle(Puzzle): class SelectionPuzzle(Puzzle):
"选择题谜题生成器" """选择题谜题生成器
Args:
mapping: 正确选项映射 {问题: 答案}
jammer: 干扰项列表
max_riddles_num: 最大生成谜题数 (默认2个)
prefix: 问题前缀
"""
def __init__(self, mapping: dict, jammer: list, max_riddles_num: int = 2, prefix: str = ""):
self.prefix = prefix
self.mapping = mapping
self.jammer = list(set(jammer + list(mapping.values()))) # 合并干扰项和正确答案并去重
self.max_riddles_num = max(1, min(max_riddles_num, 5)) # 限制1-5个谜题
self.wording = "选择题 - 尚未刷新谜题"
self.answer = ["选择题 - 尚未刷新谜题"]
self.options = []
def refresh(self):
"""刷新谜题,根据题目数量生成适当数量的谜题"""
if not self.mapping:
self.wording = "无可用题目"
self.answer = ["无答案"]
self.options = []
return
# 确定实际生成的谜题数量
num_questions = min(self.max_riddles_num, len(self.mapping))
questions = random.sample(list(self.mapping.items()), num_questions)
# 生成谜题
puzzles = []
answers = []
all_options = []
for question, correct_answer in questions:
# 生成选项 (正确答案 + 3个干扰项)
options = [correct_answer]
available_jammers = [j for j in self.jammer if j != correct_answer]
if len(available_jammers) >= 3:
selected_jammers = random.sample(available_jammers, 3)
else:
selected_jammers = random.choices(available_jammers, k=3)
options.extend(selected_jammers)
random.shuffle(options)
puzzles.append(question)
answers.append(correct_answer)
all_options.append(options)
question_texts = [f"{self.prefix}"]
for i, (puzzle, options) in enumerate(zip(puzzles, all_options)):
#options_text = "\n".join([f" {chr(97+j)}. {opt}" for j, opt in enumerate(options)])
question_texts.append(f"{i+1}. {puzzle}")
self.wording = "\n".join(question_texts)
self.answer = answers
self.options = all_options
def __str__(self):
return f"{self.wording}\n正确答案: {', '.join(self.answer)}"
puz = SelectionPuzzle({"1+1":"2", "1+2":"3", "1+3": "4"}, ["2","5","0"], 3, '求值: ')
puz.refresh()
print(puz.wording)
print(puz.answer)
print(puz.options)