From b2f4768573ee4765c65a2934e566195c0424d9c9 Mon Sep 17 00:00:00 2001 From: MixBadGun <1059129006@qq.com> Date: Tue, 21 Oct 2025 23:52:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=88=A4=E5=AE=9A=E4=B8=8E?= =?UTF-8?q?=E8=AE=A1=E5=88=86=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- konabot/plugins/idiomgame/__init__.py | 56 ++++++++++++++++++++------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/konabot/plugins/idiomgame/__init__.py b/konabot/plugins/idiomgame/__init__.py index aeecf42..0ef893f 100644 --- a/konabot/plugins/idiomgame/__init__.py +++ b/konabot/plugins/idiomgame/__init__.py @@ -68,17 +68,19 @@ class TryStopState(Enum): class TryVerifyState(Enum): VERIFIED = 0 - NOT_IDIOM = 1 - WRONG_FIRST_CHAR = 2 - VERIFIED_BUT_NO_NEXT = 3 - VERIFIED_GAME_END = 4 + VERIFIED_AND_REAL = 1 + NOT_IDIOM = 2 + WRONG_FIRST_CHAR = 3 + VERIFIED_BUT_NO_NEXT = 4 + VERIFIED_GAME_END = 5 class IdiomGame: ALL_WORDS = [] # 所有四字词语 ALL_IDIOMS = [] # 所有成语 INSTANCE_LIST: dict[str, "IdiomGame"] = {} # 群号对应的游戏实例 - IDIOM_FIRST_CHAR = {} # 成语首字字典 + IDIOM_FIRST_CHAR = {} # 所有成语包括词语的首字字典 + AVALIABLE_IDIOM_FIRST_CHAR = {} # 真正有效的成语首字字典 __inited = False @@ -181,7 +183,7 @@ class IdiomGame: """ 判断是否有成语可以接 """ - return last_char in IdiomGame.IDIOM_FIRST_CHAR + return last_char in IdiomGame.AVALIABLE_IDIOM_FIRST_CHAR def _verify_idiom(self, idiom: str, user_id: str) -> TryVerifyState: # 新成语的首字应与上一条成语的尾字相同 @@ -193,6 +195,8 @@ class IdiomGame: self.last_idiom = idiom self.last_char = idiom[-1] self.add_score(user_id, 1) + if idiom in IdiomGame.ALL_IDIOMS: + self.add_score(user_id, 4) # 再加 4 分 self.remain_rounds -= 1 if self.remain_rounds <= 0: self.now_playing = False @@ -201,6 +205,8 @@ class IdiomGame: # 没有成语可以接了,自动跳过 self._skip_idiom_async() return TryVerifyState.VERIFIED_BUT_NO_NEXT + if idiom in IdiomGame.ALL_IDIOMS: + return TryVerifyState.VERIFIED_AND_REAL # 真实成语 return TryVerifyState.VERIFIED def get_user_score(self, user_id: str) -> float: @@ -223,6 +229,13 @@ class IdiomGame: def get_last_char(self) -> str: return self.last_char + + @classmethod + def random_idiom_starting_with(cls, first_char: str) -> Optional[str]: + cls.init_lexicon() + if first_char not in cls.IDIOM_FIRST_CHAR: + return None + return secrets.choice(cls.IDIOM_FIRST_CHAR[first_char]) @classmethod def init_lexicon(cls): @@ -288,6 +301,12 @@ class IdiomGame: cls.IDIOM_FIRST_CHAR[idiom[0]] = [] cls.IDIOM_FIRST_CHAR[idiom[0]].append(idiom) + # 根据真正的成语大表,划分出有效成语首字字典 + for idiom in cls.ALL_IDIOMS: + if idiom[0] not in cls.AVALIABLE_IDIOM_FIRST_CHAR: + cls.AVALIABLE_IDIOM_FIRST_CHAR[idiom[0]] = [] + cls.AVALIABLE_IDIOM_FIRST_CHAR[idiom[0]].append(idiom) + evt = on_alconna( Alconna( @@ -421,7 +440,8 @@ async def _(target: DepLongTaskTarget): instance = IdiomGame.INSTANCE_LIST.get(group_id) if not instance or not instance.get_playing_state(): return - await evt.send(await UniMessage().text("你们太菜了!全部扣100分!").export()) + avaliable_idiom = IdiomGame.random_idiom_starting_with(instance.get_last_char()) + await evt.send(await UniMessage().text(f"你们太菜了,全部扣100分!明明还可以接「{avaliable_idiom}」的!").export()) idiom = await instance.skip_idiom(-100) await evt.send( await UniMessage().text(f"重新开始,下一个成语是「{idiom}」").export() @@ -458,16 +478,24 @@ async def _(event: BaseEvent, msg: UniMsg, target: DepLongTaskTarget): await evt.send( await UniMessage() .at(user_id) - .text("接不上!这个不一样!你被扣了 0.1 分!") + .text(" 接不上!这个不一样!你被扣了 0.1 分!") .export() ) return - await evt.send( - await UniMessage() - .at(user_id) - .text(f"接对了!你有 {instance.get_user_score(user_id)} 分!") - .export() - ) + if state == TryVerifyState.VERIFIED: + await evt.send( + await UniMessage() + .at(user_id) + .text(f" 接上了,喜提 1 分!你有 {instance.get_user_score(user_id)} 分!") + .export() + ) + elif state == TryVerifyState.VERIFIED_AND_REAL: + await evt.send( + await UniMessage() + .at(user_id) + .text(f" 接上了,这是个真实成语,喜提 5 分!你有 {instance.get_user_score(user_id)} 分!") + .export() + ) if state == TryVerifyState.VERIFIED_GAME_END: await evt.send(await UniMessage().text("全部回合结束!").export()) await end_game(event, group_id)