单文件网页游戏应用生成器

72 浏览
4 试用
0 购买
Sep 1, 2025更新

根据用户定义的游戏产品名称和功能模块,生成一个完整的单文件网页应用。

示例1

好的,这是一个完整的、单文件HTML网页应用,名为“文字跑酷”。它实现了如下功能:横版卷轴场景、WASD键控制移动、动态生成的文字障碍物、实时计分,并且使用了Tailwind CSS美化界面。

以下是你的单页HTML代码:

```html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文字跑酷</title>
    <script src="https://cdn.tailwindcss.com"></script>
    <style>
        body {
            overflow: hidden;
        }
        canvas {
            display: block;
        }
    </style>
</head>

<body class="bg-gray-800 text-white flex flex-col justify-center items-center h-screen">

    <header class="absolute top-0 w-full bg-gray-900 text-center py-4">
        <h1 class="text-xl font-bold">文字跑酷</h1>
        <p class="text-sm">使用 WASD 键来移动,躲避文字障碍,尽可能生存更久吧!</p>
        <div class="text-sm">
            <span>得分:</span><span id="score" class="font-bold text-yellow-400">0</span>
        </div>
    </header>

    <div class="flex-1 relative w-full">
        <canvas id="gameCanvas"></canvas>
    </div>

    <footer class="absolute bottom-0 w-full bg-gray-900 text-center py-2 text-sm">
        <span>项目由 &copy; 2023 提供支持</span>
    </footer>

    <script>
        const canvas = document.getElementById("gameCanvas");
        const ctx = canvas.getContext("2d");

        // Set canvas size
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;

        let player = {
            x: 50,
            y: canvas.height / 2,
            width: 30,
            height: 30,
            color: "cyan",
            speed: 5,
        };

        let score = 0;
        let obstacles = [];
        let keys = { w: false, a: false, s: false, d: false };
        let lastTime = 0;
        let obstacleSpawnTimer = 0;

        // Helper function to draw text
        function drawText(text, x, y, size, color) {
            ctx.fillStyle = color || "white";
            ctx.font = `${size}px Arial`;
            ctx.fillText(text, x, y);
        }

        // Obstacle class
        class Obstacle {
            constructor(x, y, word) {
                this.x = x;
                this.y = y;
                this.word = word;
                this.width = word.length * 20;
                this.height = 30;
                this.color = "red";
            }

            draw() {
                ctx.fillStyle = this.color;
                ctx.fillRect(this.x, this.y, this.width, this.height);

                drawText(this.word, this.x + 5, this.y + 22, 16, "white");
            }

            update(deltaTime) {
                this.x -= 200 * (deltaTime / 1000);
            }
        }

        // Handle player movement
        function movePlayer() {
            if (keys.w && player.y > 0) player.y -= player.speed;
            if (keys.s && player.y + player.height < canvas.height) player.y += player.speed;
            if (keys.a && player.x > 0) player.x -= player.speed;
            if (keys.d && player.x + player.width < canvas.width) player.x += player.speed;
        }

        // Check collision
        function checkCollision(player, obstacle) {
            return (
                player.x < obstacle.x + obstacle.width &&
                player.x + player.width > obstacle.x &&
                player.y < obstacle.y + obstacle.height &&
                player.y + player.height > obstacle.y
            );
        }

        // Game loop
        function gameLoop(timestamp) {
            const deltaTime = timestamp - lastTime;
            lastTime = timestamp;

            ctx.clearRect(0, 0, canvas.width, canvas.height);

            // Update
            movePlayer();
            score += deltaTime / 1000;

            obstacleSpawnTimer += deltaTime;
            if (obstacleSpawnTimer > 2000) {
                const randomWord = ["代码", "跑酷", "文字", "编程", "游戏"][Math.floor(Math.random() * 5)];
                const randomY = Math.random() * (canvas.height - 60) + 30;
                obstacles.push(new Obstacle(canvas.width, randomY, randomWord));
                obstacleSpawnTimer = 0;
            }
            
            obstacles.forEach(obstacle => obstacle.update(deltaTime));
            obstacles = obstacles.filter(obstacle => obstacle.x > -obstacle.width);

            // Draw
            ctx.fillStyle = player.color;
            ctx.fillRect(player.x, player.y, player.width, player.height);

            obstacles.forEach(obstacle => {
                obstacle.draw();
                if (checkCollision(player, obstacle)) {
                    // End game if collision occurs
                    alert(`游戏结束!您的得分为:${Math.floor(score)}`);
                    obstacles = [];
                    score = 0;
                    player.x = 50;
                    player.y = canvas.height / 2;
                }
            });

            // Update score display
            document.getElementById("score").innerText = Math.floor(score);

            requestAnimationFrame(gameLoop);
        }

        // Input detection
        window.addEventListener("keydown", (e) => {
            if (e.key.toLowerCase() in keys) keys[e.key.toLowerCase()] = true;
        });
        window.addEventListener("keyup", (e) => {
            if (e.key.toLowerCase() in keys) keys[e.key.toLowerCase()] = false;
        });

        // Start game
        gameLoop(0);
    </script>

</body>

</html>
```

### 功能说明:
1. **横版卷轴游戏:** 玩家矩形(cyan)在画布上移动,文字障碍物从右向左滚动。
2. **WASD 键移动:** 按下 `W`(上)、`A`(左)、`S`(下)、`D`(右)可移动玩家。
3. **动态生成文字障碍物:** 障碍物为随机生成的中文词语,每过一段时间从右侧生成。
4. **碰撞检测:** 如果玩家与障碍物碰撞,则游戏结束并显示得分。
5. **计分器:** 按时间增长实时计分,分数显示在顶部。

### 样式亮点:
- 使用 **Tailwind CSS** 实现简洁美观的界面。
- 整体背景为深色,突出游戏区域。
  
你可以直接复制以上代码到本地保存为 `index.html`,并双击运行即可体验该应用。

示例2

以下是一个完整、功能齐全的单文件网页应用,名称为“单词记忆挑战”。它集成了卡片翻转游戏、随机单词生成、计时器机制以及实时计分器,并运用了 Bootstrap 美化页面。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>单词记忆挑战</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        body {
            background-color: #f8f9fa;
        }
        .card-container {
            display: grid;
            grid-template-columns: repeat(4, 1fr);
            gap: 20px;
            max-width: 900px;
            margin: 50px auto;
        }
        .card {
            cursor: pointer;
            text-align: center;
            height: 100px;
            display: flex;
            align-items: center;
            justify-content: center;
            border: 2px solid #dee2e6;
            font-size: 18px;
            font-weight: bold;
            color: #6c757d;
            transition: transform 0.3s;
            perspective: 1000px;
        }
        .card.flipped {
            background-color: #0d6efd;
            color: #fff;
        }
        .card.matched {
            background-color: #198754;
            color: #fff;
        }
    </style>
</head>
<body>
    <div class="container text-center">
        <h1 class="my-4">单词记忆挑战</h1>
        <div class="d-flex justify-content-center mb-4">
            <button id="startGame" class="btn btn-primary me-2">开始游戏</button>
            <span class="btn btn-secondary me-2" id="timer">计时器: 0 秒</span>
            <span class="btn btn-secondary" id="score">分数: 0</span>
        </div>
        <div id="gameContainer" class="card-container"></div>
    </div>

    <script>
        // 单词对列表
        const words = ["apple", "banana", "cat", "dog", "fish", "grape", "moon", "sun", "apple", "banana", "cat", "dog", "fish", "grape", "moon", "sun"];
        
        // 游戏状态
        let flippedCards = [];
        let matchedPairs = 0;
        let score = 0;
        let streak = 0;
        let timer = 0;
        let interval;

        // 开始游戏
        function startGame() {
            document.getElementById("gameContainer").innerHTML = "";
            shuffleArray(words);
            score = 0;
            streak = 0;
            matchedPairs = 0;
            timer = 0;
            clearInterval(interval);
            interval = setInterval(() => {
                timer += 1;
                document.getElementById("timer").textContent = `计时器: ${timer} 秒`;
            }, 1000);
            renderGame();
            document.getElementById("score").textContent = `分数: ${score}`;
        }

        // 洗牌算法
        function shuffleArray(array) {
            for (let i = array.length - 1; i > 0; i--) {
                const j = Math.floor(Math.random() * (i + 1));
                [array[i], array[j]] = [array[j], array[i]];
            }
        }

        // 渲染游戏卡片
        function renderGame() {
            const gameContainer = document.getElementById("gameContainer");
            words.forEach((word, index) => {
                const card = document.createElement("div");
                card.classList.add("card");
                card.dataset.word = word;
                card.dataset.index = index;
                card.textContent = "?";
                card.addEventListener("click", () => flipCard(card));
                gameContainer.appendChild(card);
            });
        }

        // 卡片翻转操作
        function flipCard(card) {
            if (card.classList.contains("flipped") || card.classList.contains("matched")) return;
            card.classList.add("flipped");
            card.textContent = card.dataset.word;

            flippedCards.push(card);

            if (flippedCards.length === 2) {
                // 检查是否匹配
                const [card1, card2] = flippedCards;
                if (card1.dataset.word === card2.dataset.word) {
                    matchedPairs++;
                    streak++;
                    score += 10 * streak; // 连击奖励
                    card1.classList.add("matched");
                    card2.classList.add("matched");
                    flippedCards = [];
                    if (matchedPairs === words.length / 2) {
                        setTimeout(() => {
                            alert(`恭喜!你完成了挑战!总分: ${score},用时: ${timer} 秒`);
                            clearInterval(interval);
                        }, 500);
                    }
                } else {
                    streak = 0; // 连击中断
                    score -= 5;
                    setTimeout(() => {
                        card1.classList.remove("flipped");
                        card2.classList.remove("flipped");
                        card1.textContent = "?";
                        card2.textContent = "?";
                        flippedCards = [];
                    }, 1000);
                }
                document.getElementById("score").textContent = `分数: ${score}`;
            }
        }

        document.getElementById("startGame").addEventListener("click", startGame);
    </script>
</body>
</html>
```

### 功能与机制说明
1. **卡片翻转游戏**:
   - 点击卡片翻转它显示单词,匹配正确时变成绿色,否则翻回原样。
   
2. **随机生成**:
   - 利用 Fisher-Yates 算法对单词数组进行随机洗牌,确保游戏局势每次不同。

3. **计时器机制**:
   - 游戏开始后计时器每秒更新一次,显示在页面顶部。

4. **计分方式**:
   - 匹配正确得分,默认每次得 10 分,有连击奖励。
   - 连击奖励随着连续成功次数递增(例如,连续2次得分为 20 分,连续3次为 30 分)。
   - 错误翻牌会扣减 5 分。

5. **页面美化**:
   - 使用 Bootstrap 布局和组件,配以自定义样式让应用界面现代而简洁。

您可以直接将以上代码保存为 `.html` 文件后运行,即可体验游戏!

示例3

以下是一个完整的单文件 HTML 应用,名为“品牌拼图挑战”。应用提供拖拽拼图、限时完成机制,以及实时计分功能。通过自定义品牌配色美化,提供用户友好的界面。

```html
<!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>
    /* 自定义品牌配色 */
    body {
      margin: 0;
      font-family: Arial, sans-serif;
      background-color: #f4f4f9;
      color: #333;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }

    h1 {
      color: #ff6f61;
      margin-top: 20px;
    }

    #game-container {
      position: relative;
      width: 500px;
      height: 500px;
      border: 5px solid #ff6f61;
      display: flex;
      flex-wrap: wrap;
      margin: 20px auto;
    }

    .puzzle-piece {
      width: 100px;
      height: 100px;
      border: 1px solid #ccc;
      cursor: grab;
    }

    .puzzle-piece.correct {
      border-color: #28a745;
    }

    #score-container {
      display: flex;
      justify-content: center;
      align-items: center;
      gap: 20px;
      font-size: 1.2rem;
      margin-top: 10px;
    }

    #score {
      font-weight: bold;
      color: #28a745;
    }

    #timer {
      font-weight: bold;
      color: #dc3545;
    }

    button {
      margin-top: 20px;
      padding: 10px 15px;
      font-size: 1rem;
      border: none;
      border-radius: 5px;
      background-color: #ff6f61;
      color: #fff;
      cursor: pointer;
    }

    button:hover {
      background-color: #ff4e4e;
    }
  </style>
</head>

<body>
  <h1>品牌拼图挑战</h1>
  <div id="score-container">
    <div>分数: <span id="score">0</span></div>
    <div>倒计时: <span id="timer">60</span>秒</div>
  </div>
  <div id="game-container"></div>
  <button id="reset-button">重新开始</button>

  <script>
    const gameContainer = document.getElementById('game-container');
    const scoreElement = document.getElementById('score');
    const timerElement = document.getElementById('timer');
    const resetButton = document.getElementById('reset-button');

    let score = 0;
    let timer = 60;
    let interval;

    // 初始化拼图块
    const pieces = [
      { id: 0, img: 'https://via.placeholder.com/100/ff6f61', correctX: 0, correctY: 0 },
      { id: 1, img: 'https://via.placeholder.com/100/007bff', correctX: 100, correctY: 0 },
      { id: 2, img: 'https://via.placeholder.com/100/f4a261', correctX: 200, correctY: 0 },
      { id: 3, img: 'https://via.placeholder.com/100/43aa8b', correctX: 300, correctY: 0 },
      { id: 4, img: 'https://via.placeholder.com/100/ff6f61', correctX: 0, correctY: 100 },
      { id: 5, img: 'https://via.placeholder.com/100/007bff', correctX: 100, correctY: 100 },
      { id: 6, img: 'https://via.placeholder.com/100/f4a261', correctX: 200, correctY: 100 },
      { id: 7, img: 'https://via.placeholder.com/100/43aa8b', correctX: 300, correctY: 100 }
    ];

    function randomizePieces() {
      return pieces
        .map(piece => ({ ...piece, random: Math.random() }))
        .sort((a, b) => a.random - b.random)
        .map(({ random, ...piece }) => piece);
    }

    function createPuzzle() {
      const shuffledPieces = randomizePieces();

      while (gameContainer.firstChild) gameContainer.removeChild(gameContainer.firstChild);

      shuffledPieces.forEach(piece => {
        const el = document.createElement('div');
        el.style.backgroundImage = `url(${piece.img})`;
        el.classList.add('puzzle-piece');
        el.draggable = true;

        el.addEventListener('dragstart', e => {
          e.dataTransfer.setData('id', piece.id);
        });

        gameContainer.appendChild(el);
      });

      return shuffledPieces;
    }

    const updateTimer = () =>--....

适用用户

独立开发者

帮助开发者快速从创意转化为功能齐全、可运行的网页游戏,加速项目启动,让想法无需等待。

教育与培训者

为教学提供交互式游戏工具,只需简单输入模块和规则,即可生成具有教育娱乐双重功能的课程辅助工具。

营销策划人

实现活动宣传创意,生成吸引用户参与的网页小游戏,用于品牌推广或用户互动方案的实施。

设计师与创意人员

只需定义页面样式和功能,即可快速生成视觉独特的游戏作品,轻松实现设计创意展示。

游戏行业研究者

快速搭建游戏原型用于实验和数据收集,为用户行为研究提供便捷工具,缩短实验准备时间。

解决的问题

通过引导AI生成一个完整的单文件网页游戏应用,帮助用户轻松、高效地将创意转化为可运行的网页游戏原型。

特征总结

一键生成完整网页游戏:只需输入游戏名称和功能需求,轻松获得完整的单文件网页应用,高效实现创意落地。
定制化游戏功能模块:支持自由定义玩法、计分规则和页面样式,打造与你想法完全契合的游戏设计。
内嵌标准HTML结构:输出的单文件具备完整可运行性,无需依赖额外文件和复杂配置,直接在浏览器中运行。
支持视觉设计定制:根据输入的样式要求,自动生成具有吸引力的布局与UI,让游戏更具吸引力。
快速演示与迭代:适用于快速原型开发,通过即时生成的网页游戏展示概念,便于用户测试与优化。

如何使用购买的提示词模板

1. 直接在外部 Chat 应用中使用

将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。

2. 发布为 API 接口调用

把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。

3. 在 MCP Client 中配置使用

在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。

免费
请先免费试用,确保满足您的需求。

您购买后可以获得什么

获得完整提示词模板
- 共 75 tokens
- 4 个可调节参数
{ 产品名称 } { 功能模块 } { 计分模块 } { 样式模块 }
自动加入"我的提示词库"
- 获得提示词优化器支持
- 版本化管理支持
获得社区共享的应用案例
限时免费

不要错过!

免费获取高级提示词-优惠即将到期

17
:
23
小时
:
59
分钟
:
59
摄影
免费 原价:20 限时
试用