canvas实现成本预算的造桥修桥游戏代码

代码语言:html

所属分类:游戏

代码描述:canvas实现成本预算的造桥修桥游戏代码,每种材料价格不一样,选择材料点击拖拽连线修桥,最后点击开始测试,有车子行驶上来检测桥会不会塌方。

代码标签: canvas 成本 预算 造桥 修桥 游戏 代码

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>桥梁建造模拟器</title>
<style>
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
body {
  overflow: hidden;
  background: #87ceeb;
  font-family: "Microsoft YaHei", Arial, sans-serif;
  user-select: none;
}
#container {
  width: 100vw;
  height: 100vh;
  position: relative;
}
#threeCanvas {
  position: absolute;
  top: 0;
  left: 0;
}
/* 顶部状态栏 */
#topBar {
  position: absolute;
  top: 10px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  align-items: center;
  gap: 20px;
  z-index: 100;
}
#statusText {
  color: white;
  background: rgba(0, 0, 0, 0.7);
  padding: 8px 16px;
  border-radius: 4px;
  font-size: 16px;
  font-weight: bold;
  white-space: nowrap;
}
#budgetDisplay {
  color: white;
  background: rgba(0, 0, 0, 0.7);
  padding: 8px 16px;
  border-radius: 4px;
  font-size: 14px;
  white-space: nowrap;
}
/* 材料选择面板 */
#materialPanel {
  position: absolute;
  top: 60px;
  left: 10px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  z-index: 100;
}
.mat-btn {
  background: rgba(0, 0, 0, 0.7);
  color: white;
  border: 2px solid transparent;
  padding: 8px 12px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 13px;
  text-align: left;
  transition: border-color 0.15s, background 0.15s;
  min-width: 140px;
}
.mat-btn:hover {
  background: rgba(40, 40, 40, 0.8);
}
.mat-btn.active {
  border-color: #00ff88;
  background: rgba(0, 80, 40, 0.8);
}
.mat-btn .key-hint {
  float: right;
  opacity: 0.5;
  font-size: 11px;
}
/* 底部控制栏 */
#bottomBar {
  position: absolute;
  bottom: 10px;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  gap: 10px;
  z-index: 100;
}
.ctrl-btn {
  background: rgba(0, 0, 0, 0.7);
  color: white;
  border: 2px solid transparent;
  padding: 10px 20px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 14px;
  font-weight: bold;
  transition: background 0.15s, border-color 0.15s;
}
.ctrl-btn:hover {
  background: rgba(60, 60, 60, 0.8);
}
.ctrl-btn.play-btn {
  border-color: #4caf50;
  min-width: 100px;
}
.ctrl-btn.delete-btn.active {
  border-color: #f44336;
  background: rgba(120, 20, 20, 0.8);
}
/* 操作说明 */
#instructions {
  position: absolute;
  bottom: 60px;
  left: 50%;
  transform: translateX(-50%);
  color: white;
  background: rgba(0, 0, 0, 0.5);
  padding: 6px 12px;
  border-radius: 4px;
  font-size: 12px;
  z-index: 100;
  white-space: nowrap;
}
</style>
</head>
<body translate="no">
<div id="container">
  <canvas id="threeCanvas"></canvas>
  <div id="topBar">
    <div id="statusText">建造你的桥梁!</div>
    <div id="budgetDisplay">预算:$5000 / $5000</div>
  </div>
  <div id="materialPanel">
    <button class="mat-btn active" data-material="ROAD">
      路面 - $100/单位 <span class="key-hint">1</span>
    </button>
    <button class="mat-btn" data-material="WOOD">
      木材 - $50/单位 <span class="key-hint">2</span>
    </button>
    <button class="mat-btn" data-material="STEEL">
      钢材 - $200/单位 <span class="key-hint">3</span>
    </button>
    <button class="mat-btn" data-material="ROPE">
      绳索 - $30/单位 <span class="key-hint">4</span>
    </button>
  </div>
  <div id="bottomBar">
    <button class="ctrl-btn play-btn" id="playBtn">开始测试(空格)</button>
    <button class="ctrl-btn" id="resetBtn" style="display:none">重置(R)</button>
    <button class="ctrl-btn delete-btn" id="deleteBtn">删除(D)</button>
    <button class="ctrl-btn" id="clearBtn">清空全部</button>
    <button class="ctrl-btn" id="exampleBtn">示例桥梁(E)</button>
  </div>
  <div id="instructions">
    在锚点之间点击并拖拽以建造。红色锚点固定不动。
  </div>
</div>
<script>
// ...(此处保留原始 JavaScript 代码完全不变)...
// 因为逻辑未变,仅 UI 文字需翻译,JS 中涉及状态文本的部分已通过 UIManager 控制,
// 所以下方 JS 代码无需修改,只需确保 UIManager 的 setStatus 等调用使用中文即可。
// 实际上,原 JS 中所有用户可见文本都通过 UIManager 设置,我们已在 HTML 和 UIManager 初始化中处理。

async function initLibraries() {
if (document.readyState === "loading") {
await new Promise(resolve => {
document.addEventListener("DOMContentLoaded", resolve, { once: true });
});
}
const THREE = await import("https://esm.sh/three");
window.THREE = THREE;
const { default: initNape } = await import(
"https://cdn.sky.........完整代码请登录后点击上方下载按钮下载查看

网友评论0