You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现Slayer进度条值达100时自动更换mysqli随机怪物ID

实现自动进度触发的怪物切换逻辑

首先,咱们得把几个核心环节拆解清楚:数据库随机取怪物、进度实时监控与触发、状态持久化(比如用Session保存当前怪物和进度),毕竟是挂机游戏,得保持用户的状态不丢失。

1. 数据库查询随机怪物的PHP函数

先写个可复用的函数,用mysqli从数据库里随机选一个怪物。假设你的怪物表叫monsters,有id、name、hp这些字段:

function getRandomMonster($conn) {
    // 用ORDER BY RAND()随机取一条,小数据量场景足够用;数据量大的话可以改成随机ID查询优化
    $query = "SELECT id, name, hp FROM monsters ORDER BY RAND() LIMIT 1";
    $result = mysqli_query($conn, $query);
    
    if ($result && mysqli_num_rows($result) > 0) {
        return mysqli_fetch_assoc($result);
    }
    // 兜底返回默认怪物(根据你的游戏设定调整)
    return ['id' => 1, 'name' => '史莱姆', 'hp' => 50];
}

2. 初始化与状态保持(Session)

因为是自动运行,咱们需要用Session来保存当前用户的进度和当前怪物,避免刷新页面就重置状态:

session_start();

// 初始化:如果没有当前怪物或进度,就设置初始值
include 'db_connect.php'; // 引入你的数据库连接文件
if (!isset($_SESSION['current_monster'])) {
    $_SESSION['current_monster'] = getRandomMonster($conn);
}
if (!isset($_SESSION['slayer_progress'])) {
    $_SESSION['slayer_progress'] = 0;
}

3. 后端接口:处理进度更新与怪物切换

写一个单独的PHP接口(比如update_progress.php),用来处理进度增长、判断是否触发怪物切换:

session_start();
include 'db_connect.php';

// 模拟挂机进度增长:每次请求增加1(你可以根据玩家攻击力等参数调整增长速度)
$_SESSION['slayer_progress'] += 1;

$response = [
    'progress' => $_SESSION['slayer_progress'],
    'current_monster' => $_SESSION['current_monster'],
    'switched' => false
];

// 检查进度是否达到100,触发切换逻辑
if ($_SESSION['slayer_progress'] >= 100) {
    $_SESSION['current_monster'] = getRandomMonster($conn);
    $_SESSION['slayer_progress'] = 0;
    $response['progress'] = 0;
    $response['current_monster'] = $_SESSION['current_monster'];
    $response['switched'] = true;
}

// 返回JSON格式给前端
header('Content-Type: application/json');
echo json_encode($response);

4. 前端自动监控与页面更新

前端用setInterval定时调用后端接口,全程无需用户操作,自动更新进度和怪物信息:

<!DOCTYPE html>
<html>
<head>
    <title>Slayer挂机游戏</title>
</head>
<body>
    <h2>当前怪物:<span id="monster-name"></span></h2>
    <p>HP:<span id="monster-hp"></span></p>
    <div>
        Slayer进度:<span id="progress-value">0</span>%
        <progress id="progress-bar" value="0" max="100"></progress>
    </div>

    <script>
        // 更新怪物信息显示
        function updateMonsterDisplay(monster) {
            document.getElementById('monster-name').textContent = monster.name;
            document.getElementById('monster-hp').textContent = monster.hp;
        }

        // 更新进度条显示
        function updateProgressDisplay(progress) {
            document.getElementById('progress-value').textContent = progress;
            document.getElementById('progress-bar').value = progress;
        }

        // 定时请求后端更新进度(每秒1次,可根据游戏节奏调整)
        setInterval(() => {
            fetch('update_progress.php')
                .then(response => response.json())
                .then(data => {
                    updateProgressDisplay(data.progress);
                    // 如果触发怪物切换,更新显示并给用户反馈
                    if (data.switched) {
                        updateMonsterDisplay(data.current_monster);
                        // 这里可以换成动画、弹窗等更友好的提示
                        alert('进度满了!切换到新怪物:' + data.current_monster.name);
                    }
                })
                .catch(error => console.error('更新失败:', error));
        }, 1000);

        // 页面加载时初始化显示当前状态
        window.onload = () => {
            fetch('update_progress.php')
                .then(response => response.json())
                .then(data => {
                    updateMonsterDisplay(data.current_monster);
                    updateProgressDisplay(data.progress);
                });
        };
    </script>
</body>
</html>

关键注意点

  • 多用户隔离:如果是多玩家游戏,要确保Session和用户账号绑定(比如用户登录后再初始化Session),避免不同玩家的状态混乱。
  • 数据库优化:如果怪物表数据量很大,ORDER BY RAND()性能会下降,可以改成先查询最大ID,生成随机ID后再精准查询的方式。
  • 进度增长逻辑:示例里是固定每次加1,你可以扩展成根据玩家属性(比如攻击力、暴击率)动态调整进度增长值,让游戏更有深度。
  • 前端体验:可以添加进度条动画、怪物切换过渡效果,提升游戏的沉浸感。

内容的提问来源于stack exchange,提问作者Mike Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:08:08