koishi-plugin-wordle-game 1.2.5 → 1.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export declare const inject: {
4
4
  optional: string[];
5
5
  };
6
6
  export declare const name = "wordle-game";
7
- export declare const usage = "## \uD83C\uDFA3 \u4F7F\u7528\n\n- \u542F\u52A8\u5FC5\u8981\u7684\u670D\u52A1\u3002\u60A8\u9700\u8981\u542F\u7528 `monetary`\uFF0C`database` \u548C `puppeteer` \u63D2\u4EF6\uFF0C\u4EE5\u5B9E\u73B0\u8D27\u5E01\u7CFB\u7EDF\uFF0C\u6570\u636E\u5B58\u50A8\u548C\u56FE\u7247\u751F\u6210\u7684\u529F\u80FD\u3002\n- \u5EFA\u8BAE\u81EA\u884C\u6DFB\u52A0\u6307\u4EE4\u522B\u540D\uFF0C\u4EE5\u65B9\u4FBF\u60A8\u548C\u60A8\u7684\u7528\u6237\u4F7F\u7528\u3002\n- \u4EAB\u53D7\u731C\u5355\u8BCD\u6E38\u620F\u5427\uFF01\uD83D\uDE0A\n\n## \uD83C\uDFB3 \u6E38\u620F\u6307\u4EE4\n\n\u4EE5\u4E0B\u662F\u8BE5\u63D2\u4EF6\u63D0\u4F9B\u7684\u6307\u4EE4\u5217\u8868:\n\n### \u6E38\u620F\u64CD\u4F5C\n\n- `wordleGame.\u52A0\u5165 [money:number]` - \u52A0\u5165\u6E38\u620F\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u6295\u5165\u7684\u8D27\u5E01\u6570\u989D\u3002\n- `wordleGame.\u9000\u51FA` - \u9000\u51FA\u6E38\u620F\uFF0C\u53EA\u80FD\u5728\u6E38\u620F\u672A\u5F00\u59CB\u65F6\u4F7F\u7528\u3002\n- `wordleGame.\u7ED3\u675F` - \u7ED3\u675F\u6E38\u620F\uFF0C\u53EA\u80FD\u5728\u6E38\u620F\u5DF2\u5F00\u59CB\u65F6\u4F7F\u7528\u3002\n\n### \u6E38\u620F\u6A21\u5F0F\n\n- `wordleGame.\u5F00\u59CB [guessWordLength:number]` - \u5F00\u59CB\u6E38\u620F\u5F15\u5BFC\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u731C\u5355\u8BCD\u7684\u957F\u5EA6\u3002\n- `wordleGame.\u5F00\u59CB.\u7ECF\u5178` - \u5F00\u59CB\u7ECF\u5178\u731C\u5355\u8BCD\u6E38\u620F\uFF0C\u9700\u8981\u6295\u5165\u8D27\u5E01\uFF0C\u8D62\u4E86\u6709\u5956\u52B1\u3002\n - `--hard` - \u6307\u4EE4\u7684\u9009\u9879\uFF0C\u56F0\u96BE\u6A21\u5F0F\uFF0C\u540E\u7EED\u731C\u5355\u8BCD\u5FC5\u987B\u4F7F\u7528\u524D\u9762\u6B63\u786E\u6216\u51FA\u73B0\u7684\u5B57\u6BCD\u3002\n- `wordleGame.\u5F00\u59CB.CET4/6/GMAT/GRE/IELTS/SAT/TOEFL/\u8003\u7814/\u4E13\u516B/\u4E13\u56DB/ALL [guessWordLength:number]` -\n \u5F00\u59CB\u731C\u4E0D\u540C\u8003\u8BD5/\u7C7B\u522B\u7684\u5355\u8BCD\u6E38\u620F\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u731C\u5355\u8BCD\u7684\u957F\u5EA6\u3002\n - `--hard` - \u6307\u4EE4\u7684\u9009\u9879\uFF0C\u56F0\u96BE\u6A21\u5F0F\uFF0C\u540E\u7EED\u731C\u5355\u8BCD\u5FC5\u987B\u4F7F\u7528\u524D\u9762\u6B63\u786E\u6216\u51FA\u73B0\u7684\u5B57\u6BCD\u3002\n\n### \u6E38\u620F\u64CD\u4F5C\n\n- `wordleGame.\u731C [inputWord:text]` - \u731C\u5355\u8BCD\uFF0C\u53C2\u6570\u4E3A\u8F93\u5165\u7684\u5355\u8BCD\u3002\n- `wordleGame.\u67E5\u8BE2\u8FDB\u5EA6` - \u67E5\u8BE2\u5F53\u524D\u6E38\u620F\u8FDB\u5EA6\u3002\n\n### \u6570\u636E\u67E5\u8BE2\n\n- `wordleGame.\u67E5\u8BE2\u5355\u8BCD [targetWord:text]` - \u5728 ALL \u8BCD\u5E93\u4E2D\u67E5\u8BE2\u5355\u8BCD\u4FE1\u606F\uFF08\u7FFB\u8BD1\uFF09\u3002\n- `wordleGame.\u67E5\u8BE2\u73A9\u5BB6\u8BB0\u5F55 [targetUser:text]` - \u67E5\u8BE2\u73A9\u5BB6\u8BB0\u5F55\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u76EE\u6807\u73A9\u5BB6\u7684 at \u4FE1\u606F\u3002\n- `wordleGame.\u6392\u884C\u699C [number:number]` - \u67E5\u770B\u6392\u884C\u699C\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u6392\u884C\u699C\u7684\u4EBA\u6570\u3002\n- `wordleGame.\u6392\u884C\u699C.\u635F\u76CA/\u603B.\u80DC\u573A/\u603B.\u8F93\u573A/\u7ECF\u5178/CET4/CET6/GMAT/GRE/IELTS/SAT/TOEFL/\u8003\u7814/\u4E13\u516B/\u4E13\u56DB/ALL.\u80DC\u573A/\u8F93\u573A/\u6700\u5FEB\u7528\u65F6 [number:number]` -\n \u67E5\u770B\u4E0D\u540C\u6A21\u5F0F\u7684\u73A9\u5BB6\u6392\u884C\u699C\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u6392\u884C\u699C\u7684\u4EBA\u6570\u3002";
7
+ export declare const usage = "## \uD83C\uDFA3 \u4F7F\u7528\n\n- \u542F\u52A8\u5FC5\u8981\u7684\u670D\u52A1\u3002\u60A8\u9700\u8981\u542F\u7528 `monetary`\uFF0C`database` \u548C `puppeteer` \u63D2\u4EF6\uFF0C\u4EE5\u5B9E\u73B0\u8D27\u5E01\u7CFB\u7EDF\uFF0C\u6570\u636E\u5B58\u50A8\u548C\u56FE\u7247\u751F\u6210\u7684\u529F\u80FD\u3002\n- \u5EFA\u8BAE\u81EA\u884C\u6DFB\u52A0\u6307\u4EE4\u522B\u540D\uFF0C\u4EE5\u65B9\u4FBF\u60A8\u548C\u60A8\u7684\u7528\u6237\u4F7F\u7528\u3002\n- \u4EAB\u53D7\u731C\u5355\u8BCD\u6E38\u620F\u5427\uFF01\uD83D\uDE0A\n\n## \uD83C\uDFB3 \u6E38\u620F\u6307\u4EE4\n\n\u4EE5\u4E0B\u662F\u8BE5\u63D2\u4EF6\u63D0\u4F9B\u7684\u6307\u4EE4\u5217\u8868:\n\n### \u6E38\u620F\u64CD\u4F5C\n\n- `wordleGame.\u52A0\u5165 [money:number]` - \u52A0\u5165\u6E38\u620F\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u6295\u5165\u7684\u8D27\u5E01\u6570\u989D\u3002\n- `wordleGame.\u9000\u51FA` - \u9000\u51FA\u6E38\u620F\uFF0C\u53EA\u80FD\u5728\u6E38\u620F\u672A\u5F00\u59CB\u65F6\u4F7F\u7528\u3002\n- `wordleGame.\u7ED3\u675F` - \u7ED3\u675F\u6E38\u620F\uFF0C\u53EA\u80FD\u5728\u6E38\u620F\u5DF2\u5F00\u59CB\u65F6\u4F7F\u7528\u3002\n\n### \u6E38\u620F\u6A21\u5F0F\n\n- `wordleGame.\u5F00\u59CB [guessWordLength:number]`\n - \u5F00\u59CB\u6E38\u620F\u5F15\u5BFC\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u731C\u5355\u8BCD\u7684\u957F\u5EA6\u3002\n\n- `wordleGame.\u5F00\u59CB.\u7ECF\u5178`\n - \u5F00\u59CB\u7ECF\u5178\u731C\u5355\u8BCD\u6E38\u620F\uFF0C\u9700\u8981\u6295\u5165\u8D27\u5E01\uFF0C\u8D62\u4E86\u6709\u5956\u52B1\u3002\n\n- `wordleGame.\u5F00\u59CB.CET4/6/GMAT/GRE/IELTS/SAT/TOEFL/\u8003\u7814/\u4E13\u516B/\u4E13\u56DB/ALL [guessWordLength:number]`\n - \u5F00\u59CB\u731C\u4E0D\u540C\u8003\u8BD5/\u7C7B\u522B\u7684\u5355\u8BCD\u6E38\u620F\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u731C\u5355\u8BCD\u7684\u957F\u5EA6\u3002\n - `--hard`\n - \u56F0\u96BE\u6A21\u5F0F\uFF0C\u6240\u6709\u900F\u9732\u7684\u4FE1\u606F\u5FC5\u987B\u5728\u4EE5\u540E\u7684\u731C\u6D4B\u4E2D\u4F7F\u7528\u3002\n - `--absurd`\n - \u8352\u8C2C/\u53D8\u6001\u6A21\u5F0F\uFF0CAI\u5C06\u5C3D\u91CF\u907F\u514D\u7ED9\u51FA\u7B54\u6848\uFF0C\u6BCF\u6B21\u731C\u6D4B\u65F6\u90FD\u4F1A\u5C3D\u53EF\u80FD\u5C11\u5730\u900F\u9732\u4FE1\u606F\uFF0C\u751A\u81F3\u53EF\u80FD\u66F4\u6362\u79D8\u5BC6\u8BCD\u3002\n - \u5728\u8FD9\u79CD\u6A21\u5F0F\u4E0B\uFF0C\u4F60\u5C06\u9762\u5BF9\u4E00\u4E2A\u6781\u5177\u6311\u6218\u6027\u7684\u5BF9\u624B\u3002\n - [\u5982\u4F55\u73A9\uFF1F](https://qntm.org/absurdle)\n - `--challenge`\n - \u8352\u8C2C/\u53D8\u6001\u6311\u6218\u6A21\u5F0F\uFF0C\u8981\u6C42\u4F60\u4ECE\u4E00\u4E2A\u7ED9\u5B9A\u7684\u76EE\u6807\u8BCD\u51FA\u53D1\uFF0C\u901A\u8FC7\u67D0\u79CD\u65B9\u5F0F\u4F7F\u5176\u53D8\u6210\u79D8\u5BC6\u8BCD\u3002\n - \u4EC5\u5EFA\u8BAE\u9AD8\u7EA7\u73A9\u5BB6\u5C1D\u8BD5\u3002\n - [\u5982\u4F55\u73A9\uFF1F](https://qntm.org/challenge)\n\n> Tip\uFF1A\u53EF\u4EE5\u540C\u65F6\u542F\u7528\u56F0\u96BE\u6A21\u5F0F\u548C\u53D8\u6001\u6A21\u5F0F\uFF0C\u4E14\u7ECF\u5178\u6A21\u5F0F\u4E5F\u540C\u6837\u9002\u7528\u3002\n\n### \u6E38\u620F\u64CD\u4F5C\n\n- `wordleGame.\u731C [inputWord:text]` - \u731C\u5355\u8BCD\uFF0C\u53C2\u6570\u4E3A\u8F93\u5165\u7684\u5355\u8BCD\u3002\n- `wordleGame.\u67E5\u8BE2\u8FDB\u5EA6` - \u67E5\u8BE2\u5F53\u524D\u6E38\u620F\u8FDB\u5EA6\u3002\n\n### \u6570\u636E\u67E5\u8BE2\n\n- `wordleGame.\u67E5\u8BE2\u5355\u8BCD [targetWord:text]` - \u5728 ALL \u8BCD\u5E93\u4E2D\u67E5\u8BE2\u5355\u8BCD\u4FE1\u606F\uFF08\u7FFB\u8BD1\uFF09\u3002\n- `wordleGame.\u67E5\u8BE2\u73A9\u5BB6\u8BB0\u5F55 [targetUser:text]` - \u67E5\u8BE2\u73A9\u5BB6\u8BB0\u5F55\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u76EE\u6807\u73A9\u5BB6\u7684 at \u4FE1\u606F\u3002\n- `wordleGame.\u6392\u884C\u699C [number:number]` - \u67E5\u770B\u6392\u884C\u699C\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u6392\u884C\u699C\u7684\u4EBA\u6570\u3002\n- `wordleGame.\u6392\u884C\u699C.\u635F\u76CA/\u603B.\u80DC\u573A/\u603B.\u8F93\u573A/\u7ECF\u5178/CET4/CET6/GMAT/GRE/IELTS/SAT/TOEFL/\u8003\u7814/\u4E13\u516B/\u4E13\u56DB/ALL.\u80DC\u573A/\u8F93\u573A/\u6700\u5FEB\u7528\u65F6 [number:number]` -\n \u67E5\u770B\u4E0D\u540C\u6A21\u5F0F\u7684\u73A9\u5BB6\u6392\u884C\u699C\uFF0C\u53EF\u9009\u53C2\u6570\u4E3A\u6392\u884C\u699C\u7684\u4EBA\u6570\u3002";
8
8
  export interface Config {
9
9
  defaultMaxLeaderboardEntries: number;
10
10
  defaultWordLengthForGuessing: number;
@@ -49,6 +49,10 @@ export interface GameRecord {
49
49
  presentLetters: string;
50
50
  absentLetters: string;
51
51
  timestamp: number;
52
+ remainingWordsList: string[];
53
+ isAbsurd: boolean;
54
+ isChallengeMode: boolean;
55
+ targetWord: string;
52
56
  }
53
57
  export interface GamingPlayer {
54
58
  id: number;
package/lib/index.js CHANGED
@@ -51,12 +51,26 @@ exports.usage = `## 🎣 使用
51
51
 
52
52
  ### 游戏模式
53
53
 
54
- - \`wordleGame.开始 [guessWordLength:number]\` - 开始游戏引导,可选参数为猜单词的长度。
55
- - \`wordleGame.开始.经典\` - 开始经典猜单词游戏,需要投入货币,赢了有奖励。
56
- - \`--hard\` - 指令的选项,困难模式,后续猜单词必须使用前面正确或出现的字母。
57
- - \`wordleGame.开始.CET4/6/GMAT/GRE/IELTS/SAT/TOEFL/考研/专八/专四/ALL [guessWordLength:number]\` -
58
- 开始猜不同考试/类别的单词游戏,可选参数为猜单词的长度。
59
- - \`--hard\` - 指令的选项,困难模式,后续猜单词必须使用前面正确或出现的字母。
54
+ - \`wordleGame.开始 [guessWordLength:number]\`
55
+ - 开始游戏引导,可选参数为猜单词的长度。
56
+
57
+ - \`wordleGame.开始.经典\`
58
+ - 开始经典猜单词游戏,需要投入货币,赢了有奖励。
59
+
60
+ - \`wordleGame.开始.CET4/6/GMAT/GRE/IELTS/SAT/TOEFL/考研/专八/专四/ALL [guessWordLength:number]\`
61
+ - 开始猜不同考试/类别的单词游戏,可选参数为猜单词的长度。
62
+ - \`--hard\`
63
+ - 困难模式,所有透露的信息必须在以后的猜测中使用。
64
+ - \`--absurd\`
65
+ - 荒谬/变态模式,AI将尽量避免给出答案,每次猜测时都会尽可能少地透露信息,甚至可能更换秘密词。
66
+ - 在这种模式下,你将面对一个极具挑战性的对手。
67
+ - [如何玩?](https://qntm.org/absurdle)
68
+ - \`--challenge\`
69
+ - 荒谬/变态挑战模式,要求你从一个给定的目标词出发,通过某种方式使其变成秘密词。
70
+ - 仅建议高级玩家尝试。
71
+ - [如何玩?](https://qntm.org/challenge)
72
+
73
+ > Tip:可以同时启用困难模式和变态模式,且经典模式也同样适用。
60
74
 
61
75
  ### 游戏操作
62
76
 
@@ -128,6 +142,14 @@ const initialFastestGuessTime = {
128
142
  专四: 0,
129
143
  ALL: 0,
130
144
  };
145
+ // bl*
146
+ const classicWordList = `ABACK ABASE ABATE ABBEY ABBOT ABHOR ABIDE ABLED ABODE ABORT ABOUT ABOVE ABUSE ABYSS ACORN ACRID ACTOR ACUTE ADAGE ADAPT ADEPT ADMIN ADMIT ADOBE ADOPT ADORE ADORN ADULT AFFIX AFIRE AFOOT AFOUL AFTER AGAIN AGAPE AGATE AGENT AGILE AGING AGLOW AGONY AGORA AGREE AHEAD AIDER AISLE ALARM ALBUM ALERT ALGAE ALIBI ALIEN ALIGN ALIKE ALIVE ALLAY ALLEY ALLOT ALLOW ALLOY ALOFT ALONE ALONG ALOOF ALOUD ALPHA ALTAR ALTER AMASS AMAZE AMBER AMBLE AMEND AMISS AMITY AMONG AMPLE AMPLY AMUSE ANGEL ANGER ANGLE ANGRY ANGST ANIME ANKLE ANNEX ANNOY ANNUL ANODE ANTIC ANVIL AORTA APART APHID APING APNEA APPLE APPLY APRON APTLY ARBOR ARDOR ARENA ARGUE ARISE ARMOR AROMA AROSE ARRAY ARROW ARSON ARTSY ASCOT ASHEN ASIDE ASKEW ASSAY ASSET ATOLL ATONE ATTIC AUDIO AUDIT AUGUR AUNTY AVAIL AVERT AVIAN AVOID AWAIT AWAKE AWARD AWARE AWASH AWFUL AWOKE AXIAL AXIOM AXION AZURE BACON BADGE BADLY BAGEL BAGGY BAKER BALER BALMY BANAL BANJO BARGE BARON BASAL BASIC BASIL BASIN BASIS BASTE BATCH BATHE BATON BATTY BAWDY BAYOU BEACH BEADY BEARD BEAST BEECH BEEFY BEFIT BEGAN BEGAT BEGET BEGIN BEGUN BEING BELCH BELIE BELLE BELLY BELOW BENCH BERET BERRY BERTH BESET BETEL BEVEL BEZEL BIBLE BICEP BIDDY BIGOT BILGE BILLY BINGE BINGO BIOME BIRCH BIRTH BISON BITTY BLACK BLADE BLAME BLAND BLANK BLARE BLAST BLAZE BLEAK BLEAT BLEED BLEEP BLEND BLESS BLIMP BLIND BLINK BLISS BLITZ BLOAT BLOCK BLOKE BLOND BLOOD BLOOM BLOWN BLUER BLUFF BLUNT BLURB BLURT BLUSH BOARD BOAST BOBBY BONEY BONGO BONUS BOOBY BOOST BOOTH BOOTY BOOZE BOOZY BORAX BORNE BOSOM BOSSY BOTCH BOUGH BOULE BOUND BOWEL BOXER BRACE BRAID BRAIN BRAKE BRAND BRASH BRASS BRAVE BRAVO BRAWL BRAWN BREAD BREAK BREED BRIAR BRIBE BRICK BRIDE BRIEF BRINE BRING BRINK BRINY BRISK BROAD BROIL BROKE BROOD BROOK BROOM BROTH BROWN BRUNT BRUSH BRUTE BUDDY BUDGE BUGGY BUGLE BUILD BUILT BULGE BULKY BULLY BUNCH BUNNY BURLY BURNT BURST BUSED BUSHY BUTCH BUTTE BUXOM BUYER BYLAW CABAL CABBY CABIN CABLE CACAO CACHE CACTI CADDY CADET CAGEY CAIRN CAMEL CAMEO CANAL CANDY CANNY CANOE CANON CAPER CAPUT CARAT CARGO CAROL CARRY CARVE CASTE CATCH CATER CATTY CAULK CAUSE CAVIL CEASE CEDAR CELLO CHAFE CHAFF CHAIN CHAIR CHALK CHAMP CHANT CHAOS CHARD CHARM CHART CHASE CHASM CHEAP CHEAT CHECK CHEEK CHEER CHESS CHEST CHICK CHIDE CHIEF CHILD CHILI CHILL CHIME CHINA CHIRP CHOCK CHOIR CHOKE CHORD CHORE CHOSE CHUCK CHUMP CHUNK CHURN CHUTE CIDER CIGAR CINCH CIRCA CIVIC CIVIL CLACK CLAIM CLAMP CLANG CLANK CLASH CLASP CLASS CLEAN CLEAR CLEAT CLEFT CLERK CLICK CLIFF CLIMB CLING CLINK CLOAK CLOCK CLONE CLOSE CLOTH CLOUD CLOUT CLOVE CLOWN CLUCK CLUED CLUMP CLUNG COACH COAST COBRA COCOA COLON COLOR COMET COMFY COMIC COMMA CONCH CONDO CONIC COPSE CORAL CORER CORNY COUCH COUGH COULD COUNT COUPE COURT COVEN COVER COVET COVEY COWER COYLY CRACK CRAFT CRAMP CRANE CRANK CRASH CRASS CRATE CRAVE CRAWL CRAZE CRAZY CREAK CREAM CREDO CREED CREEK CREEP CREME CREPE CREPT CRESS CREST CRICK CRIED CRIER CRIME CRIMP CRISP CROAK CROCK CRONE CRONY CROOK CROSS CROUP CROWD CROWN CRUDE CRUEL CRUMB CRUMP CRUSH CRUST CRYPT CUBIC CUMIN CURIO CURLY CURRY CURSE CURVE CURVY CUTIE CYBER CYCLE CYNIC DADDY DAILY DAIRY DAISY DALLY DANCE DANDY DATUM DAUNT DEALT DEATH DEBAR DEBIT DEBUG DEBUT DECAL DECAY DECOR DECOY DECRY DEFER DEIGN DEITY DELAY DELTA DELVE DEMON DEMUR DENIM DENSE DEPOT DEPTH DERBY DETER DETOX DEUCE DEVIL DIARY DICEY DIGIT DILLY DIMLY DINER DINGO DINGY DIODE DIRGE DIRTY DISCO DITCH DITTO DITTY DIVER DIZZY DODGE DODGY DOGMA DOING DOLLY DONOR DONUT DOPEY DOUBT DOUGH DOWDY DOWEL DOWNY DOWRY DOZEN DRAFT DRAIN DRAKE DRAMA DRANK DRAPE DRAWL DRAWN DREAD DREAM DRESS DRIED DRIER DRIFT DRILL DRINK DRIVE DROIT DROLL DRONE DROOL DROOP DROSS DROVE DROWN DRUID DRUNK DRYER DRYLY DUCHY DULLY DUMMY DUMPY DUNCE DUSKY DUSTY DUTCH DUVET DWARF DWELL DWELT DYING EAGER EAGLE EARLY EARTH EASEL EATEN EATER EBONY ECLAT EDICT EDIFY EERIE EGRET EIGHT EJECT EKING ELATE ELBOW ELDER ELECT ELEGY ELFIN ELIDE ELITE ELOPE ELUDE EMAIL EMBED EMBER EMCEE EMPTY ENACT ENDOW ENEMA ENEMY ENJOY ENNUI ENSUE ENTER ENTRY ENVOY EPOCH EPOXY EQUAL EQUIP ERASE ERECT ERODE ERROR ERUPT ESSAY ESTER ETHER ETHIC ETHOS ETUDE EVADE EVENT EVERY EVICT EVOKE EXACT EXALT EXCEL EXERT EXILE EXIST EXPEL EXTOL EXTRA EXULT EYING FABLE FACET FAINT FAIRY FAITH FALSE FANCY FANNY FARCE FATAL FATTY FAULT FAUNA FAVOR FEAST FECAL FEIGN FELLA FELON FEMME FEMUR FENCE FERAL FERRY FETAL FETCH FETID FETUS FEVER FEWER FIBER FIBRE FICUS FIELD FIEND FIERY FIFTH FIFTY FIGHT FILER FILET FILLY FILMY FILTH FINAL FINCH FINER FIRST FISHY FIXER FIZZY FJORD FLACK FLAIL FLAIR FLAKE FLAKY FLAME FLANK FLARE FLASH FLASK FLECK FLEET FLESH FLICK FLIER FLING FLINT FLIRT FLOAT FLOCK FLOOD FLOOR FLORA FLOSS FLOUR FLOUT FLOWN FLUFF FLUID FLUKE FLUME FLUNG FLUNK FLUSH FLUTE FLYER FOAMY FOCAL FOCUS FOGGY FOIST FOLIO FOLLY FORAY FORCE FORGE FORGO FORTE FORTH FORTY FORUM FOUND FOYER FRAIL FRAME FRANK FRAUD FREAK FREED FREER FRESH FRIAR FRIED FRILL FRISK FRITZ FROCK FROND FRONT FROST FROTH FROWN FROZE FRUIT FUDGE FUGUE FULLY FUNGI FUNKY FUNNY FUROR FURRY FUSSY FUZZY GAFFE GAILY GAMER GAMMA GAMUT GASSY GAUDY GAUGE GAUNT GAUZE GAVEL GAWKY GAYER GAYLY GAZER GECKO GEEKY GEESE GENIE GENRE GHOST GHOUL GIANT GIDDY GIPSY GIRLY GIRTH GIVEN GIVER GLADE GLAND GLARE GLASS GLAZE GLEAM GLEAN GLIDE GLINT GLOAT GLOBE GLOOM GLORY GLOSS GLOVE GLYPH GNASH GNOME GODLY GOING GOLEM GOLLY GONAD GONER GOODY GOOEY GOOFY GOOSE GORGE GOUGE GOURD GRACE GRADE GRAFT GRAIL GRAIN GRAND GRANT GRAPE GRAPH GRASP GRASS GRATE GRAVE GRAVY GRAZE GREAT GREED GREEN GREET GRIEF GRILL GRIME GRIMY GRIND GRIPE GROAN GROIN GROOM GROPE GROSS GROUP GROUT GROVE GROWL GROWN GRUEL GRUFF GRUNT GUARD GUAVA GUESS GUEST GUIDE GUILD GUILE GUILT GUISE GULCH GULLY GUMBO GUMMY GUPPY GUSTO GUSTY GYPSY HABIT HAIRY HALVE HANDY HAPPY HARDY HAREM HARPY HARRY HARSH HASTE HASTY HATCH HATER HAUNT HAUTE HAVEN HAVOC HAZEL HEADY HEARD HEART HEATH HEAVE HEAVY HEDGE HEFTY HEIST HELIX HELLO HENCE HERON HILLY HINGE HIPPO HIPPY HITCH HOARD HOBBY HOIST HOLLY HOMER HONEY HONOR HORDE HORNY HORSE HOTEL HOTLY HOUND HOUSE HOVEL HOVER HOWDY HUMAN HUMID HUMOR HUMPH HUMUS HUNCH HUNKY HURRY HUSKY HUSSY HUTCH HYDRO HYENA HYMEN HYPER ICILY ICING IDEAL IDIOM IDIOT IDLER IDYLL IGLOO ILIAC IMAGE IMBUE IMPEL IMPLY INANE INBOX INCUR INDEX INEPT INERT INFER INGOT INLAY INLET INNER INPUT INTER INTRO IONIC IRATE IRONY ISLET ISSUE ITCHY IVORY JAUNT JAZZY JELLY JERKY JETTY JEWEL JIFFY JOINT JOIST JOKER JOLLY JOUST JUDGE JUICE JUICY JUMBO JUMPY JUNTA JUNTO JUROR KAPPA KARMA KAYAK KEBAB KHAKI KINKY KIOSK KITTY KNACK KNAVE KNEAD KNEED KNEEL KNELT KNIFE KNOCK KNOLL KNOWN KOALA KRILL LABEL LABOR LADEN LADLE LAGER LANCE LANKY LAPEL LAPSE LARGE LARVA LASSO LATCH LATER LATHE LATTE LAUGH LAYER LEACH LEAFY LEAKY LEANT LEAPT LEARN LEASE LEASH LEAST LEAVE LEDGE LEECH LEERY LEFTY LEGAL LEGGY LEMON LEMUR LEPER LEVEL LEVER LIBEL LIEGE LIGHT LIKEN LILAC LIMBO LIMIT LINEN LINER LINGO LIPID LITHE LIVER LIVID LLAMA LOAMY LOATH LOBBY LOCAL LOCUS LODGE LOFTY LOGIC LOGIN LOOPY LOOSE LORRY LOSER LOUSE LOUSY LOVER LOWER LOWLY LOYAL LUCID LUCKY LUMEN LUMPY LUNAR LUNCH LUNGE LUPUS LURCH LURID LUSTY LYING LYMPH LYNCH LYRIC MACAW MACHO MACRO MADAM MADLY MAFIA MAGIC MAGMA MAIZE MAJOR MAKER MAMBO MAMMA MAMMY MANGA MANGE MANGO MANGY MANIA MANIC MANLY MANOR MAPLE MARCH MARRY MARSH MASON MASSE MATCH MATEY MAUVE MAXIM MAYBE MAYOR MEALY MEANT MEATY MECCA MEDAL MEDIA MEDIC MELEE MELON MERCY MERGE MERIT MERRY METAL METER METRO MICRO MIDGE MIDST MIGHT MILKY MIMIC MINCE MINER MINIM MINOR MINTY MINUS MIRTH MISER MISSY MOCHA MODAL MODEL MODEM MOGUL MOIST MOLAR MOLDY MONEY MONTH MOODY MOOSE MORAL MORON MORPH MOSSY MOTEL MOTIF MOTOR MOTTO MOULT MOUND MOUNT MOURN MOUSE MOUTH MOVER MOVIE MOWER MUCKY MUCUS MUDDY MULCH MUMMY MUNCH MURAL MURKY MUSHY MUSIC MUSKY MUSTY MYRRH NADIR NAIVE NANNY NASAL NASTY NATAL NAVAL NAVEL NEEDY NEIGH NERDY NERVE NEVER NEWER NEWLY NICER NICHE NIECE NIGHT NINJA NINNY NINTH NOBLE NOBLY NOISE NOISY NOMAD NOOSE NORTH NOSEY NOTCH NOVEL NUDGE NURSE NUTTY NYLON NYMPH OAKEN OBESE OCCUR OCEAN OCTAL OCTET ODDER ODDLY OFFAL OFFER OFTEN OLDEN OLDER OLIVE OMBRE OMEGA ONION ONSET OPERA OPINE OPIUM OPTIC ORBIT ORDER ORGAN OTHER OTTER OUGHT OUNCE OUTDO OUTER OUTGO OVARY OVATE OVERT OVINE OVOID OWING OWNER OXIDE OZONE PADDY PAGAN PAINT PALER PALSY PANEL PANIC PANSY PAPAL PAPER PARER PARKA PARRY PARSE PARTY PASTA PASTE PASTY PATCH PATIO PATSY PATTY PAUSE PAYEE PAYER PEACE PEACH PEARL PECAN PEDAL PENAL PENCE PENNE PENNY PERCH PERIL PERKY PESKY PESTO PETAL PETTY PHASE PHONE PHONY PHOTO PIANO PICKY PIECE PIETY PIGGY PILOT PINCH PINEY PINKY PINTO PIPER PIQUE PITCH PITHY PIVOT PIXEL PIXIE PIZZA PLACE PLAID PLAIN PLAIT PLANE PLANK PLANT PLATE PLAZA PLEAD PLEAT PLIED PLIER PLUCK PLUMB PLUME PLUMP PLUNK PLUSH POESY POINT POISE POKER POLAR POLKA POLYP POOCH POPPY PORCH POSER POSIT POSSE POUCH POUND POUTY POWER PRANK PRAWN PREEN PRESS PRICE PRICK PRIDE PRIED PRIME PRIMO PRINT PRIOR PRISM PRIVY PRIZE PROBE PRONE PRONG PROOF PROSE PROUD PROVE PROWL PROXY PRUDE PRUNE PSALM PUBIC PUDGY PUFFY PULPY PULSE PUNCH PUPAL PUPIL PUPPY PUREE PURER PURGE PURSE PUSHY PUTTY PYGMY QUACK QUAIL QUAKE QUALM QUARK QUART QUASH QUASI QUEEN QUEER QUELL QUERY QUEST QUEUE QUICK QUIET QUILL QUILT QUIRK QUITE QUOTA QUOTE QUOTH RABBI RABID RACER RADAR RADII RADIO RAINY RAISE RAJAH RALLY RALPH RAMEN RANCH RANDY RANGE RAPID RARER RASPY RATIO RATTY RAVEN RAYON RAZOR REACH REACT READY REALM REARM REBAR REBEL REBUS REBUT RECAP RECUR RECUT REEDY REFER REFIT REGAL REHAB REIGN RELAX RELAY RELIC REMIT RENAL RENEW REPAY REPEL REPLY RERUN RESET RESIN RETCH RETRO RETRY REUSE REVEL REVUE RHINO RHYME RIDER RIDGE RIFLE RIGHT RIGID RIGOR RINSE RIPEN RIPER RISEN RISER RISKY RIVAL RIVER RIVET ROACH ROAST ROBIN ROBOT ROCKY RODEO ROGER ROGUE ROOMY ROOST ROTOR ROUGE ROUGH ROUND ROUSE ROUTE ROVER ROWDY ROWER ROYAL RUDDY RUDER RUGBY RULER RUMBA RUMOR RUPEE RURAL RUSTY SADLY SAFER SAINT SALAD SALLY SALON SALSA SALTY SALVE SALVO SANDY SANER SAPPY SASSY SATIN SATYR SAUCE SAUCY SAUNA SAUTE SAVOR SAVOY SAVVY SCALD SCALE SCALP SCALY SCAMP SCANT SCARE SCARF SCARY SCENE SCENT SCION SCOFF SCOLD SCONE SCOOP SCOPE SCORE SCORN SCOUR SCOUT SCOWL SCRAM SCRAP SCREE SCREW SCRUB SCRUM SCUBA SEDAN SEEDY SEGUE SEIZE SEMEN SENSE SEPIA SERIF SERUM SERVE SETUP SEVEN SEVER SEWER SHACK SHADE SHADY SHAFT SHAKE SHAKY SHALE SHALL SHALT SHAME SHANK SHAPE SHARD SHARE SHARK SHARP SHAVE SHAWL SHEAR SHEEN SHEEP SHEER SHEET SHEIK SHELF SHELL SHIED SHIFT SHINE SHINY SHIRE SHIRK SHIRT SHOAL SHOCK SHONE SHOOK SHOOT SHORE SHORN SHORT SHOUT SHOVE SHOWN SHOWY SHREW SHRUB SHRUG SHUCK SHUNT SHUSH SHYLY SIEGE SIEVE SIGHT SIGMA SILKY SILLY SINCE SINEW SINGE SIREN SISSY SIXTH SIXTY SKATE SKIER SKIFF SKILL SKIMP SKIRT SKULK SKULL SKUNK SLACK SLAIN SLANG SLANT SLASH SLATE SLAVE SLEEK SLEEP SLEET SLEPT SLICE SLICK SLIDE SLIME SLIMY SLING SLINK SLOOP SLOPE SLOSH SLOTH SLUMP SLUNG SLUNK SLURP SLUSH SLYLY SMACK SMALL SMART SMASH SMEAR SMELL SMELT SMILE SMIRK SMITE SMITH SMOCK SMOKE SMOKY SMOTE SNACK SNAIL SNAKE SNAKY SNARE SNARL SNEAK SNEER SNIDE SNIFF SNIPE SNOOP SNORE SNORT SNOUT SNOWY SNUCK SNUFF SOAPY SOBER SOGGY SOLAR SOLID SOLVE SONAR SONIC SOOTH SOOTY SORRY SOUND SOUTH SOWER SPACE SPADE SPANK SPARE SPARK SPASM SPAWN SPEAK SPEAR SPECK SPEED SPELL SPELT SPEND SPENT SPERM SPICE SPICY SPIED SPIEL SPIKE SPIKY SPILL SPILT SPINE SPINY SPIRE SPITE SPLAT SPLIT SPOIL SPOKE SPOOF SPOOK SPOOL SPOON SPORE SPORT SPOUT SPRAY SPREE SPRIG SPUNK SPURN SPURT SQUAD SQUAT SQUIB STACK STAFF STAGE STAID STAIN STAIR STAKE STALE STALK STALL STAMP STAND STANK STARE STARK START STASH STATE STAVE STEAD STEAK STEAL STEAM STEED STEEL STEEP STEER STEIN STERN STICK STIFF STILL STILT STING STINK STINT STOCK STOIC STOKE STOLE STOMP STONE STONY STOOD STOOL STOOP STORE STORK STORM STORY STOUT STOVE STRAP STRAW STRAY STRIP STRUT STUCK STUDY STUFF STUMP STUNG STUNK STUNT STYLE SUAVE SUGAR SUING SUITE SULKY SULLY SUMAC SUNNY SUPER SURER SURGE SURLY SUSHI SWAMI SWAMP SWARM SWASH SWATH SWEAR SWEAT SWEEP SWEET SWELL SWEPT SWIFT SWILL SWINE SWING SWIRL SWISH SWOON SWOOP SWORD SWORE SWORN SWUNG SYNOD SYRUP TABBY TABLE TABOO TACIT TACKY TAFFY TAINT TAKEN TAKER TALLY TALON TAMER TANGO TANGY TAPER TAPIR TARDY TAROT TASTE TASTY TATTY TAUNT TAWNY TEACH TEARY TEASE TEDDY TEETH TEMPO TENET TENOR TENSE TENTH TEPEE TEPID TERRA TERSE TESTY THANK THEFT THEIR THEME THERE THESE THETA THICK THIEF THIGH THING THINK THIRD THONG THORN THOSE THREE THREW THROB THROW THRUM THUMB THUMP THYME TIARA TIBIA TIDAL TIGER TIGHT TILDE TIMER TIMID TIPSY TITAN TITHE TITLE TOAST TODAY TODDY TOKEN TONAL TONGA TONIC TOOTH TOPAZ TOPIC TORCH TORSO TORUS TOTAL TOTEM TOUCH TOUGH TOWEL TOWER TOXIC TOXIN TRACE TRACK TRACT TRADE TRAIL TRAIN TRAIT TRAMP TRASH TRAWL TREAD TREAT TREND TRIAD TRIAL TRIBE TRICE TRICK TRIED TRIPE TRITE TROLL TROOP TROPE TROUT TROVE TRUCE TRUCK TRUER TRULY TRUMP TRUNK TRUSS TRUST TRUTH TRYST TUBAL TUBER TULIP TULLE TUMOR TUNIC TURBO TUTOR TWANG TWEAK TWEED TWEET TWICE TWINE TWIRL TWIST TWIXT TYING UDDER ULCER ULTRA UMBRA UNCLE UNCUT UNDER UNDID UNDUE UNFED UNFIT UNIFY UNION UNITE UNITY UNLIT UNMET UNSET UNTIE UNTIL UNWED UNZIP UPPER UPSET URBAN URINE USAGE USHER USING USUAL USURP UTILE UTTER VAGUE VALET VALID VALOR VALUE VALVE VAPID VAPOR VAULT VAUNT VEGAN VENOM VENUE VERGE VERSE VERSO VERVE VICAR VIDEO VIGIL VIGOR VILLA VINYL VIOLA VIPER VIRAL VIRUS VISIT VISOR VISTA VITAL VIVID VIXEN VOCAL VODKA VOGUE VOICE VOILA VOMIT VOTER VOUCH VOWEL VYING WACKY WAFER WAGER WAGON WAIST WAIVE WALTZ WARTY WASTE WATCH WATER WAVER WAXEN WEARY WEAVE WEDGE WEEDY WEIGH WEIRD WELCH WELSH WENCH WHACK WHALE WHARF WHEAT WHEEL WHELP WHERE WHICH WHIFF WHILE WHINE WHINY WHIRL WHISK WHITE WHOLE WHOOP WHOSE WIDEN WIDER WIDOW WIDTH WIELD WIGHT WILLY WIMPY WINCE WINCH WINDY WISER WISPY WITCH WITTY WOKEN WOMAN WOMEN WOODY WOOER WOOLY WOOZY WORDY WORLD WORRY WORSE WORST WORTH WOULD WOUND WOVEN WRACK WRATH WREAK WRECK WREST WRING WRIST WRITE WRONG WROTE WRUNG WRYLY YACHT YEARN YEAST YIELD YOUNG YOUTH ZEBRA ZESTY ZONAL`;
147
+ // 将单词列表分割为数组
148
+ const wordArray = classicWordList.split(' ');
149
+ // 将单词列表中的单词全部小写化
150
+ const lowerCaseWordArray = wordArray.map(word => word.toLowerCase());
151
+ // const lowerCaseWordArray: string[] = ["cigar", "rebut", "sissy", "humph", "awake", "blush", "focal", "evade", "naval", "serve", "heath", "dwarf", "model", "karma", "stink", "grade", "quiet", "bench", "abate", "feign", "major", "death", "fresh", "crust", "stool", "colon", "abase", "marry", "react", "batty", "pride", "floss", "helix", "croak", "staff", "paper", "unfed", "whelp", "trawl", "outdo", "adobe", "crazy", "sower", "repay", "digit", "crate", "cluck", "spike", "mimic", "pound", "maxim", "linen", "unmet", "flesh", "booby", "forth", "first", "stand", "belly", "ivory", "seedy", "print", "yearn", "drain", "bribe", "stout", "panel", "crass", "flume", "offal", "agree", "error", "swirl", "argue", "bleed", "delta", "flick", "totem", "wooer", "front", "shrub", "parry", "biome", "lapel", "start", "greet", "goner", "golem", "lusty", "loopy", "round", "audit", "lying", "gamma", "labor", "islet", "civic", "forge", "corny", "moult", "basic", "salad", "agate", "spicy", "spray", "essay", "fjord", "spend", "kebab", "guild", "aback", "motor", "alone", "hatch", "hyper", "thumb", "dowry", "ought", "belch", "dutch", "pilot", "tweed", "comet", "jaunt", "enema", "steed", "abyss", "growl", "fling", "dozen", "boozy", "erode", "world", "gouge", "click", "briar", "great", "altar", "pulpy", "blurt", "coast", "duchy", "groin", "fixer", "group", "rogue", "badly", "smart", "pithy", "gaudy", "chill", "heron", "vodka", "finer", "surer", "radio", "rouge", "perch", "retch", "wrote", "clock", "tilde", "store", "prove", "bring", "solve", "cheat", "grime", "exult", "usher", "epoch", "triad", "break", "rhino", "viral", "conic", "masse", "sonic", "vital", "trace", "using", "peach", "champ", "baton", "brake", "pluck", "craze", "gripe", "weary", "picky", "acute", "ferry", "aside", "tapir", "troll", "unify", "rebus", "boost", "truss", "siege", "tiger", "banal", "slump", "crank", "gorge", "query", "drink", "favor", "abbey", "tangy", "panic", "solar", "shire", "proxy", "point", "robot", "prick", "wince", "crimp", "knoll", "sugar", "whack", "mount", "perky", "could", "wrung", "light", "those", "moist", "shard", "pleat", "aloft", "skill", "elder", "frame", "humor", "pause", "ulcer", "ultra", "robin", "cynic", "agora", "aroma", "caulk", "shake", "pupal", "dodge", "swill", "tacit", "other", "thorn", "trove", "bloke", "vivid", "spill", "chant", "choke", "rupee", "nasty", "mourn", "ahead", "brine", "cloth", "hoard", "sweet", "month", "lapse", "watch", "today", "focus", "smelt", "tease", "cater", "movie", "lynch", "saute", "allow", "renew", "their", "slosh", "purge", "chest", "depot", "epoxy", "nymph", "found", "shall", "harry", "stove", "lowly", "snout", "trope", "fewer", "shawl", "natal", "fibre", "comma", "foray", "scare", "stair", "black", "squad", "royal", "chunk", "mince", "slave", "shame", "cheek", "ample", "flair", "foyer", "cargo", "oxide", "plant", "olive", "inert", "askew", "heist", "shown", "zesty", "hasty", "trash", "fella", "larva", "forgo", "story", "hairy", "train", "homer", "badge", "midst", "canny", "fetus", "butch", "farce", "slung", "tipsy", "metal", "yield", "delve", "being", "scour", "glass", "gamer", "scrap", "money", "hinge", "album", "vouch", "asset", "tiara", "crept", "bayou", "atoll", "manor", "creak", "showy", "phase", "froth", "depth", "gloom", "flood", "trait", "girth", "piety", "payer", "goose", "float", "donor", "atone", "primo", "apron", "blown", "cacao", "loser", "input", "gloat", "awful", "brink", "smite", "beady", "rusty", "retro", "droll", "gawky", "hutch", "pinto", "gaily", "egret", "lilac", "sever", "field", "fluff", "hydro", "flack", "agape", "wench", "voice", "stead", "stalk", "berth", "madam", "night", "bland", "liver", "wedge", "augur", "roomy", "wacky", "flock", "angry", "bobby", "trite", "aphid", "tryst", "midge", "power", "elope", "cinch", "motto", "stomp", "upset", "bluff", "cramp", "quart", "coyly", "youth", "rhyme", "buggy", "alien", "smear", "unfit", "patty", "cling", "glean", "label", "hunky", "khaki", "poker", "gruel", "twice", "twang", "shrug", "treat", "unlit", "waste", "merit", "woven", "octal", "needy", "clown", "widow", "irony", "ruder", "gauze", "chief", "onset", "prize", "fungi", "charm", "gully", "inter", "whoop", "taunt", "leery", "class", "theme", "lofty", "tibia", "booze", "alpha", "thyme", "eclat", "doubt", "parer", "chute", "stick", "trice", "alike", "sooth", "recap", "saint", "liege", "glory", "grate", "admit", "brisk", "soggy", "usurp", "scald", "scorn", "leave", "twine", "sting", "bough", "marsh", "sloth", "dandy", "vigor", "howdy", "enjoy", "valid", "ionic", "equal", "unset", "floor", "catch", "spade", "stein", "exist", "quirk", "denim", "grove", "spiel", "mummy", "fault", "foggy", "flout", "carry", "sneak", "libel", "waltz", "aptly", "piney", "inept", "aloud", "photo", "dream", "stale", "vomit", "ombre", "fanny", "unite", "snarl", "baker", "there", "glyph", "pooch", "hippy", "spell", "folly", "louse", "gulch", "vault", "godly", "threw", "fleet", "grave", "inane", "shock", "crave", "spite", "valve", "skimp", "claim", "rainy", "musty", "pique", "daddy", "quasi", "arise", "aging", "valet", "opium", "avert", "stuck", "recut", "mulch", "genre", "plume", "rifle", "count", "incur", "total", "wrest", "mocha", "deter", "study", "lover", "safer", "rivet", "funny", "smoke", "mound", "undue", "sedan", "pagan", "swine", "guile", "gusty", "equip", "tough", "canoe", "chaos", "covet", "human", "udder", "lunch", "blast", "stray", "manga", "melee", "lefty", "quick", "paste", "given", "octet", "risen", "groan", "leaky", "grind", "carve", "loose", "sadly", "spilt", "apple", "slack", "honey", "final", "sheen", "eerie", "minty", "slick", "derby", "wharf", "spelt", "coach", "erupt", "singe", "price", "spawn", "fairy", "jiffy", "filmy", "stack", "chose", "sleep", "ardor", "nanny", "niece", "woozy", "handy", "grace", "ditto", "stank", "cream", "usual", "diode", "valor", "angle", "ninja", "muddy", "chase", "reply", "prone", "spoil", "heart", "shade", "diner", "arson", "onion", "sleet", "dowel", "couch", "palsy", "bowel", "smile", "evoke", "creek", "lance", "eagle", "idiot", "siren", "built", "embed", "award", "dross", "annul", "goody", "frown", "patio", "laden", "humid", "elite", "lymph", "edify", "might", "reset", "visit", "gusto", "purse", "vapor", "crock", "write", "sunny", "loath", "chaff", "slide", "queer", "venom", "stamp", "sorry", "still", "acorn", "aping", "pushy", "tamer", "hater", "mania", "awoke", "brawn", "swift", "exile", "birch", "lucky", "freer", "risky", "ghost", "plier", "lunar", "winch", "snare", "nurse", "house", "borax", "nicer", "lurch", "exalt", "about", "savvy", "toxin", "tunic", "pried", "inlay", "chump", "lanky", "cress", "eater", "elude", "cycle", "kitty", "boule", "moron", "tenet", "place", "lobby", "plush", "vigil", "index", "blink", "clung", "qualm", "croup", "clink", "juicy", "stage", "decay", "nerve", "flier", "shaft", "crook", "clean", "china", "ridge", "vowel", "gnome", "snuck", "icing", "spiny", "rigor", "snail", "flown", "rabid", "prose", "thank", "poppy", "budge", "fiber", "moldy", "dowdy", "kneel", "track", "caddy", "quell", "dumpy", "paler", "swore", "rebar", "scuba", "splat", "flyer", "horny", "mason", "doing", "ozone", "amply", "molar", "ovary", "beset", "queue", "cliff", "magic", "truce", "sport", "fritz", "edict", "twirl", "verse", "llama", "eaten", "range", "whisk", "hovel", "rehab", "macaw", "sigma", "spout", "verve", "sushi", "dying", "fetid", "brain", "buddy", "thump", "scion", "candy", "chord", "basin", "march", "crowd", "arbor", "gayly", "musky", "stain", "dally", "bless", "bravo", "stung", "title", "ruler", "kiosk", "blond", "ennui", "layer", "fluid", "tatty", "score", "cutie", "zebra", "barge", "matey", "bluer", "aider", "shook", "river", "privy", "betel", "frisk", "bongo", "begun", "azure", "weave", "genie", "sound", "glove", "braid", "scope", "wryly", "rover", "assay", "ocean", "bloom", "irate", "later", "woken", "silky", "wreck", "dwelt", "slate", "smack", "solid", "amaze", "hazel", "wrist", "jolly", "globe", "flint", "rouse", "civil", "vista", "relax", "cover", "alive", "beech", "jetty", "bliss", "vocal", "often", "dolly", "eight", "joker", "since", "event", "ensue", "shunt", "diver", "poser", "worst", "sweep", "alley", "creed", "anime", "leafy", "bosom", "dunce", "stare", "pudgy", "waive", "choir", "stood", "spoke", "outgo", "delay", "bilge", "ideal", "clasp", "seize", "hotly", "laugh", "sieve", "block", "meant", "grape", "noose", "hardy", "shied", "drawl", "daisy", "putty", "strut", "burnt", "tulip", "crick", "idyll", "vixen", "furor", "geeky", "cough", "naive", "shoal", "stork", "bathe", "aunty", "check", "prime", "brass", "outer", "furry", "razor", "elect", "evict", "imply", "demur", "quota", "haven", "cavil", "swear", "crump", "dough", "gavel", "wagon", "salon", "nudge", "harem", "pitch", "sworn", "pupil", "excel", "stony", "cabin", "unzip", "queen", "trout", "polyp", "earth", "storm", "until", "taper", "enter", "child", "adopt", "minor", "fatty", "husky", "brave", "filet", "slime", "glint", "tread", "steal", "regal", "guest", "every", "murky", "share", "spore", "hoist", "buxom", "inner", "otter", "dimly", "level", "sumac", "donut", "stilt", "arena", "sheet", "scrub", "fancy", "slimy", "pearl", "silly", "porch", "dingo", "sepia", "amble", "shady", "bread", "friar", "reign", "dairy", "quill", "cross", "brood", "tuber", "shear", "posit", "blank", "villa", "shank", "piggy", "freak", "which", "among", "fecal", "shell", "would", "algae", "large", "rabbi", "agony", "amuse", "bushy", "copse", "swoon", "knife", "pouch", "ascot", "plane", "crown", "urban", "snide", "relay", "abide", "viola", "rajah", "straw", "dilly", "crash", "amass", "third", "trick", "tutor", "woody", "blurb", "grief", "disco", "where", "sassy", "beach", "sauna", "comic", "clued", "creep", "caste", "graze", "snuff", "frock", "gonad", "drunk", "prong", "lurid", "steel", "halve", "buyer", "vinyl", "utile", "smell", "adage", "worry", "tasty", "local", "trade", "finch", "ashen", "modal", "gaunt", "clove", "enact", "adorn", "roast", "speck", "sheik", "missy", "grunt", "snoop", "party", "touch", "mafia", "emcee", "array", "south", "vapid", "jelly", "skulk", "angst", "tubal", "lower", "crest", "sweat", "cyber", "adore", "tardy", "swami", "notch", "groom", "roach", "hitch", "young", "align", "ready", "frond", "strap", "puree", "realm", "venue", "swarm", "offer", "seven", "dryer", "diary", "dryly", "drank", "acrid", "heady", "theta", "junto", "pixie", "quoth", "bonus", "shalt", "penne", "amend", "datum", "build", "piano", "shelf", "lodge", "suing", "rearm", "coral", "ramen", "worth", "psalm", "infer", "overt", "mayor", "ovoid", "glide", "usage", "poise", "randy", "chuck", "prank", "fishy", "tooth", "ether", "drove", "idler", "swath", "stint", "while", "begat", "apply", "slang", "tarot", "radar", "credo", "aware", "canon", "shift", "timer", "bylaw", "serum", "three", "steak", "iliac", "shirk", "blunt", "puppy", "penal", "joist", "bunny", "shape", "beget", "wheel", "adept", "stunt", "stole", "topaz", "chore", "fluke", "afoot", "bloat", "bully", "dense", "caper", "sneer", "boxer", "jumbo", "lunge", "space", "avail", "short", "slurp", "loyal", "flirt", "pizza", "conch", "tempo", "droop", "plate", "bible", "plunk", "afoul", "savoy", "steep", "agile", "stake", "dwell", "knave", "beard", "arose", "motif", "smash", "broil", "glare", "shove", "baggy", "mammy", "swamp", "along", "rugby", "wager", "quack", "squat", "snaky", "debit", "mange", "skate", "ninth", "joust", "tramp", "spurn", "medal", "micro", "rebel", "flank", "learn", "nadir", "maple", "comfy", "remit", "gruff", "ester", "least", "mogul", "fetch", "cause", "oaken", "aglow", "meaty", "gaffe", "shyly", "racer", "prowl", "thief", "stern", "poesy", "rocky", "tweet", "waist", "spire", "grope", "havoc", "patsy", "truly", "forty", "deity", "uncle", "swish", "giver", "preen", "bevel", "lemur", "draft", "slope", "annoy", "lingo", "bleak", "ditty", "curly", "cedar", "dirge", "grown", "horde", "drool", "shuck", "crypt", "cumin", "stock", "gravy", "locus", "wider", "breed", "quite", "chafe", "cache", "blimp", "deign", "fiend", "logic", "cheap", "elide", "rigid", "false", "renal", "pence", "rowdy", "shoot", "blaze", "envoy", "posse", "brief", "never", "abort", "mouse", "mucky", "sulky", "fiery", "media", "trunk", "yeast", "clear", "skunk", "scalp", "bitty", "cider", "koala", "duvet", "segue", "creme", "super", "grill", "after", "owner", "ember", "reach", "nobly", "empty", "speed", "gipsy", "recur", "smock", "dread", "merge", "burst", "kappa", "amity", "shaky", "hover", "carol", "snort", "synod", "faint", "haunt", "flour", "chair", "detox", "shrew", "tense", "plied", "quark", "burly", "novel", "waxen", "stoic", "jerky", "blitz", "beefy", "lyric", "hussy", "towel", "quilt", "below", "bingo", "wispy", "brash", "scone", "toast", "easel", "saucy", "value", "spice", "honor", "route", "sharp", "bawdy", "radii", "skull", "phony", "issue", "lager", "swell", "urine", "gassy", "trial", "flora", "upper", "latch", "wight", "brick", "retry", "holly", "decal", "grass", "shack", "dogma", "mover", "defer", "sober", "optic", "crier", "vying", "nomad", "flute", "hippo", "shark", "drier", "obese", "bugle", "tawny", "chalk", "feast", "ruddy", "pedal", "scarf", "cruel", "bleat", "tidal", "slush", "semen", "windy", "dusty", "sally", "igloo", "nerdy", "jewel", "shone", "whale", "hymen", "abuse", "fugue", "elbow", "crumb", "pansy", "welsh", "syrup", "terse", "suave", "gamut", "swung", "drake", "freed", "afire", "shirt", "grout", "oddly", "tithe", "plaid", "dummy", "broom", "blind", "torch", "enemy", "again", "tying", "pesky", "alter", "gazer", "noble", "ethos", "bride", "extol", "decor", "hobby", "beast", "idiom", "utter", "these", "sixth", "alarm", "erase", "elegy", "spunk", "piper", "scaly", "scold", "hefty", "chick", "sooty", "canal", "whiny", "slash", "quake", "joint", "swept", "prude", "heavy", "wield", "femme", "lasso", "maize", "shale", "screw", "spree", "smoky", "whiff", "scent", "glade", "spent", "prism", "stoke", "riper", "orbit", "cocoa", "guilt", "humus", "shush", "table", "smirk", "wrong", "noisy", "alert", "shiny", "elate", "resin", "whole", "hunch", "pixel", "polar", "hotel", "sword", "cleat", "mango", "rumba", "puffy", "filly", "billy", "leash", "clout", "dance", "ovate", "facet", "chili", "paint", "liner", "curio", "salty", "audio", "snake", "fable", "cloak", "navel", "spurt", "pesto", "balmy", "flash", "unwed", "early", "churn", "weedy", "stump", "lease", "witty", "wimpy", "spoof", "saner", "blend", "salsa", "thick", "warty", "manic", "blare", "squib", "spoon", "probe", "crepe", "knack", "force", "debut", "order", "haste", "teeth", "agent", "widen", "icily", "slice", "ingot", "clash", "juror", "blood", "abode", "throw", "unity", "pivot", "slept", "troop", "spare", "sewer", "parse", "morph", "cacti", "tacky", "spool", "demon", "moody", "annex", "begin", "fuzzy", "patch", "water", "lumpy", "admin", "omega", "limit", "tabby", "macho", "aisle", "skiff", "basis", "plank", "verge", "botch", "crawl", "lousy", "slain", "cubic", "raise", "wrack", "guide", "foist", "cameo", "under", "actor", "revue", "fraud", "harpy", "scoop", "climb", "refer", "olden", "clerk", "debar", "tally", "ethic", "cairn", "tulle", "ghoul", "hilly", "crude", "apart", "scale", "older", "plain", "sperm", "briny", "abbot", "rerun", "quest", "crisp", "bound", "befit", "drawn", "suite", "itchy", "cheer", "bagel", "guess", "broad", "axiom", "chard", "caput", "leant", "harsh", "curse", "proud", "swing", "opine", "taste", "lupus", "gumbo", "miner", "green", "chasm", "lipid", "topic", "armor", "brush", "crane", "mural", "abled", "habit", "bossy", "maker", "dusky", "dizzy", "lithe", "brook", "jazzy", "fifty", "sense", "giant", "surly", "legal", "fatal", "flunk", "began", "prune", "small", "slant", "scoff", "torus", "ninny", "covey", "viper", "taken", "moral", "vogue", "owing", "token", "entry", "booth", "voter", "chide", "elfin", "ebony", "neigh", "minim", "melon", "kneed", "decoy", "voila", "ankle", "arrow", "mushy", "tribe", "cease", "eager", "birth", "graph", "odder", "terra", "weird", "tried", "clack", "color", "rough", "weigh", "uncut", "ladle", "strip", "craft", "minus", "dicey", "titan", "lucid", "vicar", "dress", "ditch", "gypsy", "pasta", "taffy", "flame", "swoop", "aloof", "sight", "broke", "teary", "chart", "sixty", "wordy", "sheer", "leper", "nosey", "bulge", "savor", "clamp", "funky", "foamy", "toxic", "brand", "plumb", "dingy", "butte", "drill", "tripe", "bicep", "tenor", "krill", "worse", "drama", "hyena", "think", "ratio", "cobra", "basil", "scrum", "bused", "phone", "court", "camel", "proof", "heard", "angel", "petal", "pouty", "throb", "maybe", "fetal", "sprig", "spine", "shout", "cadet", "macro", "dodgy", "satyr", "rarer", "binge", "trend", "nutty", "leapt", "amiss", "split", "myrrh", "width", "sonar", "tower", "baron", "fever", "waver", "spark", "belie", "sloop", "expel", "smote", "baler", "above", "north", "wafer", "scant", "frill", "awash", "snack", "scowl", "frail", "drift", "limbo", "fence", "motel", "ounce", "wreak", "revel", "talon", "prior", "knelt", "cello", "flake", "debug", "anode", "crime", "salve", "scout", "imbue", "pinky", "stave", "vague", "chock", "fight", "video", "stone", "teach", "cleft", "frost", "prawn", "booty", "twist", "apnea", "stiff", "plaza", "ledge", "tweak", "board", "grant", "medic", "bacon", "cable", "brawl", "slunk", "raspy", "forum", "drone", "women", "mucus", "boast", "toddy", "coven", "tumor", "truer", "wrath", "stall", "steam", "axial", "purer", "daily", "trail", "niche", "mealy", "juice", "nylon", "plump", "merry", "flail", "papal", "wheat", "berry", "cower", "erect", "brute", "leggy", "snipe", "sinew", "skier", "penny", "jumpy", "rally", "umbra", "scary", "modem", "gross", "avian", "greed", "satin", "tonic", "parka", "sniff", "livid", "stark", "trump", "giddy", "reuse", "taboo", "avoid", "quote", "devil", "liken", "gloss", "gayer", "beret", "noise", "gland", "dealt", "sling", "rumor", "opera", "thigh", "tonga", "flare", "wound", "white", "bulky", "etude", "horse", "circa", "paddy", "inbox", "fizzy", "grain", "exert", "surge", "gleam", "belle", "salvo", "crush", "fruit", "sappy", "taker", "tract", "ovine", "spiky", "frank", "reedy", "filth", "spasm", "heave", "mambo", "right", "clank", "trust", "lumen", "borne", "spook", "sauce", "amber", "lathe", "carat", "corer", "dirty", "slyly", "affix", "alloy", "taint", "sheep", "kinky", "wooly", "mauve", "flung", "yacht", "fried", "quail", "brunt", "grimy", "curvy", "cagey", "rinse", "deuce", "state", "grasp", "milky", "bison", "graft", "sandy", "baste", "flask", "hedge", "girly", "swash", "boney", "coupe", "endow", "abhor", "welch", "blade", "tight", "geese", "miser", "mirth", "cloud", "cabal", "leech", "close", "tenth", "pecan", "droit", "grail", "clone", "guise", "ralph", "tango", "biddy", "smith", "mower", "payee", "serif", "drape", "fifth", "spank", "glaze", "allot", "truck", "kayak", "virus", "testy", "tepee", "fully", "zonal", "metro", "curry", "grand", "banjo", "axion", "bezel", "occur", "chain", "nasal", "gooey", "filer", "brace", "allay", "pubic", "raven", "plead", "gnash", "flaky", "munch", "dully", "eking", "thing", "slink", "hurry", "theft", "shorn", "pygmy", "ranch", "wring", "lemon", "shore", "mamma", "froze", "newer", "style", "moose", "antic", "drown", "vegan", "chess", "guppy", "union", "lever", "lorry", "image", "cabby", "druid", "exact", "truth", "dopey", "spear", "cried", "chime", "crony", "stunk", "timid", "batch", "gauge", "rotor", "crack", "curve", "latte", "witch", "bunch", "repel", "anvil", "soapy", "meter", "broth", "madly", "dried", "scene", "known", "magma", "roost", "woman", "thong", "punch", "pasty", "downy", "knead", "whirl", "rapid", "clang", "anger", "drive", "goofy", "email", "music", "stuff", "bleep", "rider", "mecca", "folio", "setup", "verso", "quash", "fauna", "gummy", "happy", "newly", "fussy", "relic", "guava", "ratty", "fudge", "femur", "chirp", "forte", "alibi", "whine", "petty", "golly", "plait", "fleck", "felon", "gourd", "brown", "thrum", "ficus", "stash", "decry", "wiser", "junta", "visor", "daunt", "scree", "impel", "await", "press", "whose", "turbo", "stoop", "speak", "mangy", "eying", "inlet", "crone", "pulse", "mossy", "staid", "hence", "pinch", "teddy", "sully", "snore", "ripen", "snowy", "attic", "going", "leach", "mouth", "hound", "clump", "tonal", "bigot", "peril", "piece", "blame", "haute", "spied", "undid", "intro", "basal", "shine", "gecko", "rodeo", "guard", "steer", "loamy", "scamp", "scram", "manly", "hello", "vaunt", "organ", "feral", "knock", "extra", "condo", "adapt", "willy", "polka", "rayon", "skirt", "faith", "torso", "match", "mercy", "tepid", "sleek", "riser", "twixt", "peace", "flush", "catty", "login", "eject", "roger", "rival", "untie", "refit", "aorta", "adult", "judge", "rower", "artsy", "rural", "shave"]
152
+ // zhs*
131
153
  function apply(ctx, config) {
132
154
  // tzb*
133
155
  ctx.model.extend('wordle_game_records', {
@@ -146,6 +168,10 @@ function apply(ctx, config) {
146
168
  presentLetters: 'string',
147
169
  absentLetters: 'string',
148
170
  isHardMode: 'boolean',
171
+ remainingWordsList: 'list',
172
+ isAbsurd: 'boolean',
173
+ isChallengeMode: 'boolean',
174
+ targetWord: 'string',
149
175
  }, {
150
176
  primary: 'id',
151
177
  autoInc: true,
@@ -322,12 +348,13 @@ function apply(ctx, config) {
322
348
  await updatePlayerRecordsLose(channelId, gameInfo);
323
349
  // 结束
324
350
  await endGame(channelId);
325
- return await sendMessage(session, `【@${username}】\n由于您执行了操作:【结束】\n游戏已结束!\n${calculateGameDuration(gameInfo.timestamp, timestamp)}\n${generateGameEndMessage(gameInfo)}`);
351
+ return await sendMessage(session, `【@${username}】\n由于您执行了操作:【结束】\n游戏已结束!\n${calculateGameDuration(gameInfo.timestamp, timestamp)}${gameInfo.isAbsurd ? '' : `\n${generateGameEndMessage(gameInfo)}`}`);
326
352
  // .action
327
353
  });
328
354
  // wordleGame.开始 s* ks*
329
355
  ctx.command('wordleGame.开始 [guessWordLength:number]', '开始游戏引导')
330
356
  .option('hard', '--hard 困难模式', { fallback: false })
357
+ .option('absurd', '--absurd 变态模式', { fallback: false })
331
358
  .action(async ({ session, options }, guessWordLength = config.defaultWordLengthForGuessing) => {
332
359
  const { channelId, userId, username } = session;
333
360
  // 更新玩家记录表中的用户名
@@ -352,7 +379,7 @@ function apply(ctx, config) {
352
379
  return await sendMessage(session, `【@${username}】\n输入超时!`);
353
380
  guessWordLength = parseInt(userInput);
354
381
  }
355
- return await session.execute(`wordleGame.开始.${selectedExam}${options.hard ? ` --hard ` : ` `}${guessWordLength}`);
382
+ return await session.execute(`wordleGame.开始.${selectedExam}${options.hard ? ` --hard ` : ` `}${options.absurd ? ` --absurd ` : ` `}${guessWordLength}`);
356
383
  }
357
384
  else {
358
385
  return await sendMessage(session, `【@${username}】\n无效的输入!`);
@@ -362,6 +389,8 @@ function apply(ctx, config) {
362
389
  // wordleGame.开始.经典 jd*
363
390
  ctx.command('wordleGame.开始.经典', '开始经典猜单词游戏')
364
391
  .option('hard', '--hard 困难模式', { fallback: false })
392
+ .option('absurd', '--absurd 变态模式', { fallback: false })
393
+ .option('challenge', '--challenge 变态挑战模式', { fallback: false })
365
394
  .action(async ({ session, options }) => {
366
395
  const { channelId, userId, username, platform, timestamp } = session;
367
396
  // 更新玩家记录表中的用户名
@@ -402,17 +431,17 @@ function apply(ctx, config) {
402
431
  // const randomIndex = Math.floor(Math.random() * words.length);
403
432
  // return words[randomIndex].toLowerCase();
404
433
  // }
405
- const classicWordList = `ABACK ABASE ABATE ABBEY ABBOT ABHOR ABIDE ABLED ABODE ABORT ABOUT ABOVE ABUSE ABYSS ACORN ACRID ACTOR ACUTE ADAGE ADAPT ADEPT ADMIN ADMIT ADOBE ADOPT ADORE ADORN ADULT AFFIX AFIRE AFOOT AFOUL AFTER AGAIN AGAPE AGATE AGENT AGILE AGING AGLOW AGONY AGORA AGREE AHEAD AIDER AISLE ALARM ALBUM ALERT ALGAE ALIBI ALIEN ALIGN ALIKE ALIVE ALLAY ALLEY ALLOT ALLOW ALLOY ALOFT ALONE ALONG ALOOF ALOUD ALPHA ALTAR ALTER AMASS AMAZE AMBER AMBLE AMEND AMISS AMITY AMONG AMPLE AMPLY AMUSE ANGEL ANGER ANGLE ANGRY ANGST ANIME ANKLE ANNEX ANNOY ANNUL ANODE ANTIC ANVIL AORTA APART APHID APING APNEA APPLE APPLY APRON APTLY ARBOR ARDOR ARENA ARGUE ARISE ARMOR AROMA AROSE ARRAY ARROW ARSON ARTSY ASCOT ASHEN ASIDE ASKEW ASSAY ASSET ATOLL ATONE ATTIC AUDIO AUDIT AUGUR AUNTY AVAIL AVERT AVIAN AVOID AWAIT AWAKE AWARD AWARE AWASH AWFUL AWOKE AXIAL AXIOM AXION AZURE BACON BADGE BADLY BAGEL BAGGY BAKER BALER BALMY BANAL BANJO BARGE BARON BASAL BASIC BASIL BASIN BASIS BASTE BATCH BATHE BATON BATTY BAWDY BAYOU BEACH BEADY BEARD BEAST BEECH BEEFY BEFIT BEGAN BEGAT BEGET BEGIN BEGUN BEING BELCH BELIE BELLE BELLY BELOW BENCH BERET BERRY BERTH BESET BETEL BEVEL BEZEL BIBLE BICEP BIDDY BIGOT BILGE BILLY BINGE BINGO BIOME BIRCH BIRTH BISON BITTY BLACK BLADE BLAME BLAND BLANK BLARE BLAST BLAZE BLEAK BLEAT BLEED BLEEP BLEND BLESS BLIMP BLIND BLINK BLISS BLITZ BLOAT BLOCK BLOKE BLOND BLOOD BLOOM BLOWN BLUER BLUFF BLUNT BLURB BLURT BLUSH BOARD BOAST BOBBY BONEY BONGO BONUS BOOBY BOOST BOOTH BOOTY BOOZE BOOZY BORAX BORNE BOSOM BOSSY BOTCH BOUGH BOULE BOUND BOWEL BOXER BRACE BRAID BRAIN BRAKE BRAND BRASH BRASS BRAVE BRAVO BRAWL BRAWN BREAD BREAK BREED BRIAR BRIBE BRICK BRIDE BRIEF BRINE BRING BRINK BRINY BRISK BROAD BROIL BROKE BROOD BROOK BROOM BROTH BROWN BRUNT BRUSH BRUTE BUDDY BUDGE BUGGY BUGLE BUILD BUILT BULGE BULKY BULLY BUNCH BUNNY BURLY BURNT BURST BUSED BUSHY BUTCH BUTTE BUXOM BUYER BYLAW CABAL CABBY CABIN CABLE CACAO CACHE CACTI CADDY CADET CAGEY CAIRN CAMEL CAMEO CANAL CANDY CANNY CANOE CANON CAPER CAPUT CARAT CARGO CAROL CARRY CARVE CASTE CATCH CATER CATTY CAULK CAUSE CAVIL CEASE CEDAR CELLO CHAFE CHAFF CHAIN CHAIR CHALK CHAMP CHANT CHAOS CHARD CHARM CHART CHASE CHASM CHEAP CHEAT CHECK CHEEK CHEER CHESS CHEST CHICK CHIDE CHIEF CHILD CHILI CHILL CHIME CHINA CHIRP CHOCK CHOIR CHOKE CHORD CHORE CHOSE CHUCK CHUMP CHUNK CHURN CHUTE CIDER CIGAR CINCH CIRCA CIVIC CIVIL CLACK CLAIM CLAMP CLANG CLANK CLASH CLASP CLASS CLEAN CLEAR CLEAT CLEFT CLERK CLICK CLIFF CLIMB CLING CLINK CLOAK CLOCK CLONE CLOSE CLOTH CLOUD CLOUT CLOVE CLOWN CLUCK CLUED CLUMP CLUNG COACH COAST COBRA COCOA COLON COLOR COMET COMFY COMIC COMMA CONCH CONDO CONIC COPSE CORAL CORER CORNY COUCH COUGH COULD COUNT COUPE COURT COVEN COVER COVET COVEY COWER COYLY CRACK CRAFT CRAMP CRANE CRANK CRASH CRASS CRATE CRAVE CRAWL CRAZE CRAZY CREAK CREAM CREDO CREED CREEK CREEP CREME CREPE CREPT CRESS CREST CRICK CRIED CRIER CRIME CRIMP CRISP CROAK CROCK CRONE CRONY CROOK CROSS CROUP CROWD CROWN CRUDE CRUEL CRUMB CRUMP CRUSH CRUST CRYPT CUBIC CUMIN CURIO CURLY CURRY CURSE CURVE CURVY CUTIE CYBER CYCLE CYNIC DADDY DAILY DAIRY DAISY DALLY DANCE DANDY DATUM DAUNT DEALT DEATH DEBAR DEBIT DEBUG DEBUT DECAL DECAY DECOR DECOY DECRY DEFER DEIGN DEITY DELAY DELTA DELVE DEMON DEMUR DENIM DENSE DEPOT DEPTH DERBY DETER DETOX DEUCE DEVIL DIARY DICEY DIGIT DILLY DIMLY DINER DINGO DINGY DIODE DIRGE DIRTY DISCO DITCH DITTO DITTY DIVER DIZZY DODGE DODGY DOGMA DOING DOLLY DONOR DONUT DOPEY DOUBT DOUGH DOWDY DOWEL DOWNY DOWRY DOZEN DRAFT DRAIN DRAKE DRAMA DRANK DRAPE DRAWL DRAWN DREAD DREAM DRESS DRIED DRIER DRIFT DRILL DRINK DRIVE DROIT DROLL DRONE DROOL DROOP DROSS DROVE DROWN DRUID DRUNK DRYER DRYLY DUCHY DULLY DUMMY DUMPY DUNCE DUSKY DUSTY DUTCH DUVET DWARF DWELL DWELT DYING EAGER EAGLE EARLY EARTH EASEL EATEN EATER EBONY ECLAT EDICT EDIFY EERIE EGRET EIGHT EJECT EKING ELATE ELBOW ELDER ELECT ELEGY ELFIN ELIDE ELITE ELOPE ELUDE EMAIL EMBED EMBER EMCEE EMPTY ENACT ENDOW ENEMA ENEMY ENJOY ENNUI ENSUE ENTER ENTRY ENVOY EPOCH EPOXY EQUAL EQUIP ERASE ERECT ERODE ERROR ERUPT ESSAY ESTER ETHER ETHIC ETHOS ETUDE EVADE EVENT EVERY EVICT EVOKE EXACT EXALT EXCEL EXERT EXILE EXIST EXPEL EXTOL EXTRA EXULT EYING FABLE FACET FAINT FAIRY FAITH FALSE FANCY FANNY FARCE FATAL FATTY FAULT FAUNA FAVOR FEAST FECAL FEIGN FELLA FELON FEMME FEMUR FENCE FERAL FERRY FETAL FETCH FETID FETUS FEVER FEWER FIBER FIBRE FICUS FIELD FIEND FIERY FIFTH FIFTY FIGHT FILER FILET FILLY FILMY FILTH FINAL FINCH FINER FIRST FISHY FIXER FIZZY FJORD FLACK FLAIL FLAIR FLAKE FLAKY FLAME FLANK FLARE FLASH FLASK FLECK FLEET FLESH FLICK FLIER FLING FLINT FLIRT FLOAT FLOCK FLOOD FLOOR FLORA FLOSS FLOUR FLOUT FLOWN FLUFF FLUID FLUKE FLUME FLUNG FLUNK FLUSH FLUTE FLYER FOAMY FOCAL FOCUS FOGGY FOIST FOLIO FOLLY FORAY FORCE FORGE FORGO FORTE FORTH FORTY FORUM FOUND FOYER FRAIL FRAME FRANK FRAUD FREAK FREED FREER FRESH FRIAR FRIED FRILL FRISK FRITZ FROCK FROND FRONT FROST FROTH FROWN FROZE FRUIT FUDGE FUGUE FULLY FUNGI FUNKY FUNNY FUROR FURRY FUSSY FUZZY GAFFE GAILY GAMER GAMMA GAMUT GASSY GAUDY GAUGE GAUNT GAUZE GAVEL GAWKY GAYER GAYLY GAZER GECKO GEEKY GEESE GENIE GENRE GHOST GHOUL GIANT GIDDY GIPSY GIRLY GIRTH GIVEN GIVER GLADE GLAND GLARE GLASS GLAZE GLEAM GLEAN GLIDE GLINT GLOAT GLOBE GLOOM GLORY GLOSS GLOVE GLYPH GNASH GNOME GODLY GOING GOLEM GOLLY GONAD GONER GOODY GOOEY GOOFY GOOSE GORGE GOUGE GOURD GRACE GRADE GRAFT GRAIL GRAIN GRAND GRANT GRAPE GRAPH GRASP GRASS GRATE GRAVE GRAVY GRAZE GREAT GREED GREEN GREET GRIEF GRILL GRIME GRIMY GRIND GRIPE GROAN GROIN GROOM GROPE GROSS GROUP GROUT GROVE GROWL GROWN GRUEL GRUFF GRUNT GUARD GUAVA GUESS GUEST GUIDE GUILD GUILE GUILT GUISE GULCH GULLY GUMBO GUMMY GUPPY GUSTO GUSTY GYPSY HABIT HAIRY HALVE HANDY HAPPY HARDY HAREM HARPY HARRY HARSH HASTE HASTY HATCH HATER HAUNT HAUTE HAVEN HAVOC HAZEL HEADY HEARD HEART HEATH HEAVE HEAVY HEDGE HEFTY HEIST HELIX HELLO HENCE HERON HILLY HINGE HIPPO HIPPY HITCH HOARD HOBBY HOIST HOLLY HOMER HONEY HONOR HORDE HORNY HORSE HOTEL HOTLY HOUND HOUSE HOVEL HOVER HOWDY HUMAN HUMID HUMOR HUMPH HUMUS HUNCH HUNKY HURRY HUSKY HUSSY HUTCH HYDRO HYENA HYMEN HYPER ICILY ICING IDEAL IDIOM IDIOT IDLER IDYLL IGLOO ILIAC IMAGE IMBUE IMPEL IMPLY INANE INBOX INCUR INDEX INEPT INERT INFER INGOT INLAY INLET INNER INPUT INTER INTRO IONIC IRATE IRONY ISLET ISSUE ITCHY IVORY JAUNT JAZZY JELLY JERKY JETTY JEWEL JIFFY JOINT JOIST JOKER JOLLY JOUST JUDGE JUICE JUICY JUMBO JUMPY JUNTA JUNTO JUROR KAPPA KARMA KAYAK KEBAB KHAKI KINKY KIOSK KITTY KNACK KNAVE KNEAD KNEED KNEEL KNELT KNIFE KNOCK KNOLL KNOWN KOALA KRILL LABEL LABOR LADEN LADLE LAGER LANCE LANKY LAPEL LAPSE LARGE LARVA LASSO LATCH LATER LATHE LATTE LAUGH LAYER LEACH LEAFY LEAKY LEANT LEAPT LEARN LEASE LEASH LEAST LEAVE LEDGE LEECH LEERY LEFTY LEGAL LEGGY LEMON LEMUR LEPER LEVEL LEVER LIBEL LIEGE LIGHT LIKEN LILAC LIMBO LIMIT LINEN LINER LINGO LIPID LITHE LIVER LIVID LLAMA LOAMY LOATH LOBBY LOCAL LOCUS LODGE LOFTY LOGIC LOGIN LOOPY LOOSE LORRY LOSER LOUSE LOUSY LOVER LOWER LOWLY LOYAL LUCID LUCKY LUMEN LUMPY LUNAR LUNCH LUNGE LUPUS LURCH LURID LUSTY LYING LYMPH LYNCH LYRIC MACAW MACHO MACRO MADAM MADLY MAFIA MAGIC MAGMA MAIZE MAJOR MAKER MAMBO MAMMA MAMMY MANGA MANGE MANGO MANGY MANIA MANIC MANLY MANOR MAPLE MARCH MARRY MARSH MASON MASSE MATCH MATEY MAUVE MAXIM MAYBE MAYOR MEALY MEANT MEATY MECCA MEDAL MEDIA MEDIC MELEE MELON MERCY MERGE MERIT MERRY METAL METER METRO MICRO MIDGE MIDST MIGHT MILKY MIMIC MINCE MINER MINIM MINOR MINTY MINUS MIRTH MISER MISSY MOCHA MODAL MODEL MODEM MOGUL MOIST MOLAR MOLDY MONEY MONTH MOODY MOOSE MORAL MORON MORPH MOSSY MOTEL MOTIF MOTOR MOTTO MOULT MOUND MOUNT MOURN MOUSE MOUTH MOVER MOVIE MOWER MUCKY MUCUS MUDDY MULCH MUMMY MUNCH MURAL MURKY MUSHY MUSIC MUSKY MUSTY MYRRH NADIR NAIVE NANNY NASAL NASTY NATAL NAVAL NAVEL NEEDY NEIGH NERDY NERVE NEVER NEWER NEWLY NICER NICHE NIECE NIGHT NINJA NINNY NINTH NOBLE NOBLY NOISE NOISY NOMAD NOOSE NORTH NOSEY NOTCH NOVEL NUDGE NURSE NUTTY NYLON NYMPH OAKEN OBESE OCCUR OCEAN OCTAL OCTET ODDER ODDLY OFFAL OFFER OFTEN OLDEN OLDER OLIVE OMBRE OMEGA ONION ONSET OPERA OPINE OPIUM OPTIC ORBIT ORDER ORGAN OTHER OTTER OUGHT OUNCE OUTDO OUTER OUTGO OVARY OVATE OVERT OVINE OVOID OWING OWNER OXIDE OZONE PADDY PAGAN PAINT PALER PALSY PANEL PANIC PANSY PAPAL PAPER PARER PARKA PARRY PARSE PARTY PASTA PASTE PASTY PATCH PATIO PATSY PATTY PAUSE PAYEE PAYER PEACE PEACH PEARL PECAN PEDAL PENAL PENCE PENNE PENNY PERCH PERIL PERKY PESKY PESTO PETAL PETTY PHASE PHONE PHONY PHOTO PIANO PICKY PIECE PIETY PIGGY PILOT PINCH PINEY PINKY PINTO PIPER PIQUE PITCH PITHY PIVOT PIXEL PIXIE PIZZA PLACE PLAID PLAIN PLAIT PLANE PLANK PLANT PLATE PLAZA PLEAD PLEAT PLIED PLIER PLUCK PLUMB PLUME PLUMP PLUNK PLUSH POESY POINT POISE POKER POLAR POLKA POLYP POOCH POPPY PORCH POSER POSIT POSSE POUCH POUND POUTY POWER PRANK PRAWN PREEN PRESS PRICE PRICK PRIDE PRIED PRIME PRIMO PRINT PRIOR PRISM PRIVY PRIZE PROBE PRONE PRONG PROOF PROSE PROUD PROVE PROWL PROXY PRUDE PRUNE PSALM PUBIC PUDGY PUFFY PULPY PULSE PUNCH PUPAL PUPIL PUPPY PUREE PURER PURGE PURSE PUSHY PUTTY PYGMY QUACK QUAIL QUAKE QUALM QUARK QUART QUASH QUASI QUEEN QUEER QUELL QUERY QUEST QUEUE QUICK QUIET QUILL QUILT QUIRK QUITE QUOTA QUOTE QUOTH RABBI RABID RACER RADAR RADII RADIO RAINY RAISE RAJAH RALLY RALPH RAMEN RANCH RANDY RANGE RAPID RARER RASPY RATIO RATTY RAVEN RAYON RAZOR REACH REACT READY REALM REARM REBAR REBEL REBUS REBUT RECAP RECUR RECUT REEDY REFER REFIT REGAL REHAB REIGN RELAX RELAY RELIC REMIT RENAL RENEW REPAY REPEL REPLY RERUN RESET RESIN RETCH RETRO RETRY REUSE REVEL REVUE RHINO RHYME RIDER RIDGE RIFLE RIGHT RIGID RIGOR RINSE RIPEN RIPER RISEN RISER RISKY RIVAL RIVER RIVET ROACH ROAST ROBIN ROBOT ROCKY RODEO ROGER ROGUE ROOMY ROOST ROTOR ROUGE ROUGH ROUND ROUSE ROUTE ROVER ROWDY ROWER ROYAL RUDDY RUDER RUGBY RULER RUMBA RUMOR RUPEE RURAL RUSTY SADLY SAFER SAINT SALAD SALLY SALON SALSA SALTY SALVE SALVO SANDY SANER SAPPY SASSY SATIN SATYR SAUCE SAUCY SAUNA SAUTE SAVOR SAVOY SAVVY SCALD SCALE SCALP SCALY SCAMP SCANT SCARE SCARF SCARY SCENE SCENT SCION SCOFF SCOLD SCONE SCOOP SCOPE SCORE SCORN SCOUR SCOUT SCOWL SCRAM SCRAP SCREE SCREW SCRUB SCRUM SCUBA SEDAN SEEDY SEGUE SEIZE SEMEN SENSE SEPIA SERIF SERUM SERVE SETUP SEVEN SEVER SEWER SHACK SHADE SHADY SHAFT SHAKE SHAKY SHALE SHALL SHALT SHAME SHANK SHAPE SHARD SHARE SHARK SHARP SHAVE SHAWL SHEAR SHEEN SHEEP SHEER SHEET SHEIK SHELF SHELL SHIED SHIFT SHINE SHINY SHIRE SHIRK SHIRT SHOAL SHOCK SHONE SHOOK SHOOT SHORE SHORN SHORT SHOUT SHOVE SHOWN SHOWY SHREW SHRUB SHRUG SHUCK SHUNT SHUSH SHYLY SIEGE SIEVE SIGHT SIGMA SILKY SILLY SINCE SINEW SINGE SIREN SISSY SIXTH SIXTY SKATE SKIER SKIFF SKILL SKIMP SKIRT SKULK SKULL SKUNK SLACK SLAIN SLANG SLANT SLASH SLATE SLAVE SLEEK SLEEP SLEET SLEPT SLICE SLICK SLIDE SLIME SLIMY SLING SLINK SLOOP SLOPE SLOSH SLOTH SLUMP SLUNG SLUNK SLURP SLUSH SLYLY SMACK SMALL SMART SMASH SMEAR SMELL SMELT SMILE SMIRK SMITE SMITH SMOCK SMOKE SMOKY SMOTE SNACK SNAIL SNAKE SNAKY SNARE SNARL SNEAK SNEER SNIDE SNIFF SNIPE SNOOP SNORE SNORT SNOUT SNOWY SNUCK SNUFF SOAPY SOBER SOGGY SOLAR SOLID SOLVE SONAR SONIC SOOTH SOOTY SORRY SOUND SOUTH SOWER SPACE SPADE SPANK SPARE SPARK SPASM SPAWN SPEAK SPEAR SPECK SPEED SPELL SPELT SPEND SPENT SPERM SPICE SPICY SPIED SPIEL SPIKE SPIKY SPILL SPILT SPINE SPINY SPIRE SPITE SPLAT SPLIT SPOIL SPOKE SPOOF SPOOK SPOOL SPOON SPORE SPORT SPOUT SPRAY SPREE SPRIG SPUNK SPURN SPURT SQUAD SQUAT SQUIB STACK STAFF STAGE STAID STAIN STAIR STAKE STALE STALK STALL STAMP STAND STANK STARE STARK START STASH STATE STAVE STEAD STEAK STEAL STEAM STEED STEEL STEEP STEER STEIN STERN STICK STIFF STILL STILT STING STINK STINT STOCK STOIC STOKE STOLE STOMP STONE STONY STOOD STOOL STOOP STORE STORK STORM STORY STOUT STOVE STRAP STRAW STRAY STRIP STRUT STUCK STUDY STUFF STUMP STUNG STUNK STUNT STYLE SUAVE SUGAR SUING SUITE SULKY SULLY SUMAC SUNNY SUPER SURER SURGE SURLY SUSHI SWAMI SWAMP SWARM SWASH SWATH SWEAR SWEAT SWEEP SWEET SWELL SWEPT SWIFT SWILL SWINE SWING SWIRL SWISH SWOON SWOOP SWORD SWORE SWORN SWUNG SYNOD SYRUP TABBY TABLE TABOO TACIT TACKY TAFFY TAINT TAKEN TAKER TALLY TALON TAMER TANGO TANGY TAPER TAPIR TARDY TAROT TASTE TASTY TATTY TAUNT TAWNY TEACH TEARY TEASE TEDDY TEETH TEMPO TENET TENOR TENSE TENTH TEPEE TEPID TERRA TERSE TESTY THANK THEFT THEIR THEME THERE THESE THETA THICK THIEF THIGH THING THINK THIRD THONG THORN THOSE THREE THREW THROB THROW THRUM THUMB THUMP THYME TIARA TIBIA TIDAL TIGER TIGHT TILDE TIMER TIMID TIPSY TITAN TITHE TITLE TOAST TODAY TODDY TOKEN TONAL TONGA TONIC TOOTH TOPAZ TOPIC TORCH TORSO TORUS TOTAL TOTEM TOUCH TOUGH TOWEL TOWER TOXIC TOXIN TRACE TRACK TRACT TRADE TRAIL TRAIN TRAIT TRAMP TRASH TRAWL TREAD TREAT TREND TRIAD TRIAL TRIBE TRICE TRICK TRIED TRIPE TRITE TROLL TROOP TROPE TROUT TROVE TRUCE TRUCK TRUER TRULY TRUMP TRUNK TRUSS TRUST TRUTH TRYST TUBAL TUBER TULIP TULLE TUMOR TUNIC TURBO TUTOR TWANG TWEAK TWEED TWEET TWICE TWINE TWIRL TWIST TWIXT TYING UDDER ULCER ULTRA UMBRA UNCLE UNCUT UNDER UNDID UNDUE UNFED UNFIT UNIFY UNION UNITE UNITY UNLIT UNMET UNSET UNTIE UNTIL UNWED UNZIP UPPER UPSET URBAN URINE USAGE USHER USING USUAL USURP UTILE UTTER VAGUE VALET VALID VALOR VALUE VALVE VAPID VAPOR VAULT VAUNT VEGAN VENOM VENUE VERGE VERSE VERSO VERVE VICAR VIDEO VIGIL VIGOR VILLA VINYL VIOLA VIPER VIRAL VIRUS VISIT VISOR VISTA VITAL VIVID VIXEN VOCAL VODKA VOGUE VOICE VOILA VOMIT VOTER VOUCH VOWEL VYING WACKY WAFER WAGER WAGON WAIST WAIVE WALTZ WARTY WASTE WATCH WATER WAVER WAXEN WEARY WEAVE WEDGE WEEDY WEIGH WEIRD WELCH WELSH WENCH WHACK WHALE WHARF WHEAT WHEEL WHELP WHERE WHICH WHIFF WHILE WHINE WHINY WHIRL WHISK WHITE WHOLE WHOOP WHOSE WIDEN WIDER WIDOW WIDTH WIELD WIGHT WILLY WIMPY WINCE WINCH WINDY WISER WISPY WITCH WITTY WOKEN WOMAN WOMEN WOODY WOOER WOOLY WOOZY WORDY WORLD WORRY WORSE WORST WORTH WOULD WOUND WOVEN WRACK WRATH WREAK WRECK WREST WRING WRIST WRITE WRONG WROTE WRUNG WRYLY YACHT YEARN YEAST YIELD YOUNG YOUTH ZEBRA ZESTY ZONAL`;
406
- // 将单词列表分割为数组
407
- const wordArray = classicWordList.split(' ');
408
434
  // 随机选择一个单词并小写化
409
- const randomWord = wordArray[Math.floor(Math.random() * wordArray.length)].toLowerCase();
435
+ const randomWord = lowerCaseWordArray[Math.floor(Math.random() * lowerCaseWordArray.length)].toLowerCase();
410
436
  const isHardMode = options.hard;
437
+ const isChallengeMode = options.challenge;
438
+ const isAbsurdMode = isChallengeMode ? true : options.absurd;
411
439
  const correctLetters = new Array(5).fill('*');
440
+ const foundWord = findWord(randomWord);
412
441
  await ctx.database.set('wordle_game_records', { channelId }, {
413
442
  isStarted: true,
414
443
  wordGuess: randomWord,
415
- wordAnswerChineseDefinition: '',
444
+ wordAnswerChineseDefinition: replaceEscapeCharacters(foundWord.translation),
416
445
  remainingGuessesCount: 6,
417
446
  guessWordLength: 5,
418
447
  gameMode: '经典',
@@ -421,12 +450,15 @@ function apply(ctx, config) {
421
450
  correctLetters: correctLetters,
422
451
  presentLetters: '',
423
452
  absentLetters: '',
453
+ isAbsurd: isAbsurdMode,
454
+ isChallengeMode: isChallengeMode,
455
+ targetWord: randomWord,
424
456
  });
425
457
  // 游戏图
426
- const emptyGridHtml = generateEmptyGridHtml(6, 5);
458
+ const emptyGridHtml = isAbsurdMode ? generateEmptyGridHtml(1, 5) : generateEmptyGridHtml(6, 5);
427
459
  const styledHtml = generateStyledHtml(6);
428
460
  const imageBuffer = await generateImage(styledHtml, emptyGridHtml);
429
- return await sendMessage(session, `游戏开始!\n当前游戏模式为:【经典${isHardMode ? '(困难)' : ''}】\n单词长度为:【5】\n猜单词机会为:【6】\n待猜单词数量为:【2315】${config.enableWordGuessTimeLimit ? `\n作答时间为:【${config.wordGuessTimeLimitInSeconds}】秒` : ''}\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}`);
461
+ return await sendMessage(session, `游戏开始!\n当前游戏模式为:【经典${isHardMode ? '(困难)' : ''}${isAbsurdMode ? `(变态${isChallengeMode ? '挑战' : ''})` : ''}】${isChallengeMode ? `\n目标单词为:【${randomWord}】` : ''}\n单词长度为:【5】\n猜单词机会为:【${isAbsurdMode ? '♾️' : '6'}】\n待猜单词数量为:【2315】${config.enableWordGuessTimeLimit ? `\n作答时间为:【${config.wordGuessTimeLimitInSeconds}】秒` : ''}\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}`);
430
462
  // .action
431
463
  });
432
464
  const exams = [
@@ -438,6 +470,8 @@ function apply(ctx, config) {
438
470
  // 10* fjd*
439
471
  ctx.command(`wordleGame.开始.${exam} [guessWordLength:number]`, `开始猜${exam}单词游戏`)
440
472
  .option('hard', '--hard 困难模式', { fallback: false })
473
+ .option('absurd', '--absurd 变态模式', { fallback: false })
474
+ .option('challenge', '--challenge 变态挑战模式', { fallback: false })
441
475
  .action(async ({ session, options }, guessWordLength = config.defaultWordLengthForGuessing) => {
442
476
  return startWordleGame(exam, guessWordLength, session, options);
443
477
  });
@@ -448,7 +482,7 @@ function apply(ctx, config) {
448
482
  .action(async ({ session }, inputWord) => {
449
483
  const { channelId, userId, username, platform, timestamp } = session;
450
484
  // 游戏状态
451
- const gameInfo = await getGameInfo(channelId);
485
+ let gameInfo = await getGameInfo(channelId);
452
486
  // 操作太快
453
487
  if (gameInfo.isRunning === true) {
454
488
  return await sendMessage(session, `【@${username}】\n操作太快了哦~\n再试一次吧!`);
@@ -466,7 +500,7 @@ function apply(ctx, config) {
466
500
  if (config.enableWordGuessTimeLimit) {
467
501
  if (timeDifferenceInSeconds > config.wordGuessTimeLimitInSeconds) {
468
502
  // 生成 html 字符串
469
- const emptyGridHtml = generateEmptyGridHtml(gameInfo.remainingGuessesCount, gameInfo.guessWordLength);
503
+ const emptyGridHtml = gameInfo.isAbsurd ? generateEmptyGridHtml(1, gameInfo.guessWordLength) : generateEmptyGridHtml(gameInfo.remainingGuessesCount, gameInfo.guessWordLength);
470
504
  const styledHtml = generateStyledHtml(gameInfo.guessWordLength + 1);
471
505
  // 图
472
506
  const imageBuffer = await generateImage(styledHtml, `${gameInfo.wordGuessHtmlCache}\n${emptyGridHtml}`);
@@ -490,7 +524,7 @@ function apply(ctx, config) {
490
524
  await ctx.database.create('wordle_gaming_player_records', { channelId, userId, username, money: 0 });
491
525
  }
492
526
  }
493
- const { correctLetters, presentLetters, isHardMode, absentLetters } = gameInfo;
527
+ const { correctLetters, presentLetters, isHardMode, absentLetters, isAbsurd, remainingWordsList, gameMode, guessWordLength, isChallengeMode, targetWord, } = gameInfo;
494
528
  // 判断输入
495
529
  if (!/^[a-zA-Z]+$/.test(inputWord)) {
496
530
  await setGuessRunningStatus(channelId, false);
@@ -504,54 +538,119 @@ function apply(ctx, config) {
504
538
  const progressMessage = `当前${calculateGameDuration(gameInfo.timestamp, timestamp)}\n当前进度:【${correctLetters.join('')}】${presentLettersWithoutAsterisk.length === 0 ? `` : `\n包含字母:【${presentLettersWithoutAsterisk}】`}${absentLetters.length === 0 ? '' : `\n不包含字母:【${absentLetters}】`}`;
505
539
  return await sendMessage(session, `${usernameMention}\n${inputLengthMessage}\n${progressMessage}`);
506
540
  }
541
+ // 是否存在该单词
507
542
  // 小写化
508
543
  const lowercaseInputWord = inputWord.toLowerCase();
544
+ const foundWord = findWord(lowercaseInputWord);
545
+ if (!foundWord) {
546
+ await setGuessRunningStatus(channelId, false);
547
+ return await sendMessage(session, `【@${username}】\n你确定存在这样的单词吗?`);
548
+ }
549
+ // 初始化输
550
+ let isLose = false;
551
+ // 变态模式
552
+ if (isAbsurd) {
553
+ let wordsList;
554
+ if (remainingWordsList.length === 0) {
555
+ if (gameMode === '经典') {
556
+ wordsList = lowerCaseWordArray;
557
+ }
558
+ else {
559
+ const fileData = getJsonFilePathAndWordCountByLength(gameMode, guessWordLength);
560
+ if (gameMode === "ALL") {
561
+ const jsonData = JSON.parse(fs.readFileSync(fileData.filePath, 'utf-8'));
562
+ wordsList = extractLowerCaseWords(jsonData);
563
+ }
564
+ else {
565
+ const jsonData = JSON.parse(fs.readFileSync(fileData.filePath, 'utf-8'));
566
+ wordsList = Object.keys(jsonData).map(word => word.toLowerCase());
567
+ }
568
+ }
569
+ }
570
+ else {
571
+ wordsList = remainingWordsList;
572
+ }
573
+ let longestRemainingWordList = await findLongestMatchedWords(wordsList, lowercaseInputWord, targetWord, isChallengeMode);
574
+ while (isChallengeMode && wordsList.includes(targetWord) && longestRemainingWordList.length === 1 && longestRemainingWordList[0] !== targetWord) {
575
+ longestRemainingWordList = await findLongestMatchedWords(wordsList, lowercaseInputWord, targetWord, isChallengeMode);
576
+ }
577
+ // 变态挑战模式
578
+ if (isChallengeMode) {
579
+ isLose = !longestRemainingWordList.includes(targetWord);
580
+ }
581
+ let randomWord = longestRemainingWordList[Math.floor(Math.random() * longestRemainingWordList.length)];
582
+ const foundWord = findWord(randomWord);
583
+ if (isLose && isChallengeMode) {
584
+ // 生成 html 字符串
585
+ const letterTilesHtml = '<div class="Row-module_row__pwpBq">' + await generateLetterTilesHtml(foundWord.word.toLowerCase(), inputWord, channelId) + '</div>';
586
+ const emptyGridHtml = isAbsurd ? generateEmptyGridHtml(1, gameInfo.guessWordLength) : generateEmptyGridHtml(gameInfo.remainingGuessesCount - 1, gameInfo.guessWordLength);
587
+ const styledHtml = generateStyledHtml(gameInfo.guessWordLength + 1);
588
+ // 图
589
+ const imageBuffer = await generateImage(styledHtml, `${gameInfo.wordGuessHtmlCache}${letterTilesHtml}`);
590
+ await sendMessage(session, `【@${username}】\n目标单词为:【${targetWord}】\n它不再是可能的秘密单词!\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}\n您可选择的操作有:【撤销】和【结束】\n【撤销】:回到上一步。\n\n注意:无效输入将自动选择【撤销】操作。`);
591
+ let userInput = await session.prompt();
592
+ // 生成 html 字符串
593
+ // 图
594
+ const imageBuffer2 = await generateImage(styledHtml, `${gameInfo.wordGuessHtmlCache}\n${emptyGridHtml}`);
595
+ if (!userInput) {
596
+ await setGuessRunningStatus(channelId, false);
597
+ return await sendMessage(session, `【@${username}】\n输入超时!\n已自动选择【撤销】操作。\n${koishi_1.h.image(imageBuffer2, `image/${config.imageType}`)}`);
598
+ }
599
+ if (userInput === '结束') {
600
+ await session.execute(`wordleGame.结束`);
601
+ return;
602
+ }
603
+ else {
604
+ await setGuessRunningStatus(channelId, false);
605
+ return await sendMessage(session, `【@${username}】\n您执行了操作:【撤销】\n撤销成功!挑战继续!\n${koishi_1.h.image(imageBuffer2, `image/${config.imageType}`)}`);
606
+ }
607
+ }
608
+ await ctx.database.set('wordle_game_records', { channelId }, {
609
+ remainingWordsList: longestRemainingWordList,
610
+ wordGuess: foundWord.word.toLowerCase(),
611
+ wordAnswerChineseDefinition: replaceEscapeCharacters(foundWord.translation),
612
+ });
613
+ gameInfo = await getGameInfo(channelId);
614
+ }
509
615
  // 困难模式
510
- let isInputWordWrong = false;
511
- if (isHardMode && (correctLetters.some(letter => letter !== '*') || presentLetters.length !== 0)) {
616
+ if (isHardMode) {
617
+ let isInputWordWrong = false;
512
618
  // 包含
513
- const lettersInUserInput = lowercaseInputWord.split('').filter(letter => presentLetters.includes(letter) && letter !== '*');
514
- if (mergeSameLetters(lettersInUserInput).length !== presentLetters.length) {
619
+ const containsAllLetters = lowercaseInputWord.split('').filter(letter => presentLetters.includes(letter) && letter !== '*');
620
+ if (mergeSameLetters(containsAllLetters).length !== presentLetters.length && presentLetters.length !== 0) {
621
+ isInputWordWrong = true;
622
+ }
623
+ // 不包含
624
+ if (absentLetters.length !== 0 && lowercaseInputWord.split('').some(letter => absentLetters.includes(letter))) {
515
625
  isInputWordWrong = true;
516
626
  }
517
627
  // 正确
518
628
  for (let i = 0; i < lowercaseInputWord.length; i++) {
519
- if (correctLetters[i] !== '*' && correctLetters[i] !== lowercaseInputWord[i]) {
629
+ if (correctLetters[i] !== '*' && correctLetters[i] !== lowercaseInputWord[i] && correctLetters.some(letter => letter !== '*')) {
520
630
  isInputWordWrong = true;
631
+ break;
521
632
  }
522
633
  }
523
634
  if (isInputWordWrong) {
524
635
  await setGuessRunningStatus(channelId, false);
525
- return await sendMessage(session, `【@${username}】\n当前难度为:【困难】\n【困难】:后续猜单词需要使用之前正确或出现的字母。\n您输入的单词字母不符合要求!\n您的输入为:【${inputWord}】\n单词字母要求:【${correctLetters.join('')}】${presentLetters.length === 0 ? `` : `\n包含字母:【${presentLetters}】`}`);
636
+ return await sendMessage(session, `【@${username}】\n当前难度为:【困难】\n【困难】:后续猜单词需要使用之前正确或出现的字母。\n您输入的单词字母不符合要求!\n您的输入为:【${inputWord}】\n单词字母要求:【${correctLetters.join('')}】${presentLetters.length === 0 ? `` : `\n包含字母:【${presentLetters}】`}${absentLetters.length === 0 ? `` : `\n不包含字母:【${absentLetters}】`}`);
526
637
  }
527
638
  }
528
- // 是否存在该单词
529
- const fileData = getJsonFilePathAndWordCountByLength('ALL', gameInfo.guessWordLength);
530
- const jsonData = JSON.parse(fs.readFileSync(fileData.filePath, 'utf-8'));
531
639
  // 判断胜
532
640
  let isWin = false;
533
641
  if (lowercaseInputWord === gameInfo.wordGuess) {
534
642
  isWin = true;
535
643
  }
536
- else {
537
- // 寻找
538
- const foundWord = jsonData.find((entry) => entry.word.toLowerCase() === lowercaseInputWord);
539
- if (!foundWord) {
540
- await setGuessRunningStatus(channelId, false);
541
- return await sendMessage(session, `【@${username}】\n你确定存在这样的单词吗?`);
542
- }
644
+ // 判断负
645
+ if (gameInfo.remainingGuessesCount - 1 === 0 && !isAbsurd) {
646
+ isLose = true;
543
647
  }
544
648
  // 生成 html 字符串
545
649
  const letterTilesHtml = '<div class="Row-module_row__pwpBq">' + await generateLetterTilesHtml(gameInfo.wordGuess, inputWord, channelId) + '</div>';
546
- const emptyGridHtml = generateEmptyGridHtml(gameInfo.remainingGuessesCount - 1, gameInfo.guessWordLength);
650
+ const emptyGridHtml = isAbsurd ? generateEmptyGridHtml(isWin ? 0 : 1, gameInfo.guessWordLength) : generateEmptyGridHtml(gameInfo.remainingGuessesCount - 1, gameInfo.guessWordLength);
547
651
  const styledHtml = generateStyledHtml(gameInfo.guessWordLength + 1);
548
652
  // 图
549
653
  const imageBuffer = await generateImage(styledHtml, `${gameInfo.wordGuessHtmlCache}${letterTilesHtml}\n${emptyGridHtml}`);
550
- // 判断负
551
- let isLose = false;
552
- if (gameInfo.remainingGuessesCount - 1 === 0) {
553
- isLose = true;
554
- }
555
654
  // 更新游戏记录
556
655
  await ctx.database.set('wordle_game_records', { channelId }, {
557
656
  remainingGuessesCount: gameInfo.remainingGuessesCount - 1,
@@ -584,7 +683,7 @@ function apply(ctx, config) {
584
683
  // 玩家记录输
585
684
  await updatePlayerRecordsLose(channelId, gameInfo);
586
685
  await endGame(channelId);
587
- return await sendMessage(session, `很遗憾,你们没有猜出来!\n但没关系~下次加油哇!\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}\n${calculateGameDuration(gameInfo.timestamp, timestamp)}\n答案是:【${gameInfo.wordGuess}】${gameInfo.wordAnswerChineseDefinition !== '' ? `\n单词释义如下:\n${gameInfo.wordAnswerChineseDefinition}` : ''}`);
686
+ return await sendMessage(session, `很遗憾,你们没有猜出来!${isChallengeMode ? `\n目标单词为:【${targetWord}】\n它不再是可能的秘密单词!` : ''}\n但没关系~下次加油哇!\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}\n${calculateGameDuration(gameInfo.timestamp, timestamp)}${isChallengeMode ? '' : `\n答案是:【${gameInfo.wordGuess}】${gameInfo.wordAnswerChineseDefinition !== '' ? `\n单词释义如下:\n${gameInfo.wordAnswerChineseDefinition}` : ''}`}`);
588
687
  }
589
688
  // 继续
590
689
  await setGuessRunningStatus(channelId, false);
@@ -637,16 +736,12 @@ ${generateStatsInfo(stats, fastestGuessTime)}
637
736
  if (!/^[a-zA-Z]+$/.test(targetWord)) {
638
737
  return await sendMessage(session, `【@${username}】\n输入包含非字母字符,请重新输入!`);
639
738
  }
640
- const fileData = getJsonFilePathAndWordCountByLength('ALL', targetWord.length);
641
- const jsonData = JSON.parse(fs.readFileSync(fileData.filePath, 'utf-8'));
642
- // 小写化
643
- const lowercaseTargetWord = targetWord.toLowerCase();
644
739
  // 寻找
645
- const foundWord = jsonData.find((entry) => entry.word.toLowerCase() === lowercaseTargetWord);
740
+ const foundWord = findWord(targetWord);
646
741
  if (!foundWord) {
647
742
  return await sendMessage(session, `【@${username}】\n未在ALL词库中找到该单词。`);
648
743
  }
649
- return sendMessage(session, `查询对象:【${targetWord}】\n单词释义如下:\n${foundWord.translation.replace(/\\r/g, '\r').replace(/\\n/g, '\n')}`);
744
+ return sendMessage(session, `查询对象:【${targetWord}】\n单词释义如下:\n${replaceEscapeCharacters(foundWord.translation)}`);
650
745
  });
651
746
  // wordleGame.查询进度 jd* cxjd*
652
747
  ctx.command('wordleGame.查询进度', '查询当前游戏进度')
@@ -660,12 +755,12 @@ ${generateStatsInfo(stats, fastestGuessTime)}
660
755
  return await sendMessage(session, `【@${username}】\n游戏还没开始呢~\n开始后再来查询进度吧!`);
661
756
  }
662
757
  // 返回信息
663
- const { correctLetters, presentLetters, isHardMode, gameMode, guessWordLength, absentLetters } = gameInfo;
758
+ const { correctLetters, presentLetters, isHardMode, gameMode, guessWordLength, absentLetters, isAbsurd, isChallengeMode, targetWord } = gameInfo;
664
759
  const usernameMention = `【@${username}】`;
665
760
  const inputLengthMessage = `待猜单词的长度为:【${guessWordLength}】`;
666
761
  const progressMessage = `当前${calculateGameDuration(gameInfo.timestamp, timestamp)}\n当前进度:【${correctLetters.join('')}】${presentLetters.length === 0 ? '' : `\n包含字母:【${presentLetters}】`}${absentLetters.length === 0 ? '' : `\n不包含字母:【${absentLetters}】`}`;
667
762
  const timeDifferenceInSeconds = (timestamp - gameInfo.timestamp) / 1000;
668
- let message = `${usernameMention}\n当前游戏模式为:【${gameMode}${isHardMode ? '(困难)' : ''}】`;
763
+ let message = `${usernameMention}\n当前游戏模式为:【经典${isHardMode ? '(困难)' : ''}${isAbsurd ? `(变态${isChallengeMode ? '挑战' : ''})` : ''}】${isChallengeMode ? `\n目标单词为:【${targetWord}】` : ''}`;
669
764
  if (config.enableWordGuessTimeLimit) {
670
765
  message += `\n剩余作答时间:【${timeDifferenceInSeconds}】秒`;
671
766
  }
@@ -951,6 +1046,8 @@ ${rankType3.map((type, index) => `${index + 1}. ${type}`).join('\n')}
951
1046
  }
952
1047
  async function setWordleGameRecord(channelId, guessWordLength, result, gameMode, timestamp, options) {
953
1048
  const isHardMode = options.hard;
1049
+ const isChallengeMode = options.challenge;
1050
+ const isAbsurdMode = isChallengeMode ? true : options.absurd;
954
1051
  const correctLetters = new Array(guessWordLength).fill('*');
955
1052
  await ctx.database.set('wordle_game_records', { channelId }, {
956
1053
  isStarted: true,
@@ -961,9 +1058,12 @@ ${rankType3.map((type, index) => `${index + 1}. ${type}`).join('\n')}
961
1058
  gameMode: gameMode,
962
1059
  timestamp: timestamp,
963
1060
  isHardMode: isHardMode,
1061
+ isAbsurd: isAbsurdMode,
964
1062
  correctLetters: correctLetters,
965
1063
  presentLetters: '',
966
1064
  absentLetters: '',
1065
+ isChallengeMode: isChallengeMode,
1066
+ targetWord: result.word,
967
1067
  });
968
1068
  }
969
1069
  async function generateImage(styledHtml, gridHtml) {
@@ -1080,16 +1180,94 @@ ${rankType3.map((type, index) => `${index + 1}. ${type}`).join('\n')}
1080
1180
  const result = getRandomWordTranslation(command, guessWordLength);
1081
1181
  await setWordleGameRecord(channelId, guessWordLength, result, command, timestamp, options);
1082
1182
  // 生成并发送游戏图
1083
- const emptyGridHtml = generateEmptyGridHtml(guessWordLength + 1, guessWordLength);
1183
+ const isHardMode = options.hard;
1184
+ const isChallengeMode = options.challenge;
1185
+ const isAbsurdMode = isChallengeMode ? true : options.absurd;
1186
+ const emptyGridHtml = isAbsurdMode ? generateEmptyGridHtml(1, guessWordLength) : generateEmptyGridHtml(guessWordLength + 1, guessWordLength);
1084
1187
  const styledHtml = generateStyledHtml(guessWordLength + 1);
1085
1188
  const imageBuffer = await generateImage(styledHtml, emptyGridHtml);
1086
- const isHardMode = options.hard;
1087
- return await sendMessage(session, `游戏开始!\n当前游戏模式为:【${command}${isHardMode ? '(困难)' : ''}】\n单词长度为:【${guessWordLength}】\n猜单词机会为:【${guessWordLength + 1}】\n待猜单词数量为:【${result.wordCount}】${config.enableWordGuessTimeLimit ? `\n作答时间为:【${config.wordGuessTimeLimitInSeconds}】秒` : ''}\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}`);
1189
+ return await sendMessage(session, `游戏开始!\n当前游戏模式为:【${command}${isHardMode ? '(困难)' : ''}${isAbsurdMode ? `(变态${isChallengeMode ? '挑战' : ''})` : ''}】${isChallengeMode ? `\n目标单词为:【${result.word}】` : ''}\n单词长度为:【${guessWordLength}】\n猜单词机会为:【${isAbsurdMode ? '♾️' : guessWordLength + 1}】\n待猜单词数量为:【${result.wordCount}】${config.enableWordGuessTimeLimit ? `\n作答时间为:【${config.wordGuessTimeLimitInSeconds}】秒` : ''}\n${koishi_1.h.image(imageBuffer, `image/${config.imageType}`)}`);
1088
1190
  }
1089
1191
  // apply
1090
1192
  }
1091
1193
  exports.apply = apply;
1092
1194
  // hs*
1195
+ function extractLowerCaseWords(arr) {
1196
+ return arr.map(item => item.word.toLowerCase());
1197
+ }
1198
+ function replaceEscapeCharacters(input) {
1199
+ return input.replace(/\\r/g, '\r').replace(/\\n/g, '\n');
1200
+ }
1201
+ function combineWord(letters) {
1202
+ return letters.reduce((word, { letter }) => word + letter, '');
1203
+ }
1204
+ function findWord(targetWord) {
1205
+ const fileData = getJsonFilePathAndWordCountByLength('ALL', targetWord.length);
1206
+ const jsonData = JSON.parse(fs.readFileSync(fileData.filePath, 'utf-8'));
1207
+ // 小写化
1208
+ const lowercaseTargetWord = targetWord.toLowerCase();
1209
+ // 寻找
1210
+ return jsonData.find((entry) => entry.word.toLowerCase() === lowercaseTargetWord);
1211
+ }
1212
+ async function findLongestMatchedWords(wordsList, lowercaseInputWord, targetWord, isChallengeMode) {
1213
+ const results = await Promise.all(wordsList.map(word => processWordAndMatch(lowercaseInputWord, word, wordsList)));
1214
+ const maxLength = Math.max(...results.map(result => result.matchedWords.length));
1215
+ let longestMatchedWords = results.filter(result => result.matchedWords.length === maxLength).map(result => result.matchedWords);
1216
+ if (isChallengeMode) {
1217
+ longestMatchedWords = longestMatchedWords.filter(words => words.includes(targetWord));
1218
+ }
1219
+ const randomIndex = Math.floor(Math.random() * longestMatchedWords.length);
1220
+ return longestMatchedWords[randomIndex];
1221
+ }
1222
+ function processWordAndMatch(lowercaseInputWord, word, wordsList) {
1223
+ const bucket = processWord(lowercaseInputWord, word);
1224
+ const matchedWordsList = matchWordsList(bucket, word, wordsList);
1225
+ return { matchedWords: matchedWordsList, length: matchedWordsList.length };
1226
+ }
1227
+ function matchWordsList(bucket, word, wordsList) {
1228
+ return wordsList.filter(candidateWord => isMatch(candidateWord, bucket));
1229
+ }
1230
+ function isMatch(word, bucket) {
1231
+ for (let i = 0; i < bucket.length; i++) {
1232
+ const bucketState = bucket[i].state;
1233
+ const bucketLetter = bucket[i].letter;
1234
+ const wordLetter = word[i];
1235
+ if (bucketState === 'correct' && wordLetter !== bucketLetter) {
1236
+ return false;
1237
+ }
1238
+ if (bucketState === 'absent' && word.includes(bucketLetter)) {
1239
+ return false;
1240
+ }
1241
+ if (bucketState === 'present' && (wordLetter === bucketLetter || !word.includes(bucketLetter))) {
1242
+ return false;
1243
+ }
1244
+ }
1245
+ return true;
1246
+ }
1247
+ function processWord(userInputWord, word) {
1248
+ const bucket = [];
1249
+ const wordArray = new Array(26).fill(0);
1250
+ for (let i = 0; i < word.length; i++) {
1251
+ const letter = word[i];
1252
+ wordArray[letter.charCodeAt(0) - 97]++;
1253
+ const userLetter = userInputWord[i];
1254
+ bucket.push({ letter: userLetter, state: userLetter === letter ? 'correct' : 'undefined' });
1255
+ }
1256
+ for (let i = 0; i < userInputWord.length; i++) {
1257
+ const currentBucket = bucket[i];
1258
+ if (currentBucket.state !== 'correct') {
1259
+ const letterIndex = currentBucket.letter.charCodeAt(0) - 97;
1260
+ if (wordArray[letterIndex] > 0) {
1261
+ currentBucket.state = 'present';
1262
+ wordArray[letterIndex]--;
1263
+ }
1264
+ else {
1265
+ currentBucket.state = 'absent';
1266
+ }
1267
+ }
1268
+ }
1269
+ return bucket;
1270
+ }
1093
1271
  function generateStatsInfo(stats, fastestGuessTime) {
1094
1272
  const gameTypes = [
1095
1273
  '经典',
@@ -1,4 +1,8 @@
1
1
  [
2
+ {
3
+ "word": "sickbays",
4
+ "translation": "n. 保健室\\n[网络] 医务室;病室;医疗室"
5
+ },
2
6
  {
3
7
  "word": "unexpect",
4
8
  "translation": "[网络] 意想不到;使意外"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "koishi-plugin-wordle-game",
3
- "description": "欢迎来到 Wordle 猜单词小游戏,包含经典模式、多种词库(CET4、CET6、考研等)模式、多种游戏设置和排行榜系统。",
4
- "version": "1.2.5",
3
+ "description": "欢迎来到 Wordle 猜单词小游戏,包含多种模式、多种词库、多种游戏设置和排行榜系统。",
4
+ "version": "1.2.7",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
package/readme.md CHANGED
@@ -80,12 +80,26 @@ npm install koishi-plugin-wordle-game
80
80
 
81
81
  ### 游戏模式
82
82
 
83
- - `wordleGame.开始 [guessWordLength:number]` - 开始游戏引导,可选参数为猜单词的长度。
84
- - `wordleGame.开始.经典` - 开始经典猜单词游戏,需要投入货币,赢了有奖励。
85
- - `--hard` - 指令的选项,困难模式,后续猜单词必须使用前面正确或出现的字母。
86
- - `wordleGame.开始.CET4/6/GMAT/GRE/IELTS/SAT/TOEFL/考研/专八/专四/ALL [guessWordLength:number]` -
87
- 开始猜不同考试/类别的单词游戏,可选参数为猜单词的长度。
88
- - `--hard` - 指令的选项,困难模式,后续猜单词必须使用前面正确或出现的字母。
83
+ - `wordleGame.开始 [guessWordLength:number]`
84
+ - 开始游戏引导,可选参数为猜单词的长度。
85
+
86
+ - `wordleGame.开始.经典`
87
+ - 开始经典猜单词游戏,需要投入货币,赢了有奖励。
88
+
89
+ - `wordleGame.开始.CET4/6/GMAT/GRE/IELTS/SAT/TOEFL/考研/专八/专四/ALL [guessWordLength:number]`
90
+ - 开始猜不同考试/类别的单词游戏,可选参数为猜单词的长度。
91
+ - `--hard`
92
+ - 困难模式,所有透露的信息必须在以后的猜测中使用。
93
+ - `--absurd`
94
+ - 荒谬/变态模式,AI将尽量避免给出答案,每次猜测时都会尽可能少地透露信息,甚至可能更换秘密词。
95
+ - 在这种模式下,你将面对一个极具挑战性的对手。
96
+ - [如何玩?](https://qntm.org/absurdle)
97
+ - `--challenge`
98
+ - 荒谬/变态挑战模式,要求你从一个给定的目标词出发,通过某种方式使其变成秘密词。
99
+ - 仅建议高级玩家尝试。
100
+ - [如何玩?](https://qntm.org/challenge)
101
+
102
+ > Tip:可以同时启用困难模式和变态模式,且经典模式也同样适用。
89
103
 
90
104
  ### 游戏操作
91
105
 
@@ -108,7 +122,9 @@ npm install koishi-plugin-wordle-game
108
122
  - [koishi-plugin-wordle](https://www.npmjs.com/package/koishi-plugin-wordle) - Wordle 经典模式词典
109
123
  - [nonebot-plugin-wordle](https://github.com/noneplugin/nonebot-plugin-wordle) - Nonebot Wordle 的词典
110
124
  - [skywind3000/ECDICT](https://github.com/skywind3000/ECDICT) - 英汉语词典数据库
111
- - [Wordle 2315 words list](https://gist.github.com/DevilXD/6ad6cc1fe37872d069a795edd51233b2#file-wordle_words-txt) - 经典 Wordle 的单词列表
125
+ - [Wordle 2315 words list](https://gist.github.com/DevilXD/6ad6cc1fe37872d069a795edd51233b2#file-wordle_words-txt) - 经典
126
+ Wordle 的单词列表
127
+
112
128
  ## ✨ License
113
129
 
114
130
  MIT License © 2024