这是为您生成的简易成语接龙脚本HTML代码,它是一款可直接运行的网页工具,能帮助您理解成语接龙的核心逻辑。

<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">简易成语接龙 · 小脚本</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
background: linear-gradient(145deg, #f7f3e9 0%, #e8e0d0 100%);
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
font-family: 'Segoe UI', '华文楷体', 'KaiTi', 'Microsoft YaHei', sans-serif;
padding: 16px;
}
.container {
max-width: 600px;
width: 100%;
background: #fff8f0;
padding: 28px 24px 34px;
border-radius: 48px 48px 32px 32px;
box-shadow: 0 20px 40px -12px rgba(0,0,0,0.3), 0 4px 12px rgba(0,0,0,0.08);
border: 1px solid #e9dccc;
transition: 0.2s;
}
h1 {
font-size: 2rem;
font-weight: 500;
letter-spacing: 4px;
color: #4f3e2e;
text-align: center;
margin-bottom: 8px;
border-bottom: 2px dashed #dacbbc;
padding-bottom: 12px;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
}
h1 small {
font-size: 0.9rem;
font-weight: 300;
color: #7a6854;
letter-spacing: 1px;
}
.display-area {
background: #fcf6ed;
border-radius: 36px;
padding: 20px 20px 22px;
margin: 12px 0 18px;
box-shadow: inset 0 4px 8px rgba(90, 70, 50, 0.06), 0 2px 4px rgba(0,0,0,0.02);
border: 1px solid #e6d8c6;
}
.chain-box {
background: #ffffffd9;
min-height: 4.2rem;
padding: 14px 18px;
border-radius: 30px;
border: 1px solid #ded1be;
box-shadow: inset 0 2px 6px #0000000a;
margin-bottom: 18px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 6px 8px;
}
.idiom-tag {
background: #dac2a7;
color: #2a221b;
padding: 6px 16px;
border-radius: 40px;
font-size: 1.2rem;
font-weight: 500;
letter-spacing: 1px;
box-shadow: 0 2px 4px rgba(0,0,0,0.05);
display: inline-block;
border: 1px solid #c7b096;
}
.chain-arrow {
font-size: 1.4rem;
color: #8f7a62;
margin: 0 2px;
font-weight: 300;
}
.placeholder-hint {
color: #9b8a78;
font-size: 1rem;
font-weight: 300;
letter-spacing: 1px;
display: flex;
align-items: center;
gap: 4px;
}
.action-bar {
display: flex;
flex-wrap: wrap;
gap: 12px;
justify-content: center;
margin: 18px 0 8px;
}
.input-group {
flex: 2;
min-width: 180px;
display: flex;
background: white;
border-radius: 60px;
border: 1px solid #dacbbc;
overflow: hidden;
transition: 0.2s;
}
.input-group:focus-within {
border-color: #b4a086;
box-shadow: 0 0 0 3px #e3d2bf60;
}
#idiomInput {
flex: 1;
padding: 12px 18px;
border: none;
background: transparent;
font-size: 1.1rem;
font-family: inherit;
outline: none;
color: #2f281f;
}
#idiomInput::placeholder {
color: #b9aa98;
font-weight: 300;
letter-spacing: 1px;
}
.input-group button {
background: #dac2a7;
border: none;
color: #2d241b;
padding: 0 20px;
font-size: 1.2rem;
cursor: pointer;
transition: 0.15s;
font-weight: 500;
border-left: 1px solid #c7b096;
letter-spacing: 2px;
}
.input-group button:hover {
background: #c9af92;
}
.input-group button:active {
background: #b89c7c;
}
.button-group {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: center;
}
.btn {
background: #e5d7c4;
border: none;
padding: 10px 20px;
border-radius: 60px;
font-size: 0.95rem;
font-weight: 500;
color: #362c21;
cursor: pointer;
transition: 0.1s ease;
box-shadow: 0 2px 4px rgba(0,0,0,0.04);
border: 1px solid #cfbea8;
font-family: inherit;
letter-spacing: 1px;
display: inline-flex;
align-items: center;
gap: 4px;
}
.btn-primary {
background: #b6a084;
border-color: #9e8870;
color: #faf3ea;
}
.btn-primary:hover {
background: #a58c70;
}
.btn-outline {
background: transparent;
border: 1px solid #c9b8a4;
}
.btn-outline:hover {
background: #ede3d6;
}
.btn:active {
transform: scale(0.96);
}
.status-msg {
background: #f3ebe1;
padding: 10px 16px;
border-radius: 40px;
margin: 14px 0 6px;
text-align: center;
font-size: 0.95rem;
color: #4e3d2d;
border: 1px solid #e1d0bc;
min-height: 2.8rem;
display: flex;
align-items: center;
justify-content: center;
word-break: break-word;
}
.footer-hint {
text-align: center;
font-size: 0.8rem;
color: #8e7d68;
margin-top: 18px;
letter-spacing: 0.5px;
border-top: 1px dashed #d9caba;
padding-top: 14px;
}
.error {
color: #964f3c;
font-weight: 450;
}
.success {
color: #456b4a;
}
@media (max-width: 480px) {
.container { padding: 20px 16px; }
.idiom-tag { font-size: 1rem; padding: 4px 12px; }
.btn { padding: 8px 14px; font-size: 0.85rem; }
}
</style>
</head>
<body>
<div class="container">
<h1>
🧩 接龙
<small>· 成语</small>
</h1>
<div class="display-area">
<!-- 成语链展示 -->
<div class="chain-box" id="chainDisplay">
<span class="placeholder-hint">🐉 龙首 · 一鸣惊人</span>
</div>
<!-- 输入 & 动作 -->
<div class="action-bar">
<div class="input-group">
<input type="text" id="idiomInput" placeholder="输入成语" autocomplete="off" />
<button id="submitBtn">↵</button>
</div>
</div>
<div class="button-group">
<button class="btn btn-primary" id="resetBtn">🔄 重开一局</button>
<button class="btn btn-outline" id="exampleBtn">✨ 示例</button>
</div>
<!-- 状态 / 消息 -->
<div class="status-msg" id="statusMsg">⚡ 输入四字成语,首字需接上一成语尾字</div>
</div>
<div class="footer-hint">
支持常见成语 (内置约180个) · 尾字接首字
</div>
</div>
<script>
(function(){
// ---------- 简易成语词库 (约180个, 覆盖常用) ----------
const idioms = new Set([
"一鸣惊人", "人山人海", "海阔天空", "空穴来风", "风吹草动", "动人心魄", "魄力十足",
"足智多谋", "谋事在人", "人定胜天", "天经地义", "义不容辞", "辞旧迎新",
"新陈代谢", "谢天谢地", "地大物博", "博古通今", "今非昔比", "比翼双飞",
"飞黄腾达", "达官贵人", "人杰地灵", "灵机一动", "动若脱兔", "兔死狗烹",
"烹龙炮凤", "凤毛麟角", "角立杰出", "出人头地", "地久天长", "长驱直入",
"入木三分", "分秒必争", "争先恐后", "后来居上", "上善若水", "水到渠成",
"成竹在胸", "胸有成竹", "竹报平安", "安步当车", "车水马龙", "龙马精神",
"神采飞扬", "扬眉吐气", "气宇轩昂", "昂首阔步", "步步高升", "升堂入室",
"室迩人远", "远走高飞", "飞蛾扑火", "火中取栗", "栗栗危惧", "惧内喜外",
"外强中干", "干净利落", "落花流水", "水落石出", "出神入化", "化险为夷",
"夷然自若", "若即若离", "离群索居", "居安思危", "危机四伏", "伏虎降龙",
"龙飞凤舞", "舞文弄墨", "墨守成规", "规矩准绳", "绳锯木断", "断章取义",
"义薄云天", "天衣无缝", "缝衣浅带", "带月披星", "星罗棋布", "布衣之交",
"交头接耳", "耳聪目明", "明察秋毫", "毫不介意", "意味深长", "长歌当哭",
"哭笑不得", "得失荣枯", "枯木逢春", "春华秋实", "实事求是", "是古非今",
"今愁古恨", "恨铁不成钢", "钢筋铁骨", "骨肉相连", "连绵不断", "断壁残垣",
"源远流长", "长此以往", "往返徒劳", "劳苦功高", "高屋建瓴", "淋漓尽致",
"志同道合", "合情合理", "理所当然", "然荻读书", "书声琅琅", "琅琅上口",
"口若悬河", "河清海晏", "宴安鸩毒", "毒蛇猛兽", "兽心人面", "面红耳赤",
"赤胆忠心", "心照不宣", "宣化承流", "流连忘返", "返老还童", "童颜鹤发",
"发奋图强", "强弩之末", "末学肤受", "受之有愧", "愧不敢当", "当仁不让",
"让礼一寸", "寸步难行", "行将就木", "木人石心", "心旷神怡", "怡然自得",
"得心应手", "手舞足蹈", "蹈厉奋发", "发扬光大", "大功告成", "成人之美",
"美中不足", "足不出户", "户枢不蠹", "蠹众木折", "折冲樽俎", "俎上肉",
"肉眼凡胎", "胎死腹中", "中庸之道", "道听途说", "说三道四", "四面八方",
"方兴未艾", "艾发衰容", "容光焕发", "发指眦裂", "裂石穿云", "云蒸霞蔚",
"蔚然成风", "风吹雨打", "打草惊蛇", "蛇蝎心肠", "肠肥脑满", "满城风雨",
"雨过天晴", "晴天霹雳", "力挽狂澜", "澜倒波随", "随机应变", "变本加厉",
"厉兵秣马", "马到成功", ""
].filter(s => s.length === 4)); // 确保四字
// 再补充一些常见 (确保接龙丰富)
idioms.add("功成名就");
idioms.add("就地取材");
idioms.add("材大难用");
idioms.add("用兵如神");
idioms.add("神机妙算");
idioms.add("算无遗策");
idioms.add("策马扬鞭");
idioms.add("鞭辟入里");
idioms.add("里应外合");
idioms.add("合二为一");
idioms.add("一马平川");
idioms.add("川流不息");
idioms.add("息事宁人");
idioms.add("人心所向");
idioms.add("向壁虚造");
idioms.add("造谣生事");
idioms.add("事半功倍");
idioms.add("倍道兼程");
idioms.add("程门立雪");
idioms.add("雪中送炭");
idioms.add("炭疽热病"); // 凑字 不太常见但保留
idioms.delete("炭疽热病"); // 移除不规范的
idioms.add("虎头蛇尾");
idioms.add("尾大不掉");
idioms.add("掉以轻心");
idioms.add("心花怒放");
idioms.add("放虎归山");
idioms.add("山清水秀");
idioms.add("秀色可餐");
idioms.add("餐风饮露");
idioms.add("露宿风餐");
idioms.add("餐风茹雪");
idioms.add("雪上加霜");
idioms.add("霜露之疾");
idioms.add("疾风劲草");
idioms.add("草长莺飞");
// 清理无效空字符串
idioms.delete("");
// ---------- 游戏状态 ----------
let chain = []; // 成语链 (顺序)
const chainDisplay = document.getElementById('chainDisplay');
const idiomInput = document.getElementById('idiomInput');
const submitBtn = document.getElementById('submitBtn');
const resetBtn = document.getElementById('resetBtn');
const exampleBtn = document.getElementById('exampleBtn');
const statusMsg = document.getElementById('statusMsg');
// ---------- 辅助函数 ----------
function getLastChar() {
if (chain.length === 0) return null;
const last = chain[chain.length - 1];
return last.charAt(last.length - 1);
}
// 判断成语是否合法: 在词库中, 且为4汉字
function isValidIdiom(word) {
if (!word || word.length !== 4) return false;
// 简单正则: 4个汉字
if (!/^[\u4e00-\u9fa5]{4}$/.test(word)) return false;
return idioms.has(word);
}
// 检查是否可以接龙 (chain不为空时)
function canConnect(word) {
if (chain.length === 0) return true; // 第一条任意
const lastChar = getLastChar();
return word.charAt(0) === lastChar;
}
// 更新展示
function renderChain() {
if (chain.length === 0) {
chainDisplay.innerHTML = `<span class="placeholder-hint">🐉 龙首 · 一鸣惊人</span>`;
return;
}
let html = '';
chain.forEach((idiom, index) => {
html += `<span class="idiom-tag">${idiom}</span>`;
if (index < chain.length - 1) {
html += `<span class="chain-arrow">→</span>`;
}
});
chainDisplay.innerHTML = html;
}
// 添加成语到链上 (不验证, 由调用方保证)
function addToChain(idiom) {
chain.push(idiom);
renderChain();
idiomInput.value = '';
statusMsg.textContent = `✅ 接龙成功!当前 ${chain.length} 个成语`;
statusMsg.className = 'status-msg success';
}
// 重置游戏 (默认开局以「一鸣惊人」开头)
function resetGame(startIdiom = '一鸣惊人') {
chain = [];
// 确保起始成语合法
if (!isValidIdiom(startIdiom)) {
startIdiom = '一鸣惊人';
}
chain.push(startIdiom);
renderChain();
idiomInput.value = '';
statusMsg.textContent = `🌟 开局: 「${startIdiom}」 请接 「${getLastChar()}」开头`;
statusMsg.className = 'status-msg';
}
// 尝试接龙
function attemptConnect(inputRaw) {
const word = inputRaw.trim();
if (!word) {
statusMsg.textContent = '⚠️ 请输入成语';
statusMsg.className = 'status-msg error';
return false;
}
if (!isValidIdiom(word)) {
statusMsg.textContent = `❌ “${word}” 不在词库中或非四字成语`;
statusMsg.className = 'status-msg error';
return false;
}
// 检查是否重复 (不允许重复出现)
if (chain.includes(word)) {
statusMsg.textContent = `⛔ “${word}” 已经出现过,不能重复`;
statusMsg.className = 'status-msg error';
return false;
}
// 检查接龙规则
if (chain.length > 0) {
if (!canConnect(word)) {
const lastChar = getLastChar();
statusMsg.textContent = `🔗 首字应为 “${lastChar}” , “${word}” 首字为 “${word.charAt(0)}”`;
statusMsg.className = 'status-msg error';
return false;
}
}
// 通过
addToChain(word);
return true;
}
// 加载示例接龙
function loadExample() {
// 清空后设置一个较长的链
chain = [];
const demoChain = ['一鸣惊人', '人山人海', '海阔天空', '空穴来风', '风吹草动', '动人心魄'];
// 校验每个成语是否在词库,不在则跳过
const validDemo = demoChain.filter(w => isValidIdiom(w));
if (validDemo.length >= 2) {
chain = validDemo;
renderChain();
idiomInput.value = '';
const lastC = getLastChar();
statusMsg.textContent = `📖 示例链已加载,当前尾字 “${lastC}” ,继续接龙吧`;
statusMsg.className = 'status-msg success';
} else {
// fallback
resetGame('一鸣惊人');
}
}
// ---------- 事件绑定 ----------
submitBtn.addEventListener('click', function() {
attemptConnect(idiomInput.value);
});
idiomInput.addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
attemptConnect(idiomInput.value);
}
});
resetBtn.addEventListener('click', function() {
resetGame('一鸣惊人');
});
exampleBtn.addEventListener('click', function() {
loadExample();
});
// ---------- 初始化 ----------
// 默认开局
resetGame('一鸣惊人');
// 额外功能: 点击示例后如果不满展示, 可任意输入
// 窗口加载完毕后聚焦输入框
window.addEventListener('load', function() {
idiomInput.focus();
});
// 增加一个自动补全/提示体验
// (无依赖)
})();
</script>
</body>
</html>
玩法与规则说明
您需要输入四字成语,使其首字与上一成语的尾字相同,脚本内置了约180个常用成语词库,并会实时校验您的输入。
- 核心玩法:在输入框中输入成语,点击“↵”按钮或按回车键提交,如果成语符合规则(在词库中、未重复、首尾衔接),它就会添加到上方的成语链中。
- 交互反馈:页面下方的状态区会清晰显示操作结果,例如接龙成功、成语不在词库中或首字不匹配等提示,方便您调整。
- 辅助功能:您可以使用“重开一局”按钮快速开始新游戏,或点击“示例”按钮查看一个预设的成语接龙示例,帮助理解玩法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播