認識的第一條龍向我推薦了這個地方
2026.4.26
爲了做地獄門原本的64倍熔爐組有點不太夠用了
64來自https://www.bilibili.com/video/BV1uE421w7Wo/,裝飾是後來自己做的。參考這款熔爐組我還搓了個38速的裝飾性大於實用性的熔爐組並做了一點改進塞在巨樹基地。
於是專門做了個320熔爐組

320來自https://www.bilibili.com/video/BV1bsegz1EUK/
原本想順便養龍蝦,叫龍蝦幫忙發布到GitHub,發現沒想像中好弄
還是先繼續貼純文字過來吧
像素風格、橫版通關遊戲

<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>像素小龍橫版通關</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
min-height: 100vh;
display: grid;
place-items: center;
background: #111827;
color: #e5e7eb;
font-family: "Noto Sans TC", system-ui, sans-serif;
user-select: none;
}
.wrap {
width: min(960px, 100vw);
padding: 12px;
}
h1 {
margin: 0 0 8px;
font-size: 20px;
letter-spacing: 2px;
}
.hud {
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
margin-bottom: 8px;
font-size: 14px;
opacity: 0.95;
}
canvas {
width: 100%;
aspect-ratio: 16 / 9;
display: block;
border: 4px solid #374151;
border-radius: 10px;
background: #7dd3fc;
image-rendering: pixelated;
box-shadow: 0 16px 40px rgba(0, 0, 0, 0.35);
}
.help {
margin-top: 8px;
font-size: 14px;
line-height: 1.6;
color: #cbd5e1;
}
kbd {
padding: 2px 6px;
border-radius: 4px;
background: #334155;
color: white;
border-bottom: 2px solid #0f172a;
}
</style>
</head>
<body>
<div class="wrap">
<h1>🐉 像素小龍:火焰通關</h1>
<div class="hud">
<div id="status">生命:3 分數:0</div>
<div id="message">飛到右方城堡即可通關!</div>
</div>
<canvas id="game" width="640" height="360"></canvas>
<div class="help">
操作:<kbd>W</kbd>/<kbd>↑</kbd> 上飛,<kbd>S</kbd>/<kbd>↓</kbd> 下飛,<kbd>A</kbd>/<kbd>←</kbd> 左移,<kbd>D</kbd>/<kbd>→</kbd> 右移,<kbd>空白鍵</kbd> 噴火球,<kbd>R</kbd> 重新開始。
</div>
</div>
<script>
const canvas = document.getElementById("game");
const ctx = canvas.getContext("2d");
const statusEl = document.getElementById("status");
const messageEl = document.getElementById("message");
const W = canvas.width;
const H = canvas.height;
const WORLD_W = 3600;
const keys = new Set();
let cameraX = 0;
let frame = 0;
let gameState = "play";
const dragonStart = { x: 70, y: 160 };
const dragon = {
x: dragonStart.x,
y: dragonStart.y,
w: 34,
h: 24,
vx: 0,
vy: 0,
hp: 3,
inv: 0,
fireCd: 0,
score: 0
};
let fireballs = [];
let enemies = [];
let particles = [];
let clouds = [];
function resetGame() {
cameraX = 0;
frame = 0;
gameState = "play";
Object.assign(dragon, {
x: dragonStart.x, y: dragonStart.y, vx: 0, vy: 0,
hp: 3, inv: 0, fireCd: 0, score: 0
});
fireballs = [];
particles = [];
enemies = [];
clouds = [];
for (let i = 0; i < 18; i++) {
clouds.push({
x: i * 220 + Math.random() * 90,
y: 30 + Math.random() * 95,
s: 1 + Math.random() * 1.4
});
}
for (let i = 0; i < 24; i++) {
enemies.push({
x: 380 + i * 130 + Math.random() * 60,
y: 70 + Math.random() * 190,
w: 24,
h: 22,
baseY: 70 + Math.random() * 190,
hp: i % 5 === 0 ? 2 : 1,
type: i % 3,
alive: true,
phase: Math.random() * Math.PI * 2
});
}
updateHud();
messageEl.textContent = "飛到右方城堡即可通關!";
}
function updateHud() {
statusEl.textContent = `生命:${dragon.hp} 分數:${dragon.score}`;
}
function rectsHit(a, b) {
return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;
}
function pixelRect(x, y, w, h, color) {
ctx.fillStyle = color;
ctx.fillRect(Math.round(x), Math.round(y), Math.round(w), Math.round(h));
}
function drawCloud(c) {
const x = c.x - cameraX * 0.35;
const y = c.y;
pixelRect(x, y + 8 * c.s, 34 * c.s, 10 * c.s, "#f8fafc");
pixelRect(x + 8 * c.s, y, 18 * c.s, 18 * c.s, "#f8fafc");
pixelRect(x + 24 * c.s, y + 4 * c.s, 20 * c.s, 14 * c.s, "#e0f2fe");
}
function drawBackground() {
const grad = ctx.createLinearGradient(0, 0, 0, H);
grad.addColorStop(0, "#38bdf8");
grad.addColorStop(0.65, "#bae6fd");
grad.addColorStop(1, "#86efac");
ctx.fillStyle = grad;
ctx.fillRect(0, 0, W, H);
clouds.forEach(drawCloud);
ctx.fillStyle = "#60a5fa";
for (let x = -120; x < W + 160; x += 140) {
const mx = x - (cameraX * 0.15 % 140);
ctx.beginPath();
ctx.moveTo(mx, 265);
ctx.lineTo(mx + 75, 165);
ctx.lineTo(mx + 160, 265);
ctx.closePath();
ctx.fill();
}
ctx.fillStyle = "#22c55e";
ctx.fillRect(0, 314, W, 46);
ctx.fillStyle = "#15803d";
for (let x = -20; x < W + 20; x += 18) {
pixelRect(x - (cameraX % 18), 314, 9, 8, "#16a34a");
}
}
function drawDragon() {
const x = dragon.x - cameraX;
const y = dragon.y;
const blink = dragon.inv > 0 && Math.floor(frame / 5) % 2 === 0;
if (blink) return;
const flap = Math.floor(frame / 8) % 2;
pixelRect(x + 4, y + 9, 24, 12, "#22c55e");
pixelRect(x + 24, y + 6, 10, 10, "#16a34a");
pixelRect(x + 31, y + 9, 6, 5, "#15803d");
pixelRect(x + 27, y + 8, 3, 3, "#f8fafc");
pixelRect(x + 28, y + 9, 2, 2, "#111827");
pixelRect(x - 3, y + 13, 10, 6, "#15803d");
pixelRect(x + 8, y + (flap ? 1 : -5), 14, 8, "#86efac");
pixelRect(x + 10, y + (flap ? 3 : -3), 10, 4, "#bbf7d0");
pixelRect(x + 12, y + 21, 4, 5, "#166534");
pixelRect(x + 22, y + 21, 4, 5, "#166534");
}
function drawEnemy(e) {
const x = e.x - cameraX;
const y = e.y;
if (e.type === 0) {
pixelRect(x + 3, y + 5, 18, 12, "#7c2d12");
pixelRect(x, y + 8, 6, 6, "#f97316");
pixelRect(x + 19, y + 8, 6, 6, "#f97316");
pixelRect(x + 8, y + 2, 8, 4, "#fed7aa");
} else if (e.type === 1) {
pixelRect(x + 3, y + 4, 18, 14, "#6d28d9");
pixelRect(x + 7, y, 4, 5, "#a78bfa");
pixelRect(x + 15, y, 4, 5, "#a78bfa");
pixelRect(x + 9, y + 9, 3, 3, "#f8fafc");
} else {
pixelRect(x + 4, y + 7, 16, 10, "#0f766e");
pixelRect(x, y + 4, 7, 5, "#5eead4");
pixelRect(x + 18, y + 4, 7, 5, "#5eead4");
pixelRect(x + 9, y + 3, 6, 4, "#ccfbf1");
}
}
function drawCastle() {
const x = WORLD_W - 180 - cameraX;
const y = 232;
pixelRect(x, y, 112, 82, "#64748b");
pixelRect(x + 12, y - 42, 28, 42, "#475569");
pixelRect(x + 72, y - 56, 28, 56, "#475569");
pixelRect(x + 18, y - 58, 16, 16, "#ef4444");
pixelRect(x + 78, y - 72, 16, 16, "#ef4444");
pixelRect(x + 45, y + 35, 24, 47, "#1e293b");
for (let i = 0; i < 5; i++) pixelRect(x + 8 + i * 20, y + 14, 10, 12, "#94a3b8");
pixelRect(x - 18, y + 70, 148, 12, "#334155");
}
function shootFire() {
if (dragon.fireCd > 0 || gameState !== "play") return;
fireballs.push({
x: dragon.x + dragon.w - 2,
y: dragon.y + 11,
w: 14,
h: 8,
vx: 7.5,
life: 90
});
dragon.fireCd = 14;
for (let i = 0; i < 5; i++) {
particles.push({ x: dragon.x + 34, y: dragon.y + 14, vx: Math.random() * 2, vy: Math.random() * 2 - 1, life: 12 });
}
}
function damageDragon() {
if (dragon.inv > 0 || gameState !== "play") return;
dragon.hp--;
dragon.inv = 80;
updateHud();
messageEl.textContent = "小龍受傷了!小心敵人。";
if (dragon.hp <= 0) {
gameState = "lose";
messageEl.textContent = "挑戰失敗,按 R 重新開始。";
}
}
function update() {
frame++;
if (keys.has("r") || keys.has("R")) resetGame();
if (gameState !== "play") return;
let ax = 0, ay = 0;
if (keys.has("ArrowRight") || keys.has("d") || keys.has("D")) ax += 0.45;
if (keys.has("ArrowLeft") || keys.has("a") || keys.has("A")) ax -= 0.45;
if (keys.has("ArrowUp") || keys.has("w") || keys.has("W")) ay -= 0.55;
if (keys.has("ArrowDown") || keys.has("s") || keys.has("S")) ay += 0.55;
if (keys.has(" ")) shootFire();
dragon.vx = (dragon.vx + ax) * 0.86;
dragon.vy = (dragon.vy + ay + 0.05) * 0.9;
dragon.x += dragon.vx;
dragon.y += dragon.vy;
dragon.x = Math.max(20, Math.min(WORLD_W - 220, dragon.x));
dragon.y = Math.max(18, Math.min(286, dragon.y));
dragon.fireCd = Math.max(0, dragon.fireCd - 1);
dragon.inv = Math.max(0, dragon.inv - 1);
cameraX = Math.max(0, Math.min(WORLD_W - W, dragon.x - 180));
fireballs.forEach(f => { f.x += f.vx; f.life--; });
fireballs = fireballs.filter(f => f.life > 0 && f.x < WORLD_W);
enemies.forEach(e => {
if (!e.alive) return;
e.y = e.baseY + Math.sin(frame * 0.035 + e.phase) * 32;
e.x -= 0.35 + e.type * 0.05;
if (e.x < cameraX - 80) e.x += 900;
if (rectsHit(dragon, e)) damageDragon();
});
for (const f of fireballs) {
for (const e of enemies) {
if (!e.alive) continue;
if (rectsHit(f, e)) {
f.life = 0;
e.hp--;
for (let i = 0; i < 10; i++) particles.push({ x: e.x + 12, y: e.y + 11, vx: Math.random() * 4 - 2, vy: Math.random() * 4 - 2, life: 18 });
if (e.hp <= 0) {
e.alive = false;
dragon.score += 100;
updateHud();
}
}
}
}
fireballs = fireballs.filter(f => f.life > 0);
particles.forEach(p => { p.x += p.vx; p.y += p.vy; p.life--; });
particles = particles.filter(p => p.life > 0);
if (dragon.x > WORLD_W - 260) {
gameState = "win";
dragon.score += 500;
updateHud();
messageEl.textContent = "通關成功!小龍抵達城堡。按 R 再玩一次。";
}
}
function drawFireball(f) {
const x = f.x - cameraX;
pixelRect(x, f.y, 14, 8, "#f97316");
pixelRect(x + 7, f.y + 2, 9, 4, "#fde047");
pixelRect(x - 5, f.y + 2, 6, 4, "#dc2626");
}
function drawOverlay() {
if (gameState === "play") return;
ctx.fillStyle = "rgba(15, 23, 42, 0.7)";
ctx.fillRect(0, 0, W, H);
ctx.fillStyle = "#fff";
ctx.font = "24px monospace";
ctx.textAlign = "center";
ctx.fillText(gameState === "win" ? "CLEAR! 通關成功" : "GAME OVER", W / 2, H / 2 - 10);
ctx.font = "14px monospace";
ctx.fillText("按 R 重新開始", W / 2, H / 2 + 20);
ctx.textAlign = "left";
}
function draw() {
drawBackground();
drawCastle();
enemies.forEach(e => { if (e.alive) drawEnemy(e); });
fireballs.forEach(drawFireball);
particles.forEach(p => pixelRect(p.x - cameraX, p.y, 3, 3, p.life % 2 ? "#f97316" : "#fde047"));
drawDragon();
const progress = dragon.x / (WORLD_W - 260);
pixelRect(16, 16, 160, 8, "#1e293b");
pixelRect(18, 18, Math.max(0, Math.min(156, 156 * progress)), 4, "#facc15");
drawOverlay();
}
function loop() {
update();
draw();
requestAnimationFrame(loop);
}
window.addEventListener("keydown", e => {
if (["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", " "].includes(e.key)) e.preventDefault();
keys.add(e.key);
});
window.addEventListener("keyup", e => keys.delete(e.key));
resetGame();
loop();
</script>
</body>
</html>
一些作品中的例子
@shiningdracon 寫道: 對幼體而言,成體或許對其試探性越界與能力挑戰表現出有限容忍(類似於對“練習性侵犯”的寬容),以降低過早致傷的風險,並促進獨立生存能力的形成。

@shiningdracon 寫道: 對成體之間的相遇,則更可能通過儀式化展示來劃定邊界,並在邊界明確後優先回避直接搏鬥。

變龍題材的小說中的描寫:
當初剛變成龍的時候,Lewis 最難接受的事情之一,就是他發現人類的道德觀和倫理觀似乎無法與自己新的龍族本能契合。
如果是在以前,當他還是人類的時候,光是想到殺死並喫掉一隻動物——更別說另一個人——都會讓他感到厭惡和恐懼。
但現在,這卻只是生存規則的一部分。
龍必須通過狩獵和殺戮才能活下去,因此它們的思維里根本沒有爲獵物感到愧疚或悔恨的位置。
不幸的是,這一點同樣適用於那些倒黴到成爲龍口中食物的人類。
在自己短暫的龍生中,Lewis 已經完整喫掉過兩個人,還有第三個人也被他喫掉了一部分。而在享用他們鮮嫩可口的血肉時,他從未真正因爲殺死他們而感到內疚。
誠然,其中一個是執意要取他性命的屠龍者;但另外幾個人不過是普通人,只是在履行自己的職責。
真正讓 Lewis 感到不安的,恰恰是自己對此毫不在意這一事實。
Lasthope 總是不停提醒他:他是一條龍,因此沒有必要因爲殺死人類而感到愧疚。即便如此,Lewis 仍然無法擺脫那種根深蒂固的人類思維——在他的觀念裏,殺害同類本身就是錯誤的。
他猜想,自己終究會跨過這道坎。
不過,現在倒也沒有什麼迫切的必要。尤其是在如今整座城市都持續爲他提供食物的情況下。
最后修改: shiningdracon (2026-05-31 11:31:58)
買設定只是其中一條路,
但如果要買的話,不妨在 FA 試試看 adopt 之類的關鍵字找找看有沒有心儀的設計,雖然我比較難想像在這種環境下找到跟自己有共鳴或連結的設定
我自己這麼多年,都沒弄完整的龍設
我覺得慢慢構思、逐步完善,這個尋找和創造的過程,也是自己的一部分~
感覺你可能找錯地方了……如果你單純只是需要一個用於社交的設定圖,完全可以在更大的公共平臺上尋找心儀的畫師或設定,甚至可以嘗試在約稿平臺上定製,這並不算太難。
請問龍設定可以從哪裏買 龍圈太小了 左求右求四面楚歌
2026.4.19
祭壇180k刷沙機完工,機器來自https://www.bilibili.com/video/BV1jfUHYXEXh/
另外看了https://www.bilibili.com/video/BV1PiDSBzEKw/這個視頻
計劃也做個存檔時間線在存檔中。
後記
這篇文章其實寫的不夠嚴謹,一方面水平有限,另一方面我更多想將其作爲一種開放式的思考提出,不想把觀點說得太絕對。
@shiningdracon 寫道: 龍會談論道德嗎?一些會談論道德的龍,實際是在說什麼?
我自己的元倫理學立場接近於“道德虛構主義”或者“錯誤論”,有“道德虛無主義”傾向。
@shiningdracon 寫道: 如果龍是一種在生理結構、繁殖方式、壽命尺度、感官能力和社會組織上都顯著不同於人類的智慧生物,那麼其道德基礎大概率也不會與人類一致。若其幼體獨立性更強,則“關愛”未必居於核心;若其不依賴穩定羣體進行長期合作,則以互惠分配爲核心的“公正”可能並不是穩定的內在直覺;若其缺少固定的羣體歸屬與身份認同,則“忠誠”與“權威”也難以成爲重要維度;若其長期鬆散獨居,羣居所帶來的疾病傳播風險顯著降低,那麼以疾病防護爲核心的“純潔”也就不再具有同等重要性。
有一種疑問是:社會性很弱的生物到底能不能產生道德規範與互利合作?
我自己的答案是“可以”。
弱社會性不等於零互動,哪怕是鬆散獨居生物,也仍可能存在這些場景:領地邊界反覆接觸、交配和育幼的合作、對共同威脅的聯合應對、對稀缺資源的輪流使用。只要這些互動不是一次性的,規範就有了出現空間。
這裏可以沿用契約主義的思路。道德首先不必須是“愛別人”,而是“在彼此都可能受損、又都可能獲益的情形下,找到可持續共處的規則”。在這種框架裏,道德規範可以被理解爲一種“借用了道德的名義”的工具性的策略。
龍與道德
龍會談論道德嗎?一些會談論道德的龍,實際是在說什麼?
許多包含龍的作品中會對龍做出一些道德預設,但這往往默認了一個前提:道德似乎是一種可以直接適用於龍的普適性內容。然而,這一前提未必成立。倘若存在一種與人類在生理結構、繁殖方式、壽命尺度、感官能力與社會組織上都顯著不同的智慧生物,那麼它是否仍會擁有與人類相同的道德?
人類道德的生理基礎
從生物學與社會演化的角度看,人類的道德首先具有明確的生理基礎。(參考 道德基礎理論)
關愛。大體來源於對幼體的長期照料需求
公正。來源於社會合作中的分配與互惠
忠誠。來源於羣體內部的識別、維繫與防禦
權威。來源於組織協調與秩序維持的需要
純潔。與羣居生活中的污染規避與疾病防護意識有關
這些傾向最初未必以“道德”形式出現,但在長期的文化積累中,它們被賦予規範意義,進而成爲倫理判斷的基礎。由此可見,道德並不是脫離生命結構而獨立存在的抽象物,而是與特定生物的生存方式密切相關。
道德的性質
然而,倫理學的問題並不止於“道德如何形成”,還包括“道德究竟是什麼”。
道德並不等於客觀事實,因爲事實本身不能自動推出規範
它也不等於個體的好惡,因爲道德判斷通常帶有普遍化要求
它更不等於社會主流意見,因爲一個社會的習俗、法律與多數立場都可能是不正當的
它也不是空洞修辭,因爲道德判斷會真實影響行動、剋制、責任與懲罰
因此,對人類而言,道德可以被描述爲一種建立在生理傾向之上、經由羣體生活塑造,並通過語言與反思不斷調整的規範結構。
從人類到龍的轉向(此處以獨居龍爲例)
在明確了道德與特定生命結構之間的關聯之後,問題便可以自然轉向龍。
如果龍是一種在生理結構、繁殖方式、壽命尺度、感官能力和社會組織上都顯著不同於人類的智慧生物,那麼其道德基礎大概率也不會與人類一致。若其幼體獨立性更強,則“關愛”未必居於核心;若其不依賴穩定羣體進行長期合作,則以互惠分配爲核心的“公正”可能並不是穩定的內在直覺;若其缺少固定的羣體歸屬與身份認同,則“忠誠”與“權威”也難以成爲重要維度;若其長期鬆散獨居,羣居所帶來的疾病傳播風險顯著降低,那麼以疾病防護爲核心的“純潔”也就不再具有同等重要性。
在這一前提下,其“類道德”直覺可能更強調在遭遇他者時通過展示與距離維持來避免受傷與資源損失(如以姿態、吼叫或氣味宣示領地,迫使對方退卻),而非羣體義務。
對幼體而言,成體或許對其試探性越界與能力挑戰表現出有限容忍(類似於對“練習性侵犯”的寬容),以降低過早致傷的風險,並促進獨立生存能力的形成。
對成體之間的相遇,則更可能通過儀式化展示來劃定邊界,並在邊界明確後優先回避直接搏鬥。
由此形成的規範重點,不在於“應當合作”,而在於:避免不必要的傷害、對破壞既定邊界保持謹慎,以及以最小代價解決衝突。
據此可以得到一個初步判斷:所謂道德,並不必然是所有智慧生物共享的一套固定內容,而更可能是不同生命形式對自身生存條件的規範性回應。
人類的道德僅是人類這一物種的道德,龍的“道德”也將反映其自身的生命結構。在獨居前提下,這種“道德”不太可能圍繞羣體關係展開,而更可能表現爲一套關於邊界、侵入與自我維持的規範體系。
有 6 位朋友喜欢这篇文章:NancalaStarry, SmallDragon, 镜中龙影, 火柴龍, Forgotten, 箐岚
2026.4.15
開學了,忙裏抽閒做了個1w方塊體量的小建築,不過消耗的石英可不少,要不是之前掛了幾天的豬靈交易所還真不夠用。


爲了做這個建築順便把全種類蛙明燈農場做好了

準備換祭壇180k刷沙機,爲此把末地主島掏空

另一邊是村民交易所,刷了幾小時的附魔書終於實現附魔自由,保護4、經修隨便用


地上的龍圖騰是我照着很久之前網上的一個建築視頻抄的。交易所是專門針對1.20.1及以前的龍之生存設計的,失去了正常村交所的打折等功能,但是能讓所有成長階段的龍都能正常進入且構造簡單,沒有紅石部分。
沒看到村民?
才發現沒有發過一樓第一張圖中的基地的地下部分,裝飾很簡陋,多次想裝修但都因爲各種原因放棄,有時候會想要是有善於建築的龍來幫忙就好了:

另外關於巨龍之地mod的製作發現了許多bug,可能又暫時不會上線了跳票竟是我自己,暑假看看有沒有可能搞搞吧。
最後在給基地做個大~大~大~大~大點的地獄門,主要的石英其實都花在了這上面,敬請期待。
做了一個生態模擬用於計算每次獲取食物的能量,還沒想清楚對於這個項目有什麼用,但是先記錄一下:
import numpy as np
import random
import math
def levy_flight(alpha=1.5):
sigma_u = (math.gamma(1 + alpha) * np.sin(np.pi * alpha / 2) /
(math.gamma((1 + alpha) / 2) * alpha * 2**((alpha - 1) / 2)))**(1 / alpha)
u = np.random.normal(0, sigma_u)
v = np.random.normal(0, 1)
step = u / (abs(v)**(1 / alpha))
return np.clip(step, -50, 50)
def simulate():
# --- 核心参数调整 ---
food_energy_reward = 9000 # 初始单次食物能量
MAX_ENERGY = 150000 # 能量上限值(胃容量)
RESTART_THRESHOLD = 200 # 重启次数限制
total_resets = 0
food_energy_history = []
# 优化打印表头,新增:模拟步数、食物惩罚次数、每单位距离能量
print(f"{'次数':<5} | {'模拟步数':<6} | {'食物惩罚次数':<8} | {'食物单位能量':<12} | {'总获取能量':<12} | {'总移动距离':<12} | {'每单位距离能量':<14}")
print("-" * 110)
while total_resets < RESTART_THRESHOLD:
current_energy = 50000 # 每次重启的初始能量
total_distance = 0.0
total_gained_energy = 0
steps = 0
penalty_count = 0 # 新增:本轮食物惩罚触发次数
# 消耗系数
MOVE_COST_BASE = 800 # 稍微调高基础消耗
REST_COST = 200
FOOD_PROBABILITY = 0.12
# 单次模拟循环
while steps < 3000 and current_energy > 0:
steps += 1
# 行为判定
action_prob = 0.2 if current_energy > 50000 else 0.8
if random.random() < action_prob:
# 移动
step_len = abs(levy_flight()) * 10
total_distance += step_len
current_energy -= (MOVE_COST_BASE + step_len * 5)
# 觅食
if random.random() < FOOD_PROBABILITY:
# 实际增加的能量受上限限制
can_receive = MAX_ENERGY - current_energy
actual_gain = min(food_energy_reward, can_receive)
current_energy += actual_gain
total_gained_energy += actual_gain # 记录名义获取总量
# 规则:能量触碰高位,减少下次掉落(食物惩罚)
if current_energy > 100000:
food_energy_reward -= 1000
penalty_count += 1 # 惩罚次数+1
else:
# 休息
current_energy -= REST_COST
total_resets += 1
# ===================== 新增逻辑:计算每单位移动距离的能量 =====================
if total_distance > 0:
energy_per_unit = total_gained_energy / total_distance
else:
energy_per_unit = 0.0 # 没有移动时设为0
# 打印:轮次、步数、惩罚次数、单位能量、总能量、总距离、每单位距离能量
print(f"{total_resets:<5} | {steps:<6} | {penalty_count:<8} | {food_energy_reward:<12} | {int(total_gained_energy):<12} | {total_distance:<12.2f} | {energy_per_unit:<14.2f}")
# 规则:如果是因为能量耗尽而重置,则补偿食物能量
if current_energy <= 0:
food_energy_reward += 2000
# 防止食物能量变成负数
food_energy_reward = max(food_energy_reward, 1000)
# 稳定性判定
food_energy_history.append(food_energy_reward)
if len(food_energy_history) > 20:
last_window = food_energy_history[-15:]
if max(last_window) - min(last_window) <= 6000:
print(f"\n[系统提示] 经过 {total_resets} 次演化,最适单位食物能量稳定在: {food_energy_reward}")
break
if __name__ == "__main__":
simulate()
簡單小巧的肉類能量計算器

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>肉类能量计算器</title>
<style>
:root {
--primary-color: #e63946;
--bg-color: #f8f9fa;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: var(--bg-color);
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
.container {
background: white;
padding: 2rem;
border-radius: 12px;
box-shadow: 0 10px 25px rgba(0,0,0,0.1);
width: 100%;
max-width: 400px;
}
h2 {
text-align: center;
color: var(--primary-color);
margin-bottom: 1.5rem;
}
.input-group {
margin-bottom: 1.2rem;
}
label {
display: block;
margin-bottom: 0.5rem;
font-weight: bold;
color: #333;
}
select, input {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 6px;
box-sizing: border-box;
font-size: 1rem;
}
/* 单位切换样式 */
.unit-select {
margin-top: 8px;
}
button {
width: 100%;
padding: 12px;
background-color: var(--primary-color);
color: white;
border: none;
border-radius: 6px;
font-size: 1.1rem;
cursor: pointer;
transition: background 0.3s;
}
button:hover {
background-color: #c1121f;
}
#result {
margin-top: 1.5rem;
padding: 1rem;
background-color: #fff3f3;
border-left: 5px solid var(--primary-color);
display: none;
}
.calories-val {
font-size: 1.5rem;
font-weight: bold;
color: var(--primary-color);
}
</style>
</head>
<body>
<div class="container">
<h2>肉类能量计算器</h2>
<div class="input-group">
<label for="meatType">选择肉类品种</label>
<select id="meatType">
<option value="143">猪肉 (瘦)</option>
<option value="395">猪肉 (肥瘦)</option>
<option value="106">牛肉 (瘦)</option>
<option value="125">羊肉 (瘦)</option>
<option value="167">鸡胸肉</option>
<option value="240">鸡腿肉 (带皮)</option>
<option value="240">鸭肉</option>
<option value="115">鱼肉 (草鱼平均)</option>
<option value="91">虾肉</option>
</select>
</div>
<div class="input-group">
<label for="weight">输入质量</label>
<input type="number" id="weight" placeholder="例如: 100" min="0">
<!-- 新增单位切换下拉框 -->
<select id="unit" class="unit-select" onchange="updateUnitLabel()">
<option value="g">克 (g)</option>
<option value="kg">千克 (kg)</option>
</select>
</div>
<button onclick="calculate()">计算能量</button>
<div id="result">
<span id="output-text">预计摄入热量:</span><br>
<span class="calories-val" id="caloriesDisplay">0</span> 千卡 (kcal)
</div>
</div>
<script>
// 初始化时更新单位提示文字
window.onload = updateUnitLabel;
// 更新输入框的单位提示
function updateUnitLabel() {
const unit = document.getElementById('unit').value;
const weightInput = document.getElementById('weight');
if(unit === 'g'){
weightInput.placeholder = "例如: 100";
}else{
weightInput.placeholder = "例如: 0.5";
}
}
function calculate() {
const kcalPer100g = parseFloat(document.getElementById('meatType').value);
const weight = parseFloat(document.getElementById('weight').value);
const unit = document.getElementById('unit').value;
const resultDiv = document.getElementById('result');
const display = document.getElementById('caloriesDisplay');
// 验证输入
if (isNaN(weight) || weight <= 0) {
alert("请输入有效的质量!");
return;
}
let totalCalories;
// 根据单位自动换算
if(unit === 'g'){
// 克计算:(每100g热量 / 100) * 克数
totalCalories = (kcalPer100g / 100 * weight).toFixed(1);
}else{
// 千克计算:每100g热量 * 10 * 千克数
totalCalories = (kcalPer100g * 10 * weight).toFixed(1);
}
display.innerText = totalCalories;
resultDiv.style.display = 'block';
}
</script>
</body>
</html>

一條可怕的巨龍正威脅要燒燬王國裏的所有村莊!幸運的是,龍非常貪婪,所以如果你能用戰場上的寶物(比如野蠻人的戰斧或鳳凰羽毛)來賄賂它,也許可以說服它放過你的村莊。不幸的是,王國裏的其他村民也有同樣的想法。誰能把握最佳時機行賄,讓自己的寶物在遊戲結束時最受巨龍青睞呢?
在《Please Don't Burn My Village!》(設定於《Castle Panic》的世界中)這款遊戲裏,你需要在恰當的時機用合適的寶物進行賄賂,以持續吸引巨龍的注意力——同時還要在黑市購買寶物,並對其他村民的寶物施加詛咒。當所有寶物耗盡時,巨龍將燒燬所有村莊,只留下一個倖存。你的村莊會是倖存的那個嗎?

更具體地說,玩家手中持有一組寶物卡,可以用來:
1)賄賂巨龍;
2)從黑市購買更多寶物卡;
3)抽取一張寶物卡。
當玩家賄賂巨龍時,會將卡牌按組放在自己面前,使代表巨龍偏好的指示物向有利於巨龍的方向上升,並向黑市補充更多卡牌。
如果玩家選擇在黑市購買,則需要從手牌中支付某個攤位所標示數量的卡牌,將該攤位的卡牌收入手中,並使與其支付卡牌中某一張類型相匹配的寶物在巨龍偏好中的價值下降。無論是賄賂(上升)還是購買(下降),指示物移動的格數都等於所打出的卡牌數量。如果玩家不想影響巨龍的偏好值,或者手中無牌可用,也可以選擇直接抽一張牌。
遊戲採用“試探運氣”的結局機制:每當有人賄賂巨龍時,就會翻開卡牌並放入黑市位置,直到出現一張匹配卡或萬能牌爲止。如果始終沒有翻出匹配卡且牌庫耗盡,遊戲立即結束。此時玩家將手中剩餘的卡牌加入到與自己之前打出卡牌相匹配的賄賂中。最終得分最高的玩家獲勝,其村莊將免於災難。
https://firesidegames.com/products/please-dont-burn-my-village
https://boardgamearena.com/gamepanel?game=pleasedontburnmyvillage
BMR(Basal Metabolic Rate 基礎代謝率)計算器,通常乘一個常數後就能近似表示爲動物的每日消耗能量。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>跨物种 BMR 计算器</title>
<style>
:root {
--primary: #4a90e2;
--secondary: #f5f7fa;
--text: #333;
--accent: #50c878;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: var(--secondary);
color: var(--text);
margin: 0;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.container {
display: flex;
gap: 20px;
max-width: 900px;
width: 95%;
flex-wrap: wrap;
}
.card {
background: white;
padding: 2rem;
border-radius: 15px;
box-shadow: 0 10px 25px rgba(0,0,0,0.1);
flex: 1;
min-width: 300px;
}
.sidebar {
background: white;
padding: 1.5rem;
border-radius: 15px;
width: 250px;
box-shadow: 0 5px 15px rgba(0,0,0,0.05);
}
h2 { color: var(--primary); margin-top: 0; }
.input-group { margin-bottom: 1.5rem; }
label { display: block; margin-bottom: 0.5rem; font-weight: bold; }
input, select {
width: 100%;
padding: 10px;
border: 1px solid #ddd;
border-radius: 8px;
box-sizing: border-box;
}
.preset-btns {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 10px;
margin-bottom: 1.5rem;
}
button {
padding: 10px;
border: none;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
background: #eee;
}
button.active {
background: var(--primary);
color: white;
}
.calc-btn {
background: var(--accent);
color: white;
width: 100%;
font-size: 1.1rem;
font-weight: bold;
}
.result {
margin-top: 20px;
padding: 15px;
background: #eef9f1;
border-left: 5px solid var(--accent);
display: none;
}
.info-table {
width: 100%;
font-size: 0.9rem;
border-collapse: collapse;
}
.info-table th, .info-table td {
text-align: left;
padding: 8px;
border-bottom: 1px solid #eee;
}
</style>
</head>
<body>
<div class="container">
<div class="card">
<h2>BMR 计算器</h2>
<p style="font-size: 0.8rem; color: #666;">公式: $BMR = k \times \text{体重}^{0.75}$</p>
<label>选择物种预设</label>
<div class="preset-btns" id="presets">
<button onclick="setPreset('human', 70)">人类</button>
<button onclick="setPreset('cat', 60)">猫科</button>
<button onclick="setPreset('dog', 70)">犬类</button>
<button onclick="setPreset('bird', 129)">鸟类 (雀形目)</button>
<button onclick="setPreset('custom', 0)">自定义系数</button>
</div>
<div class="input-group">
<label for="weight">体重 (kg)</label>
<input type="number" id="weight" placeholder="请输入体重" step="0.1">
</div>
<div class="input-group" id="custom-k-group" style="display: none;">
<label for="k-value">自定义代谢系数 (k)</label>
<input type="number" id="k-value" value="70">
</div>
<button class="calc-btn" onclick="calculateBMR()">立即计算</button>
<div id="result" class="result">
<strong>计算结果:</strong>
<p id="bmr-output"></p>
</div>
</div>
<div class="sidebar">
<h3>常见动物 BMR 参考</h3>
<p style="font-size: 0.8rem; color: #777; margin-bottom: 15px;">(基于典型成年个体估算)</p>
<table class="info-table">
<thead>
<tr><th>物种</th><th>体重</th><th>约计 BMR</th></tr>
</thead>
<tbody>
<tr><td>麻雀</td><td>25g</td><td>4 kcal/d</td></tr>
<tr><td>家猫</td><td>4kg</td><td>170 kcal/d</td></tr>
<tr><td>中型犬</td><td>15kg</td><td>530 kcal/d</td></tr>
<tr><td>成年男</td><td>70kg</td><td>1690 kcal/d</td></tr>
<tr><td>大象</td><td>3000kg</td><td>28500 kcal/d</td></tr>
</tbody>
</table>
</div>
</div>
<script>
let currentK = 70;
function setPreset(type, k) {
// 更新按钮状态
const btns = document.querySelectorAll('#presets button');
btns.forEach(btn => btn.classList.remove('active'));
event.target.classList.add('active');
// 处理自定义逻辑
const kGroup = document.getElementById('custom-k-group');
if (type === 'custom') {
kGroup.style.display = 'block';
} else {
kGroup.style.display = 'none';
currentK = k;
document.getElementById('k-value').value = k;
}
}
function calculateBMR() {
const weight = parseFloat(document.getElementById('weight').value);
const k = parseFloat(document.getElementById('k-value').value);
if (!weight || weight <= 0) {
alert("请输入有效的体重!");
return;
}
// 使用克莱伯定律公式: BMR = k * W^0.75
const bmr = k * Math.pow(weight, 0.75);
const resultDiv = document.getElementById('result');
const output = document.getElementById('bmr-output');
resultDiv.style.display = 'block';
output.innerHTML = `该个体的基础代谢率 (BMR) 约为:<br><b style="font-size: 1.4rem; color: #50c878;">${bmr.toFixed(2)}</b> kcal/日`;
}
// 默认选中人类
window.onload = () => {
document.querySelector('#presets button').click();
};
</script>
</body>
</html>
@Sherixs 寫道: 人與西方龍的史詩鬥爭
正考慮重啓初中創作的《聖者與龍》故事(名字當然是來自於瞭解過的《女巫與聖者》樂曲)
聽着就很像宗教故事的擦邊對吧 但是這部作品更多是想將兩種族拉到一種地位平等的局面,宣揚一些現代人需要的寶貴品質.
目前非常缺天使的史詩形象.雖然我知道《暗黑破壞神》系列的天使已經做得很好了,很具備現代人的審美,但我還是想創造有作品獨特性的.看來得花點時間構思了.
續集的一個重要任務就是要將正傳內容和D&S外傳的內容聯繫起來.謝里斯整天想着開新坑的日子該結束了:D
篇幅不出意外的話依然對標前作,也就是可以翻拍成電影的程度.最好要在續作裏引入之前構思過的新角色,有效利用資源 還有一個方便的點就是前作是第三人稱視角,是我目前更想入手的寫作方式.龍族世界的地貌最好也趕緊補充一點...
[正在嘗試欣賞Moses Sumney的Doomed]
@Sherixs 寫道: 人類可以直接取死去龍的骨架來造飛行器啊,這就解決材料問題了
骨架只是支撐結構的材料。早期的滑翔機用木材、竹材作爲支撐結構的材料,一樣能飛。說明這部分材料不是瓶頸。
@Sherixs 寫道: 我說的“作爲一種對其他龍的威懾,即便有哪條龍知道解藥,也不一定會分享給其他龍”難道就不算龍之間的利益衝突嗎
可以算,但僅僅是可能性之一,不是定數。你自己也說“不一定會”,同理“不一定不會”也成立。同樣的“利益衝突”,在人類身上也存在,但人類還是會交換信息。
所以我在24樓已經說了,過於具體的預設由於缺乏定數,討論價值不大。
@Sherixs 寫道: 還有爲什麼要把人的能力看得那麼弱呢
可你也指不出來具體弱在哪,那又有什麼理由認爲人類被低估了呢。以黑死病爲例的推演我也給你做了。何況這篇文章本來就是爲了平衡 “羣居 = 強” 這種刻板印象。
實際上有很多對人類的印象來源於最近幾百年科技爆發式進步後的社會,而忘了古早的人類實際是什麼樣子。
[↑] @shiningdracon 寫道: 一直都有飛鳥可供參考。風箏也很早就被髮明瞭。但是滑翔機卻直到工業革命時代才被髮明出來。所以光有參考還不夠。 …
人類可以直接取死去龍的骨架來造飛行器啊,這就解決材料問題了
@shiningdracon 寫道: 本帖僅從人類社會組織構成要素這一角度展開分析。
爲什麼不早說呢,不然能聊的就太多了 我說的“作爲一種對其他龍的威懾,即便有哪條龍知道解藥,也不一定會分享給其他龍”難道就不算龍之間的利益衝突嗎;還有爲什麼要把人的能力看得那麼弱呢
最后修改: Sherixs (2026-04-09 16:23:42)
[↑] @SmallDragon 寫道: 加入混戰概念,很容易構建利益衝突龍v龍v人v人還可以 龍+人v人+龍v龍v人 …
這個可以