<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://yinglong.org/forum/extern.php?action=active&amp;type=RSS" rel="self" type="application/rss+xml" />
		<title><![CDATA[鱗目界域]]></title>
		<link>https://yinglong.org/forum/index.php</link>
		<description><![CDATA[位于 鱗目界域 的最新主题]]></description>
		<lastBuildDate>Sun, 10 May 2026 19:55:44 +0000</lastBuildDate>
		<generator>FluxBB</generator>
		<item>
			<title><![CDATA[虐龍癖應當被制止嗎？]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5050&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><blockquote><div><p>摺疊大段AI生成內容</p></div></blockquote></div><p>支持加入摺疊功能，在有大量圖/文字的帖子中能讓瀏覽體驗好很多<br>回到話題的討論，“應該”預設的主體是什麼？全社會，還是創作社區，亦或鱗目界域這樣的論壇？如果由虐龍癖對人類社會的潛在危害而呼籲論壇去禁止，無形中假定了論壇與社會的立場是一致的。<br>而且這裏的龍難以被替換爲一般生物，或許虐待龍的行爲中有近似屠龍的象徵意味，從而凹顯自身的偉岸與支配地位。我自己是懶得理，畢竟意淫是爲數不多的自由了。</p>]]></description>
			<author><![CDATA[dummy@example.com (Celia)]]></author>
			<pubDate>Sun, 10 May 2026 19:55:44 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5050&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[AI工具樓]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5044&amp;action=new</link>
			<description><![CDATA[<p>多餘換行清除工具，用於清除文本間多於一個的換行。<br><span class="postimg"><img src="//yinglong.org/forum/uploader/files/i_1760_69ff4fa2cb66b.jpeg" alt="" /></span></p><div class="codebox"><pre><code>
&lt;!DOCTYPE&nbsp;html&gt;
&lt;html&nbsp;lang=&quot;zh-CN&quot;&gt;
&lt;head&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;charset=&quot;UTF-8&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;meta&nbsp;name=&quot;viewport&quot;&nbsp;content=&quot;width=device-width,&nbsp;initial-scale=1.0&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;多余换行去除工具&lt;/title&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;style&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin:&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box-sizing:&nbsp;border-box;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family:&nbsp;&quot;Microsoft&nbsp;YaHei&quot;,&nbsp;Arial,&nbsp;sans-serif;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#f5f7fa;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.container&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max-width:&nbsp;1000px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin:&nbsp;0&nbsp;auto;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#ffffff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;12px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box-shadow:&nbsp;0&nbsp;2px&nbsp;16px&nbsp;rgba(0,&nbsp;0,&nbsp;0,&nbsp;0.08);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;30px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h1&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text-align:&nbsp;center;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#333333;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;30px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;24px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.text-area-group&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;25px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display:&nbsp;block;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#555555;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;500;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;16px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textarea&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;100%;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height:&nbsp;200px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;15px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;1px&nbsp;solid&nbsp;#e0e0e0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resize:&nbsp;vertical;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;14px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line-height:&nbsp;1.6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#333;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outline:&nbsp;none;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transition:&nbsp;border-color&nbsp;0.3s&nbsp;ease;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textarea:focus&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-color:&nbsp;#409eff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box-shadow:&nbsp;0&nbsp;0&nbsp;0&nbsp;2px&nbsp;rgba(64,&nbsp;158,&nbsp;255,&nbsp;0.1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-group&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display:&nbsp;flex;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gap:&nbsp;12px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;25px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flex-wrap:&nbsp;wrap;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;12px&nbsp;24px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;none;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;14px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-weight:&nbsp;500;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cursor:&nbsp;pointer;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transition:&nbsp;all&nbsp;0.3s&nbsp;ease;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-primary&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#409eff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#ffffff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-primary:hover&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#337ecc;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-secondary&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#f0f2f5;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#555555;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.btn-secondary:hover&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#e4e6eb;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.tip&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text-align:&nbsp;center;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#999999;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;12px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-top:&nbsp;10px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.copy-success&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position:&nbsp;fixed;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;top:&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;right:&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background-color:&nbsp;#67c23a;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#ffffff;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;10px&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;14px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opacity:&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transition:&nbsp;opacity&nbsp;0.3s&nbsp;ease;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer-events:&nbsp;none;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.copy-success.show&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opacity:&nbsp;1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;container&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&gt;多余换行去除工具&lt;/h1&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;输入文本区域&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;text-area-group&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;for=&quot;input-text&quot;&gt;待处理文本（可粘贴含多余换行的内容）&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;textarea&nbsp;id=&quot;input-text&quot;&nbsp;placeholder=&quot;请输入或粘贴需要去除多余换行的文本...&quot;&gt;&lt;/textarea&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;操作按钮组&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;btn-group&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;class=&quot;btn-primary&quot;&nbsp;id=&quot;process-btn&quot;&gt;去除多余换行&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;class=&quot;btn-secondary&quot;&nbsp;id=&quot;clear-input-btn&quot;&gt;清空输入&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;class=&quot;btn-secondary&quot;&nbsp;id=&quot;clear-output-btn&quot;&gt;清空输出&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;class=&quot;btn-secondary&quot;&nbsp;id=&quot;copy-output-btn&quot;&gt;复制输出结果&lt;/button&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;输出文本区域&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;text-area-group&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;label&nbsp;for=&quot;output-text&quot;&gt;处理后文本（已去除多余非正常换行）&lt;/label&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;textarea&nbsp;id=&quot;output-text&quot;&nbsp;placeholder=&quot;处理后的结果将显示在这里...&quot;&nbsp;readonly&gt;&lt;/textarea&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;tip&quot;&gt;提示：工具会保留单个有效换行，去除连续多个换行（空行）&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;!--&nbsp;复制成功提示&nbsp;--&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;copy-success&quot;&nbsp;id=&quot;copy-tip&quot;&gt;复制成功！&lt;/div&gt;

&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;获取页面元素
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;inputText&nbsp;=&nbsp;document.getElementById(&apos;input-text&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;outputText&nbsp;=&nbsp;document.getElementById(&apos;output-text&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;processBtn&nbsp;=&nbsp;document.getElementById(&apos;process-btn&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;clearInputBtn&nbsp;=&nbsp;document.getElementById(&apos;clear-input-btn&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;clearOutputBtn&nbsp;=&nbsp;document.getElementById(&apos;clear-output-btn&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;copyOutputBtn&nbsp;=&nbsp;document.getElementById(&apos;copy-output-btn&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;copyTip&nbsp;=&nbsp;document.getElementById(&apos;copy-tip&apos;);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/**
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;核心功能：去除多余换行
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;逻辑：
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;1.&nbsp;匹配连续多个换行（\n\n+&nbsp;匹配连续2个及以上换行，兼容Windows(\r\n)和Linux(\n)格式）
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;2.&nbsp;替换为单个换行，保留有效换行结构
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;3.&nbsp;去除文本首尾的多余换行和空格
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;removeExtraLineBreaks(text)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!text)&nbsp;return&nbsp;&apos;&apos;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;第一步：将Windows格式换行(\r\n)统一转为Linux格式(\n)，避免格式混乱
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;unifiedText&nbsp;=&nbsp;text.replace(/\r\n/g,&nbsp;&apos;\n&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;第二步：将连续多个换行（2个及以上）替换为单个换行
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;processedText&nbsp;=&nbsp;unifiedText.replace(/\n{2,}/g,&nbsp;&apos;\n&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;第三步：去除文本首尾的换行和空白字符，返回最终结果
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;processedText.trim();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;绑定「去除多余换行」按钮事件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processBtn.addEventListener(&apos;click&apos;,&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;originalText&nbsp;=&nbsp;inputText.value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;resultText&nbsp;=&nbsp;removeExtraLineBreaks(originalText);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputText.value&nbsp;=&nbsp;resultText;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;绑定「清空输入」按钮事件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearInputBtn.addEventListener(&apos;click&apos;,&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputText.value&nbsp;=&nbsp;&apos;&apos;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;清空输入时可选择是否清空输出（按需调整，这里保留输出）
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;outputText.value&nbsp;=&nbsp;&apos;&apos;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;绑定「清空输出」按钮事件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearOutputBtn.addEventListener(&apos;click&apos;,&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputText.value&nbsp;=&nbsp;&apos;&apos;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;绑定「复制输出结果」按钮事件
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copyOutputBtn.addEventListener(&apos;click&apos;,&nbsp;async&nbsp;function()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;outputValue&nbsp;=&nbsp;outputText.value;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!outputValue)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&apos;输出区域无内容可复制！&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;调用浏览器剪贴板API复制文本
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;await&nbsp;navigator.clipboard.writeText(outputValue);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;显示复制成功提示
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copyTip.classList.add(&apos;show&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;3秒后隐藏提示
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(()&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copyTip.classList.remove(&apos;show&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;3000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(err)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.error(&apos;复制失败：&apos;,&nbsp;err);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&apos;复制失败，请手动选中复制！&apos;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;可选：绑定回车快捷键（仅输入区聚焦时，按Ctrl+Enter触发处理）
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputText.addEventListener(&apos;keydown&apos;,&nbsp;function(e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(e.ctrlKey&nbsp;&amp;&amp;&nbsp;e.key&nbsp;===&nbsp;&apos;Enter&apos;)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.preventDefault();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processBtn.click();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre></div>]]></description>
			<author><![CDATA[dummy@example.com (羽落)]]></author>
			<pubDate>Sat, 09 May 2026 15:17:07 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5044&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[25名志願者在虛擬現實中經過一週飛行訓練，大腦開始將翅膀視爲真正的肢體]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5051&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><blockquote><div><p><a href="/forum/viewtopic.php?pid=56850#p56850" rel="nofollow">[↑]</a>&nbsp;<a href="/forum/profile.php?id=1884" rel="nofollow">@vic123</a>&nbsp;寫道:&nbsp;大腦實在是太奇妙了。&nbsp;<img src="/forum/img/smilies/dragn/dragn-think.svg" alt="[思考]" />&nbsp;但是如果是四足雙翼（也就是額外的肢體），大腦會有任何的可能性進行實際控制嗎？&nbsp;…</p></div></blockquote></div><p>https://www.ucl.ac.uk/news/2021/may/robotic-third-thumb-use-can-alter-brain-representation-hand</p><div class="quotebox"><blockquote><div><p>機翻<br><b>機器人“第三拇指”的使用可以改變大腦對手的表徵</b></p><p><span class="postimg"><img src="//yinglong.org/forum/uploader/files/i_1760_69ff4c300735b.jpeg" alt="" /></span></p><p>團隊訓練人們使用機械額外拇指，發現他們能用一隻手（現在是兩個拇指）有效地完成靈巧的任務，比如搭建積木塔。研究人員在《科學機器人》雜誌上報告稱，參與者在訓練使用拇指時，也越來越覺得拇指是身體的一部分。<br>設計師丹妮·克洛德開始開發名爲“第三拇指”的裝置，作爲皇家藝術學院一個獲獎研究生項目的一部分，旨在重新定義我們對義肢的看法，從替代失去的功能，到人體的延伸。後來她受邀加入倫敦大學學院塔瑪爾·馬金教授的神經科學家團隊，研究大腦如何適應身體增強。<br>該研究的主要作者、倫敦大學學院認知神經科學研究所的Makin教授表示：“身體增強是一個不斷發展的領域，旨在擴展我們的身體能力，但我們對大腦如何適應這一過程仍缺乏清晰的理解。通過研究使用Dani巧妙設計的第三拇指的人們，我們試圖解答關於人腦是否能支持額外身體部位，以及這項技術如何影響我們的大腦等關鍵問題。”<br>第三拇指是3D打印的，易於定製，佩戴在與實際拇指相對的手側，靠近小指（小指）。穿戴者通過安裝在腳上大腳趾內側的壓力傳感器來控制它。通過無線連接拇指，兩個腳趾傳感器通過立即響應佩戴者的細微壓力變化，控制拇指的不同動作。<br>在這項研究中，20名參與者接受了爲期五天的使用訓練，同時鼓勵他們每天訓練後帶拇指回家，在日常生活場景中使用，每天總計佩戴時間爲2到6小時。這些參與者與另一組10名佩戴靜態拇指的對照組進行了比較。<br>在實驗室的每日訓練中，參與者會專注於使用拇指，專注於幫助提升手與拇指合作的任務，比如單手拿起多個球或酒杯。他們很快掌握了拇指的基礎，同時訓練也成功提升了他們的運動控制、靈巧度和手拇指協調能力。參與者甚至在分心時使用拇指——比如一邊做數學題一邊搭建木製積木塔——或者矇眼時使用。<br>設計師Dani&nbsp;Clode（UCL認知神經科學研究所和Dani&nbsp;Clode&nbsp;Design），作爲核心研究團隊成員，表示：“我們的研究表明，人們可以快速學會控制增強設備並將其用於自身利益，而無需過度思考。我們看到，使用第三拇指時，人們改變了自然的手部動作，他們還報告說機器人拇指感覺像是自己身體的一部分。”<br>該研究的第一作者Paulina&nbsp;Kieliba（倫敦大學學院認知神經科學研究所）表示：“身體增強未來可能在多方面對社會有價值，比如讓外科醫生無需助手也能應付，或讓工廠工人更高效地工作。這條工作可能會徹底改變假肢的概念，也可以幫助那些長期或暫時只能用一隻手的人，用那隻手完成所有事情。但要達到這一目標，我們需要繼續研究這些設備如何與大腦相互作用的複雜跨學科問題。”<br>培訓前後，研究人員在參與者單獨移動手指時（掃描時未佩戴拇指）使用fMRI掃描了參與者的大腦。研究人員發現，原本被第三拇指增強的手（但另一隻手未被增強）在大腦感覺運動皮層中的表現方式發生了細微但顯著的變化。在我們的大腦中，每根手指都被區分開來;在研究參與者中，對應每根手指的大腦活動模式變得更加相似（不那麼明顯）。<br>一週後，部分參與者再次掃描，發現他們大腦手部區域的變化減弱，表明這些變化可能不是長期性的，儘管需要更多研究來證實這一點。<br>Paulina&nbsp;Kieliba說：“我們的研究是首次在實驗室外研究增強裝置的使用。這是首個跨越多天長時間訓練進行的增益研究，也是首個設有未受過訓練的對照組。我們研究的成功表明，神經科學家與設計師和工程師緊密合作的重要性，確保增強設備充分發揮大腦的學習和適應能力，同時確保增強設備能夠安全使用。”<br>Makin教授補充道：“進化還沒有讓我們準備好使用額外的身體部位，我們發現要以新的、意想不到的方式擴展我們的能力，大腦需要適應生物身體的表徵。”<br>研究人員總部設在倫敦大學學院和牛津大學，得到了歐洲研究理事會、威康基金會和哈雷·斯圖爾特爵士信託的支持。<br></p></div></blockquote></div><p>更符合我認知中的那種額外肢體有：</p><div class="quotebox"><blockquote><div><p>在&nbsp;2019&nbsp;年，有關“人類通過腦機接口（BCI）控制第三隻手”並在《PNAS》（美國國家科學院院刊）上發表的研究，最匹配的應是日本&nbsp;ATR&nbsp;計算神經科學研究所（ATR&nbsp;Computational&nbsp;Neuroscience&nbsp;Laboratories）&nbsp;Christian&nbsp;I.&nbsp;Penaloza&nbsp;與&nbsp;Shuichi&nbsp;Nishio&nbsp;的研究成果。該研究題目爲：《BCI&nbsp;control&nbsp;of&nbsp;a&nbsp;third&nbsp;arm&nbsp;and&nbsp;native&nbsp;arm&nbsp;enables&nbsp;independent&nbsp;multitasking》（通過腦機接口控制第三隻手與原生手可實現獨立的多任務操作）。<br></p></div></blockquote></div><p>但是相關網頁需要賬號才能閱讀文獻。</p>]]></description>
			<author><![CDATA[dummy@example.com (羽落)]]></author>
			<pubDate>Sat, 09 May 2026 15:12:33 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5051&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[龍圖-雜七雜八的短漫]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=2619&amp;action=new</link>
			<description><![CDATA[<p><span class="postimg"><img src="//yinglong.org/forum/uploader/files/i_393_69fec0bec8f5d.webp" alt="" /></span><br><a href="https://www.reddit.com/r/DnD/comments/r1brm7/oc_art_lounging_lizard/" rel="nofollow">圖片來源</a></p>]]></description>
			<author><![CDATA[dummy@example.com (龍爪翻書)]]></author>
			<pubDate>Sat, 09 May 2026 05:06:46 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=2619&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[Minecraft龍之生存檔記錄]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=4956&amp;action=new</link>
			<description><![CDATA[<p>原來裝了staaaaaaack嘛，那我就不清楚了</p><div class="quotebox"><blockquote><div><p>因爲我覺得礦車速度沒水道快。</p></div></blockquote></div><p>真正的時間差其實是最後一個被給料的熔爐燒煉完成到進入收集之間吧。不同方案最多也就差幾秒啦，而且礦車肯定不比水道差。</p>]]></description>
			<author><![CDATA[dummy@example.com (Celia)]]></author>
			<pubDate>Fri, 08 May 2026 15:23:14 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=4956&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[聊聊設定(或者認知)，龍需要長眠嗎？]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=4661&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><blockquote><div><p><a href="/forum/viewtopic.php?pid=54485#p54485" rel="nofollow">[↑]</a>&nbsp;<a href="/forum/profile.php?id=1559" rel="nofollow">@鏡中龍影</a>&nbsp;寫道:&nbsp;最近玩了Ravager，在這款遊戲中龍王睡眠會隨着年齡越來越長，從一睡一晚到一睡一個禮拜，往後還會一睡不知道多少年，因而王后當權；在金寶大綠中每度過一個發育階段就會經歷一次長眠，而choice&nbsp;of&nbsp;&nbsp;…</p></div></blockquote></div><p>D？原來是~Ravager，不過可惜啦，怎麼不是好多小龍仔，和經典爬行掉鱗片，鱗蛻&nbsp;<img src="/forum/img/smilies/dragn/dragn-thinkflare.svg" alt="[十字紅眼思考]" /></p>]]></description>
			<author><![CDATA[dummy@example.com (与黑语焉)]]></author>
			<pubDate>Fri, 08 May 2026 09:54:55 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=4661&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[龍到底是不是furry]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5034&amp;action=new</link>
			<description><![CDATA[<p>在什麼樣的羣體有什麼樣的說法&nbsp;<img src="/forum/img/smilies/haku/haku-smirk.svg" alt="[壞笑]" /></p>]]></description>
			<author><![CDATA[dummy@example.com (SmallDragon)]]></author>
			<pubDate>Fri, 08 May 2026 09:21:52 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5034&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[聲稱自己是龍但是恐高會不會是一件很丟臉的事情]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5042&amp;action=new</link>
			<description><![CDATA[<p>如果說是幼時第一次飛行，大概也是會產生恐懼的吧。如果天生帶有一些疾病，可能也會恐高？</p>]]></description>
			<author><![CDATA[dummy@example.com (⇃☽R4G0Ⅳ)]]></author>
			<pubDate>Thu, 07 May 2026 15:40:04 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5042&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[黑龍謝里斯的胡思亂想]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5036&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><blockquote><div><p><a href="/forum/profile.php?id=1694" rel="nofollow">@Sherixs</a>&nbsp;寫道:&nbsp;龍這個種族</p></div></blockquote></div><p>我想避免將龍的個體數量設置得太高：根據我的經驗，龍數量的增加未必能顯著提升作品和故事的史詩感；同時，我可不想看到滿屏紛飛的翅膀，觀感一點都不好。&nbsp;<img src="/forum/img/smilies/haku/haku-embarrassed.svg" alt="[汗]" />&nbsp;魔獸世界巨龍時代的開場cg就是經典反例——低質量的模型複製黏貼，笑死，真是和這遊戲本體的德行一模一樣。<br>我覺得能接受一條龍同時對付多個對手。<br>大部分的龍外觀只需簡單耐看就好，因爲是魔法世界所以不需要考慮結構是否科學（噴火之類的種族天賦都能輕鬆實現），目前遇到困難的地方是龍形態如何區分男女、如何區分血緣近遠，以及不同種的龍如何設計才能看起來會出現在同一個世界裏。目前我的能力有限，構思一整套龍族設計語言還需要好久。<br>講述龍與人的故事的一個重要跳板可以是“圖騰”，放入備選方案。不確定這設定到近未來的時間線還是否有效。整個世界如何<u>具體演變</u>到近未來還沒有構思好，現在不管怎麼看都有點割裂。&nbsp;<img src="/forum/img/smilies/dragn/dragn-melt.svg" alt="[融化]" />否則我只能拆成兩個平行世界來寫了……</p><div class="quotebox"><blockquote><div><p><a href="/forum/profile.php?id=1694" rel="nofollow">@Sherixs</a>&nbsp;寫道:&nbsp;以小故事的方式</p></div></blockquote></div><p>我創作的小<u>故事的立意</u>可能與動畫片的那種不同，因爲我發現無論我看多少遍都沒法模仿——可能是因爲沒看懂，也可能是因爲那些不是我想寫的故事。我也是過來人了，總得開發些更好的。<br>那麼受衆的話還是跟從前一樣，在校讀書的年輕人。感覺可以繼續禍害人類了&nbsp;<img src="/forum/img/smilies/haku/haku-smirk.svg" alt="[壞笑]" /><br>[正在聽Diablo&nbsp;IV:&nbsp;Lord&nbsp;of&nbsp;Hatred的A&nbsp;Fragile&nbsp;World]</p>]]></description>
			<author><![CDATA[dummy@example.com (Sherixs)]]></author>
			<pubDate>Sun, 03 May 2026 16:16:34 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5036&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[龍與道德]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5046&amp;action=new</link>
			<description><![CDATA[<h5><p>人類的道德</p></h5><ul><li><p>人類先感覺，再解釋。</p></li><li><p>人類以道德語言包裝羣體利益。</p></li><li><p>人類用多維價值系統劃分敵友。</p></li><li><p>人類通過共同信念實現合作，也因此產生集體盲目。</p></li></ul><h5><p>（一）直覺先行，推理隨後</p></h5><ul><li><p>人類的道德意識近似“雙層控制”，可以比喻爲：<b>大象</b>——龐大的無意識過程，主導多數行爲；<b>騎象人</b>——可敘述的意識、語言、理由。</p></li><li><p>人類道德判斷通常先由瞬時反應生成，再由語言系統補寫理由。後續推理多用於防禦既有立場，而非搜尋客觀真值。</p></li><li><p>觀察人類爭論時，一種有效的方式是追蹤其底層動機、聯盟利益與身份維護，而非只聽表面論證。</p></li><li><p>說服人類時，單靠邏輯常不足，需要觸及其直覺系統與羣體歸屬感。</p></li></ul><h5><p>（二）道德有多個維度</p></h5><ul><li><p>人類道德感受器更像多味覺系統。常包含：傷害/關懷、公平/欺騙、自由/壓迫、忠誠/背叛、權威/顛覆、聖潔/墮落。</p></li><li><p>不同文化與意識形態，會組合這些基礎模塊，形成不同的“道德菜譜”。僅強調少數維度的世俗倫理，往往難解釋廣泛人羣的真實反應。</p></li></ul><h5><p>（三）道德能凝聚羣體，也製造盲區</p></h5><ul><li><p>人類兼具兩套進化遺產：90%的類猩性，個體競爭型靈長類傾向；10%的類蜂性，羣體協作型社會性傾向。因此，人類既擅長自利、僞善、自我欺騙，也能表現犧牲、忠誠與奉獻。</p></li><li><p>在特定條件下，個體可暫時融入集體目標，獲得強烈意義感。同一機制也會造成排外、戰爭、狂熱與屠殺。</p></li><li><p>利他主義常具有邊界：更偏向“自己人”。</p></li><li><p>政治陣營本質上是共享道德故事的聯盟。一旦綁定某種敘事，人類會過濾現實，忽略與本陣營衝突的信息。</p></li></ul><p>參考：《正義之心：爲什麼人們總是堅持“我對你錯”》</p>]]></description>
			<author><![CDATA[dummy@example.com (shiningdracon)]]></author>
			<pubDate>Sun, 03 May 2026 01:40:51 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5046&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[我的2026春季露營，照片+改圖]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5049&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><blockquote><div><p><a href="/forum/profile.php?id=1871" rel="nofollow">@Celia</a>&nbsp;寫道:&nbsp;好奇是怎麼改的圖呀</p></div></blockquote></div><p>照片給AI，寫出想要的效果，讓它按要求改</p>]]></description>
			<author><![CDATA[dummy@example.com (shiningdracon)]]></author>
			<pubDate>Mon, 27 Apr 2026 10:11:57 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5049&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[[翻譯] 龍與地下城: 羣龍議會 非官方第五版手冊 (進度: 27%)]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=4197&amp;action=new</link>
			<description><![CDATA[<div class="quotebox"><blockquote><div><p><a href="/forum/viewtopic.php?pid=50214#p50214" rel="nofollow">[↑]</a>&nbsp;<a href="/forum/profile.php?id=1205" rel="nofollow">@ken1882</a>&nbsp;寫道:&nbsp;<b>龍族科別、屬類與特性</b>偉大的埃歐在創造龍族時將它們分為三大科別，使之力量與思想平等。五色龍偏好殘暴與威壓，利用它們的力量去獲得地位與物理上地解決部落內的爭端。金屬龍則是完全相反，它們高尚且正義。而水晶龍&nbsp;…</p></div></blockquote></div><p>勘誤：<br>原文爲&quot;Toughness.&nbsp;You&nbsp;possess&nbsp;additional&nbsp;maximum&nbsp;hit&nbsp;point&nbsp;sequal&nbsp;to&nbsp;your&nbsp;class’s&nbsp;starting&nbsp;hit&nbsp;point&nbsp;value.&nbsp;For&nbsp;example,&nbsp;if&nbsp;your&nbsp;dragon’s&nbsp;first&nbsp;class&nbsp;level&nbsp;is&nbsp;fighter,&nbsp;you&nbsp;begin&nbsp;play&nbsp;with&nbsp;10&nbsp;extra&nbsp;hit&nbsp;points.&quot;<br>更有可能的譯法：&quot;擁有等同於職業初始生命值的<b>額外</b>最大生命值。例如一開始是戰士則擁有額外&nbsp;10&nbsp;點最大生命值。&quot;</p>]]></description>
			<author><![CDATA[dummy@example.com (Zhang_TTL)]]></author>
			<pubDate>Sun, 26 Apr 2026 16:31:59 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=4197&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[一種不違背科學的龍息方案]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=4997&amp;action=new</link>
			<description><![CDATA[<p>如果不依靠工具，化學點火是爲數不多可行的方式。我能想到比較合理的是磷氫化物；在喉嚨深處多個互不連通的高壓腔室中以液態存儲。這些腔室的容積是很小的。前體物質是含磷的複雜配合物，相對安全，能較快地爲腔室補充。<br>火焰的威力用於烹飪足夠，但用於狩獵完全不可行。</p>]]></description>
			<author><![CDATA[dummy@example.com (Celia)]]></author>
			<pubDate>Sun, 26 Apr 2026 12:23:36 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=4997&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[大家是在怎樣的情況下以怎樣的方式進入這裡的呢？]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=1399&amp;action=new</link>
			<description><![CDATA[<p>認識的第一條龍向我推薦了這個地方</p>]]></description>
			<author><![CDATA[dummy@example.com (Celia)]]></author>
			<pubDate>Sun, 26 Apr 2026 11:08:20 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=1399&amp;action=new</guid>
		</item>
		<item>
			<title><![CDATA[AI小遊戲樓]]></title>
			<link>https://yinglong.org/forum/viewtopic.php?id=5037&amp;action=new</link>
			<description><![CDATA[<p>原本想順便養龍蝦，叫龍蝦幫忙發布到GitHub，發現沒想像中好弄&nbsp;&nbsp;&nbsp;<img src="/forum/img/smilies/haku/haku-embarrassed.svg" alt="[汗]" />&nbsp;</p><p>還是先繼續貼純文字過來吧&nbsp;<img src="/forum/img/smilies/dragn/dragn-cool.svg" alt="[酷酷]" />&nbsp;<br></p><p><b>像素風格、橫版通關遊戲</b><br></p><p><span class="postimg"><img src="//yinglong.org/forum/uploader/files/i_393_69ec82b396b54.jpeg" alt="" /></span><br><br><br></p><div class="codebox"><pre><code>

&lt;!DOCTYPE&nbsp;html&gt;
&lt;html&nbsp;lang=&quot;zh-Hant&quot;&gt;
&lt;head&gt;
&nbsp;&nbsp;&lt;meta&nbsp;charset=&quot;UTF-8&quot;&nbsp;/&gt;
&nbsp;&nbsp;&lt;meta&nbsp;name=&quot;viewport&quot;&nbsp;content=&quot;width=device-width,&nbsp;initial-scale=1.0&quot;&nbsp;/&gt;
&nbsp;&nbsp;&lt;title&gt;像素小龍橫版通關&lt;/title&gt;
&nbsp;&nbsp;&lt;style&gt;
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;{&nbsp;box-sizing:&nbsp;border-box;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;body&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin:&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min-height:&nbsp;100vh;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display:&nbsp;grid;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;place-items:&nbsp;center;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background:&nbsp;#111827;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#e5e7eb;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-family:&nbsp;&quot;Noto&nbsp;Sans&nbsp;TC&quot;,&nbsp;system-ui,&nbsp;sans-serif;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user-select:&nbsp;none;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;.wrap&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;min(960px,&nbsp;100vw);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;12px;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;h1&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin:&nbsp;0&nbsp;0&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;20px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;letter-spacing:&nbsp;2px;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;.hud&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display:&nbsp;flex;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;justify-content:&nbsp;space-between;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;align-items:&nbsp;center;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gap:&nbsp;12px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom:&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;14px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;opacity:&nbsp;0.95;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;canvas&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;100%;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aspect-ratio:&nbsp;16&nbsp;/&nbsp;9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display:&nbsp;block;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border:&nbsp;4px&nbsp;solid&nbsp;#374151;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;10px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background:&nbsp;#7dd3fc;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image-rendering:&nbsp;pixelated;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;box-shadow:&nbsp;0&nbsp;16px&nbsp;40px&nbsp;rgba(0,&nbsp;0,&nbsp;0,&nbsp;0.35);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;.help&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;margin-top:&nbsp;8px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:&nbsp;14px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line-height:&nbsp;1.6;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#cbd5e1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;kbd&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;padding:&nbsp;2px&nbsp;6px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-radius:&nbsp;4px;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;background:&nbsp;#334155;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;white;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;border-bottom:&nbsp;2px&nbsp;solid&nbsp;#0f172a;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&lt;div&nbsp;class=&quot;wrap&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;h1&gt;🐉&nbsp;像素小龍：火焰通關&lt;/h1&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;hud&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id=&quot;status&quot;&gt;生命：3&nbsp;分數：0&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;id=&quot;message&quot;&gt;飛到右方城堡即可通關！&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;canvas&nbsp;id=&quot;game&quot;&nbsp;width=&quot;640&quot;&nbsp;height=&quot;360&quot;&gt;&lt;/canvas&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&lt;div&nbsp;class=&quot;help&quot;&gt;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作：&lt;kbd&gt;W&lt;/kbd&gt;/&lt;kbd&gt;↑&lt;/kbd&gt;&nbsp;上飛，&lt;kbd&gt;S&lt;/kbd&gt;/&lt;kbd&gt;↓&lt;/kbd&gt;&nbsp;下飛，&lt;kbd&gt;A&lt;/kbd&gt;/&lt;kbd&gt;←&lt;/kbd&gt;&nbsp;左移，&lt;kbd&gt;D&lt;/kbd&gt;/&lt;kbd&gt;→&lt;/kbd&gt;&nbsp;右移，&lt;kbd&gt;空白鍵&lt;/kbd&gt;&nbsp;噴火球，&lt;kbd&gt;R&lt;/kbd&gt;&nbsp;重新開始。
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/div&gt;
&nbsp;&nbsp;&lt;/div&gt;

&nbsp;&nbsp;&lt;script&gt;
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;canvas&nbsp;=&nbsp;document.getElementById(&quot;game&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;ctx&nbsp;=&nbsp;canvas.getContext(&quot;2d&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;statusEl&nbsp;=&nbsp;document.getElementById(&quot;status&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;messageEl&nbsp;=&nbsp;document.getElementById(&quot;message&quot;);

&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;W&nbsp;=&nbsp;canvas.width;
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;H&nbsp;=&nbsp;canvas.height;
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;WORLD_W&nbsp;=&nbsp;3600;
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;keys&nbsp;=&nbsp;new&nbsp;Set();

&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;cameraX&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;frame&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;gameState&nbsp;=&nbsp;&quot;play&quot;;

&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;dragonStart&nbsp;=&nbsp;{&nbsp;x:&nbsp;70,&nbsp;y:&nbsp;160&nbsp;};
&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;dragon&nbsp;=&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;dragonStart.x,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:&nbsp;dragonStart.y,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;34,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;24,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vx:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vy:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hp:&nbsp;3,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inv:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireCd:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;score:&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;};

&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;fireballs&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;enemies&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;particles&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;clouds&nbsp;=&nbsp;[];

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;resetGame()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cameraX&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gameState&nbsp;=&nbsp;&quot;play&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object.assign(dragon,&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;dragonStart.x,&nbsp;y:&nbsp;dragonStart.y,&nbsp;vx:&nbsp;0,&nbsp;vy:&nbsp;0,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hp:&nbsp;3,&nbsp;inv:&nbsp;0,&nbsp;fireCd:&nbsp;0,&nbsp;score:&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireballs&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;particles&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enemies&nbsp;=&nbsp;[];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clouds&nbsp;=&nbsp;[];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;18;&nbsp;i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clouds.push({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;i&nbsp;*&nbsp;220&nbsp;+&nbsp;Math.random()&nbsp;*&nbsp;90,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:&nbsp;30&nbsp;+&nbsp;Math.random()&nbsp;*&nbsp;95,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s:&nbsp;1&nbsp;+&nbsp;Math.random()&nbsp;*&nbsp;1.4
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;24;&nbsp;i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enemies.push({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;380&nbsp;+&nbsp;i&nbsp;*&nbsp;130&nbsp;+&nbsp;Math.random()&nbsp;*&nbsp;60,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:&nbsp;70&nbsp;+&nbsp;Math.random()&nbsp;*&nbsp;190,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;24,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;22,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseY:&nbsp;70&nbsp;+&nbsp;Math.random()&nbsp;*&nbsp;190,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hp:&nbsp;i&nbsp;%&nbsp;5&nbsp;===&nbsp;0&nbsp;?&nbsp;2&nbsp;:&nbsp;1,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;i&nbsp;%&nbsp;3,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alive:&nbsp;true,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phase:&nbsp;Math.random()&nbsp;*&nbsp;Math.PI&nbsp;*&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateHud();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageEl.textContent&nbsp;=&nbsp;&quot;飛到右方城堡即可通關！&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;updateHud()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statusEl.textContent&nbsp;=&nbsp;`生命：${dragon.hp}&nbsp;分數：${dragon.score}`;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;rectsHit(a,&nbsp;b)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.x&nbsp;&lt;&nbsp;b.x&nbsp;+&nbsp;b.w&nbsp;&amp;&amp;&nbsp;a.x&nbsp;+&nbsp;a.w&nbsp;&gt;&nbsp;b.x&nbsp;&amp;&amp;&nbsp;a.y&nbsp;&lt;&nbsp;b.y&nbsp;+&nbsp;b.h&nbsp;&amp;&amp;&nbsp;a.y&nbsp;+&nbsp;a.h&nbsp;&gt;&nbsp;b.y;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;pixelRect(x,&nbsp;y,&nbsp;w,&nbsp;h,&nbsp;color)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;color;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillRect(Math.round(x),&nbsp;Math.round(y),&nbsp;Math.round(w),&nbsp;Math.round(h));
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawCloud(c)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;x&nbsp;=&nbsp;c.x&nbsp;-&nbsp;cameraX&nbsp;*&nbsp;0.35;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;y&nbsp;=&nbsp;c.y;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x,&nbsp;y&nbsp;+&nbsp;8&nbsp;*&nbsp;c.s,&nbsp;34&nbsp;*&nbsp;c.s,&nbsp;10&nbsp;*&nbsp;c.s,&nbsp;&quot;#f8fafc&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;8&nbsp;*&nbsp;c.s,&nbsp;y,&nbsp;18&nbsp;*&nbsp;c.s,&nbsp;18&nbsp;*&nbsp;c.s,&nbsp;&quot;#f8fafc&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;24&nbsp;*&nbsp;c.s,&nbsp;y&nbsp;+&nbsp;4&nbsp;*&nbsp;c.s,&nbsp;20&nbsp;*&nbsp;c.s,&nbsp;14&nbsp;*&nbsp;c.s,&nbsp;&quot;#e0f2fe&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawBackground()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;grad&nbsp;=&nbsp;ctx.createLinearGradient(0,&nbsp;0,&nbsp;0,&nbsp;H);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grad.addColorStop(0,&nbsp;&quot;#38bdf8&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grad.addColorStop(0.65,&nbsp;&quot;#bae6fd&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grad.addColorStop(1,&nbsp;&quot;#86efac&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;grad;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillRect(0,&nbsp;0,&nbsp;W,&nbsp;H);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clouds.forEach(drawCloud);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;&quot;#60a5fa&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;x&nbsp;=&nbsp;-120;&nbsp;x&nbsp;&lt;&nbsp;W&nbsp;+&nbsp;160;&nbsp;x&nbsp;+=&nbsp;140)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;mx&nbsp;=&nbsp;x&nbsp;-&nbsp;(cameraX&nbsp;*&nbsp;0.15&nbsp;%&nbsp;140);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.beginPath();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.moveTo(mx,&nbsp;265);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.lineTo(mx&nbsp;+&nbsp;75,&nbsp;165);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.lineTo(mx&nbsp;+&nbsp;160,&nbsp;265);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.closePath();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fill();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;&quot;#22c55e&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillRect(0,&nbsp;314,&nbsp;W,&nbsp;46);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;&quot;#15803d&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;x&nbsp;=&nbsp;-20;&nbsp;x&nbsp;&lt;&nbsp;W&nbsp;+&nbsp;20;&nbsp;x&nbsp;+=&nbsp;18)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;-&nbsp;(cameraX&nbsp;%&nbsp;18),&nbsp;314,&nbsp;9,&nbsp;8,&nbsp;&quot;#16a34a&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawDragon()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;x&nbsp;=&nbsp;dragon.x&nbsp;-&nbsp;cameraX;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;y&nbsp;=&nbsp;dragon.y;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;blink&nbsp;=&nbsp;dragon.inv&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;Math.floor(frame&nbsp;/&nbsp;5)&nbsp;%&nbsp;2&nbsp;===&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(blink)&nbsp;return;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;flap&nbsp;=&nbsp;Math.floor(frame&nbsp;/&nbsp;8)&nbsp;%&nbsp;2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;4,&nbsp;y&nbsp;+&nbsp;9,&nbsp;24,&nbsp;12,&nbsp;&quot;#22c55e&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;24,&nbsp;y&nbsp;+&nbsp;6,&nbsp;10,&nbsp;10,&nbsp;&quot;#16a34a&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;31,&nbsp;y&nbsp;+&nbsp;9,&nbsp;6,&nbsp;5,&nbsp;&quot;#15803d&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;27,&nbsp;y&nbsp;+&nbsp;8,&nbsp;3,&nbsp;3,&nbsp;&quot;#f8fafc&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;28,&nbsp;y&nbsp;+&nbsp;9,&nbsp;2,&nbsp;2,&nbsp;&quot;#111827&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;-&nbsp;3,&nbsp;y&nbsp;+&nbsp;13,&nbsp;10,&nbsp;6,&nbsp;&quot;#15803d&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;8,&nbsp;y&nbsp;+&nbsp;(flap&nbsp;?&nbsp;1&nbsp;:&nbsp;-5),&nbsp;14,&nbsp;8,&nbsp;&quot;#86efac&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;10,&nbsp;y&nbsp;+&nbsp;(flap&nbsp;?&nbsp;3&nbsp;:&nbsp;-3),&nbsp;10,&nbsp;4,&nbsp;&quot;#bbf7d0&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;12,&nbsp;y&nbsp;+&nbsp;21,&nbsp;4,&nbsp;5,&nbsp;&quot;#166534&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;22,&nbsp;y&nbsp;+&nbsp;21,&nbsp;4,&nbsp;5,&nbsp;&quot;#166534&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawEnemy(e)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;x&nbsp;=&nbsp;e.x&nbsp;-&nbsp;cameraX;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;y&nbsp;=&nbsp;e.y;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(e.type&nbsp;===&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;3,&nbsp;y&nbsp;+&nbsp;5,&nbsp;18,&nbsp;12,&nbsp;&quot;#7c2d12&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x,&nbsp;y&nbsp;+&nbsp;8,&nbsp;6,&nbsp;6,&nbsp;&quot;#f97316&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;19,&nbsp;y&nbsp;+&nbsp;8,&nbsp;6,&nbsp;6,&nbsp;&quot;#f97316&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;8,&nbsp;y&nbsp;+&nbsp;2,&nbsp;8,&nbsp;4,&nbsp;&quot;#fed7aa&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(e.type&nbsp;===&nbsp;1)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;3,&nbsp;y&nbsp;+&nbsp;4,&nbsp;18,&nbsp;14,&nbsp;&quot;#6d28d9&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;7,&nbsp;y,&nbsp;4,&nbsp;5,&nbsp;&quot;#a78bfa&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;15,&nbsp;y,&nbsp;4,&nbsp;5,&nbsp;&quot;#a78bfa&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;9,&nbsp;y&nbsp;+&nbsp;9,&nbsp;3,&nbsp;3,&nbsp;&quot;#f8fafc&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;4,&nbsp;y&nbsp;+&nbsp;7,&nbsp;16,&nbsp;10,&nbsp;&quot;#0f766e&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x,&nbsp;y&nbsp;+&nbsp;4,&nbsp;7,&nbsp;5,&nbsp;&quot;#5eead4&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;18,&nbsp;y&nbsp;+&nbsp;4,&nbsp;7,&nbsp;5,&nbsp;&quot;#5eead4&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;9,&nbsp;y&nbsp;+&nbsp;3,&nbsp;6,&nbsp;4,&nbsp;&quot;#ccfbf1&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawCastle()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;x&nbsp;=&nbsp;WORLD_W&nbsp;-&nbsp;180&nbsp;-&nbsp;cameraX;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;y&nbsp;=&nbsp;232;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x,&nbsp;y,&nbsp;112,&nbsp;82,&nbsp;&quot;#64748b&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;12,&nbsp;y&nbsp;-&nbsp;42,&nbsp;28,&nbsp;42,&nbsp;&quot;#475569&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;72,&nbsp;y&nbsp;-&nbsp;56,&nbsp;28,&nbsp;56,&nbsp;&quot;#475569&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;18,&nbsp;y&nbsp;-&nbsp;58,&nbsp;16,&nbsp;16,&nbsp;&quot;#ef4444&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;78,&nbsp;y&nbsp;-&nbsp;72,&nbsp;16,&nbsp;16,&nbsp;&quot;#ef4444&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;45,&nbsp;y&nbsp;+&nbsp;35,&nbsp;24,&nbsp;47,&nbsp;&quot;#1e293b&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;5;&nbsp;i++)&nbsp;pixelRect(x&nbsp;+&nbsp;8&nbsp;+&nbsp;i&nbsp;*&nbsp;20,&nbsp;y&nbsp;+&nbsp;14,&nbsp;10,&nbsp;12,&nbsp;&quot;#94a3b8&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;-&nbsp;18,&nbsp;y&nbsp;+&nbsp;70,&nbsp;148,&nbsp;12,&nbsp;&quot;#334155&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;shootFire()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dragon.fireCd&nbsp;&gt;&nbsp;0&nbsp;||&nbsp;gameState&nbsp;!==&nbsp;&quot;play&quot;)&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireballs.push({
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x:&nbsp;dragon.x&nbsp;+&nbsp;dragon.w&nbsp;-&nbsp;2,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y:&nbsp;dragon.y&nbsp;+&nbsp;11,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;w:&nbsp;14,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h:&nbsp;8,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vx:&nbsp;7.5,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;life:&nbsp;90
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.fireCd&nbsp;=&nbsp;14;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;5;&nbsp;i++)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;particles.push({&nbsp;x:&nbsp;dragon.x&nbsp;+&nbsp;34,&nbsp;y:&nbsp;dragon.y&nbsp;+&nbsp;14,&nbsp;vx:&nbsp;Math.random()&nbsp;*&nbsp;2,&nbsp;vy:&nbsp;Math.random()&nbsp;*&nbsp;2&nbsp;-&nbsp;1,&nbsp;life:&nbsp;12&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;damageDragon()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dragon.inv&nbsp;&gt;&nbsp;0&nbsp;||&nbsp;gameState&nbsp;!==&nbsp;&quot;play&quot;)&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.hp--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.inv&nbsp;=&nbsp;80;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateHud();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageEl.textContent&nbsp;=&nbsp;&quot;小龍受傷了！小心敵人。&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dragon.hp&nbsp;&lt;=&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gameState&nbsp;=&nbsp;&quot;lose&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageEl.textContent&nbsp;=&nbsp;&quot;挑戰失敗，按&nbsp;R&nbsp;重新開始。&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;update()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.has(&quot;r&quot;)&nbsp;||&nbsp;keys.has(&quot;R&quot;))&nbsp;resetGame();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gameState&nbsp;!==&nbsp;&quot;play&quot;)&nbsp;return;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;ax&nbsp;=&nbsp;0,&nbsp;ay&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.has(&quot;ArrowRight&quot;)&nbsp;||&nbsp;keys.has(&quot;d&quot;)&nbsp;||&nbsp;keys.has(&quot;D&quot;))&nbsp;ax&nbsp;+=&nbsp;0.45;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.has(&quot;ArrowLeft&quot;)&nbsp;||&nbsp;keys.has(&quot;a&quot;)&nbsp;||&nbsp;keys.has(&quot;A&quot;))&nbsp;ax&nbsp;-=&nbsp;0.45;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.has(&quot;ArrowUp&quot;)&nbsp;||&nbsp;keys.has(&quot;w&quot;)&nbsp;||&nbsp;keys.has(&quot;W&quot;))&nbsp;ay&nbsp;-=&nbsp;0.55;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.has(&quot;ArrowDown&quot;)&nbsp;||&nbsp;keys.has(&quot;s&quot;)&nbsp;||&nbsp;keys.has(&quot;S&quot;))&nbsp;ay&nbsp;+=&nbsp;0.55;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(keys.has(&quot;&nbsp;&quot;))&nbsp;shootFire();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.vx&nbsp;=&nbsp;(dragon.vx&nbsp;+&nbsp;ax)&nbsp;*&nbsp;0.86;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.vy&nbsp;=&nbsp;(dragon.vy&nbsp;+&nbsp;ay&nbsp;+&nbsp;0.05)&nbsp;*&nbsp;0.9;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.x&nbsp;+=&nbsp;dragon.vx;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.y&nbsp;+=&nbsp;dragon.vy;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.x&nbsp;=&nbsp;Math.max(20,&nbsp;Math.min(WORLD_W&nbsp;-&nbsp;220,&nbsp;dragon.x));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.y&nbsp;=&nbsp;Math.max(18,&nbsp;Math.min(286,&nbsp;dragon.y));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.fireCd&nbsp;=&nbsp;Math.max(0,&nbsp;dragon.fireCd&nbsp;-&nbsp;1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.inv&nbsp;=&nbsp;Math.max(0,&nbsp;dragon.inv&nbsp;-&nbsp;1);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cameraX&nbsp;=&nbsp;Math.max(0,&nbsp;Math.min(WORLD_W&nbsp;-&nbsp;W,&nbsp;dragon.x&nbsp;-&nbsp;180));

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireballs.forEach(f&nbsp;=&gt;&nbsp;{&nbsp;f.x&nbsp;+=&nbsp;f.vx;&nbsp;f.life--;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireballs&nbsp;=&nbsp;fireballs.filter(f&nbsp;=&gt;&nbsp;f.life&nbsp;&gt;&nbsp;0&nbsp;&amp;&amp;&nbsp;f.x&nbsp;&lt;&nbsp;WORLD_W);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enemies.forEach(e&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!e.alive)&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.y&nbsp;=&nbsp;e.baseY&nbsp;+&nbsp;Math.sin(frame&nbsp;*&nbsp;0.035&nbsp;+&nbsp;e.phase)&nbsp;*&nbsp;32;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.x&nbsp;-=&nbsp;0.35&nbsp;+&nbsp;e.type&nbsp;*&nbsp;0.05;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(e.x&nbsp;&lt;&nbsp;cameraX&nbsp;-&nbsp;80)&nbsp;e.x&nbsp;+=&nbsp;900;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rectsHit(dragon,&nbsp;e))&nbsp;damageDragon();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(const&nbsp;f&nbsp;of&nbsp;fireballs)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(const&nbsp;e&nbsp;of&nbsp;enemies)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!e.alive)&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rectsHit(f,&nbsp;e))&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.life&nbsp;=&nbsp;0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.hp--;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(let&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;10;&nbsp;i++)&nbsp;particles.push({&nbsp;x:&nbsp;e.x&nbsp;+&nbsp;12,&nbsp;y:&nbsp;e.y&nbsp;+&nbsp;11,&nbsp;vx:&nbsp;Math.random()&nbsp;*&nbsp;4&nbsp;-&nbsp;2,&nbsp;vy:&nbsp;Math.random()&nbsp;*&nbsp;4&nbsp;-&nbsp;2,&nbsp;life:&nbsp;18&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(e.hp&nbsp;&lt;=&nbsp;0)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.alive&nbsp;=&nbsp;false;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.score&nbsp;+=&nbsp;100;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateHud();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireballs&nbsp;=&nbsp;fireballs.filter(f&nbsp;=&gt;&nbsp;f.life&nbsp;&gt;&nbsp;0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;particles.forEach(p&nbsp;=&gt;&nbsp;{&nbsp;p.x&nbsp;+=&nbsp;p.vx;&nbsp;p.y&nbsp;+=&nbsp;p.vy;&nbsp;p.life--;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;particles&nbsp;=&nbsp;particles.filter(p&nbsp;=&gt;&nbsp;p.life&nbsp;&gt;&nbsp;0);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dragon.x&nbsp;&gt;&nbsp;WORLD_W&nbsp;-&nbsp;260)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gameState&nbsp;=&nbsp;&quot;win&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dragon.score&nbsp;+=&nbsp;500;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateHud();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageEl.textContent&nbsp;=&nbsp;&quot;通關成功！小龍抵達城堡。按&nbsp;R&nbsp;再玩一次。&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawFireball(f)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;x&nbsp;=&nbsp;f.x&nbsp;-&nbsp;cameraX;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x,&nbsp;f.y,&nbsp;14,&nbsp;8,&nbsp;&quot;#f97316&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;+&nbsp;7,&nbsp;f.y&nbsp;+&nbsp;2,&nbsp;9,&nbsp;4,&nbsp;&quot;#fde047&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(x&nbsp;-&nbsp;5,&nbsp;f.y&nbsp;+&nbsp;2,&nbsp;6,&nbsp;4,&nbsp;&quot;#dc2626&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;drawOverlay()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(gameState&nbsp;===&nbsp;&quot;play&quot;)&nbsp;return;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;&quot;rgba(15,&nbsp;23,&nbsp;42,&nbsp;0.7)&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillRect(0,&nbsp;0,&nbsp;W,&nbsp;H);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillStyle&nbsp;=&nbsp;&quot;#fff&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.font&nbsp;=&nbsp;&quot;24px&nbsp;monospace&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.textAlign&nbsp;=&nbsp;&quot;center&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillText(gameState&nbsp;===&nbsp;&quot;win&quot;&nbsp;?&nbsp;&quot;CLEAR!&nbsp;通關成功&quot;&nbsp;:&nbsp;&quot;GAME&nbsp;OVER&quot;,&nbsp;W&nbsp;/&nbsp;2,&nbsp;H&nbsp;/&nbsp;2&nbsp;-&nbsp;10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.font&nbsp;=&nbsp;&quot;14px&nbsp;monospace&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.fillText(&quot;按&nbsp;R&nbsp;重新開始&quot;,&nbsp;W&nbsp;/&nbsp;2,&nbsp;H&nbsp;/&nbsp;2&nbsp;+&nbsp;20);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.textAlign&nbsp;=&nbsp;&quot;left&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;draw()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawBackground();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawCastle();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enemies.forEach(e&nbsp;=&gt;&nbsp;{&nbsp;if&nbsp;(e.alive)&nbsp;drawEnemy(e);&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fireballs.forEach(drawFireball);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;particles.forEach(p&nbsp;=&gt;&nbsp;pixelRect(p.x&nbsp;-&nbsp;cameraX,&nbsp;p.y,&nbsp;3,&nbsp;3,&nbsp;p.life&nbsp;%&nbsp;2&nbsp;?&nbsp;&quot;#f97316&quot;&nbsp;:&nbsp;&quot;#fde047&quot;));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawDragon();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;progress&nbsp;=&nbsp;dragon.x&nbsp;/&nbsp;(WORLD_W&nbsp;-&nbsp;260);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(16,&nbsp;16,&nbsp;160,&nbsp;8,&nbsp;&quot;#1e293b&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pixelRect(18,&nbsp;18,&nbsp;Math.max(0,&nbsp;Math.min(156,&nbsp;156&nbsp;*&nbsp;progress)),&nbsp;4,&nbsp;&quot;#facc15&quot;);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drawOverlay();
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;loop()&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;update();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requestAnimationFrame(loop);
&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;window.addEventListener(&quot;keydown&quot;,&nbsp;e&nbsp;=&gt;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;([&quot;ArrowUp&quot;,&nbsp;&quot;ArrowDown&quot;,&nbsp;&quot;ArrowLeft&quot;,&nbsp;&quot;ArrowRight&quot;,&nbsp;&quot;&nbsp;&quot;].includes(e.key))&nbsp;e.preventDefault();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keys.add(e.key);
&nbsp;&nbsp;&nbsp;&nbsp;});
&nbsp;&nbsp;&nbsp;&nbsp;window.addEventListener(&quot;keyup&quot;,&nbsp;e&nbsp;=&gt;&nbsp;keys.delete(e.key));

&nbsp;&nbsp;&nbsp;&nbsp;resetGame();
&nbsp;&nbsp;&nbsp;&nbsp;loop();
&nbsp;&nbsp;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;


</code></pre></div>]]></description>
			<author><![CDATA[dummy@example.com (龍爪翻書)]]></author>
			<pubDate>Sat, 25 Apr 2026 09:01:06 +0000</pubDate>
			<guid>https://yinglong.org/forum/viewtopic.php?id=5037&amp;action=new</guid>
		</item>
	</channel>
</rss>
