XP和等级系统 PHP MYSQL

3
我已经查看了所有相关的问题和答案,但是似乎没有一个最适合我的答案。我的目标是开发一个系统,当用户达到一定的经验值时能够升级,并且显示距离下一个经验值还需要多少经验。

因此,您可以通过以下方法实现:

lvl1 = 0 => lvl2 = 256 => lvl3 = 785 => lvl4 = 1656 => lvl5 = 2654

我该如何做到这一点,如果 XP 达到某个特定数量,则显示该数量以及升级所需的下一级 XP 数量。


这个能行吗?function xpIncrease($amount) { if ($amount>=$details['xp_needed']) { $amount-=$details['xp_needed']; $details['xp_needed']=$newValue; //用户升级了,更新xp_needed xpIcrease($amount); //再次调用它,因为用户可能连续升级两次或更多... } else { //只需将其与SQL添加即可 } } - Dianamu
2个回答

6
你可以尝试类似以下的方法:
我们在数据库中有一个名为users_xp的表,它包含user_xp_id(主键-自动递增)、user_iduser_xp_amount(默认值:0)字段。当我们想要更新用户的经验值时,应该这样做:
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

function update_user_xp($user_id, $amount, $mysqli) {
    $mysqli->query("UPDATE users_xp 
                    SET user_xp_amount=user_xp_amount+" . $amount . " 
                    WHERE user_id='$user_id'");
}

// we call this function like:
update_user_xp(4, 10, $mysqli); // user_id: 4, update with 10 points

当我们想要获取实际用户XP数量时,可以从我们的数据库表中获取。

function get_user_xp($user_id, $mysqli) {
    $sql = $mysqli->query("SELECT user_xp_amount 
                           FROM users_xp 
                           WHERE user_id='$user_id'");
   $row = $sql->fetch_assoc();
   return $row['user_xp_amount'];

}

$xp = array('lvl1' => 0, 'lvl2' => 256, 'lvl3' => 785, 'lvl4' => 1656, 'lvl5' => 2654);

$my_xp = get_user_xp(4, $mysqli); // where 4 is my user id

for($i = 0; $i < count($xp); $i++) {
   if($my_xp == $xp[$i]) {
       echo 'I\'m on level ', ($i+1);
       break;
   }
   else {
       if(isset($xp[$i+1])) {
           if($my_xp > $xp[$i] && $my_xp <= $xp[$i + 1]) {
               echo 'My next level is ', ($i+2), ' and I need ', $xp[$i+1], ' more points for achieving it!';
               break;
            } else {
               echo 'My next level is ', ($i+1), ' and I need ', $xp[$i], ' more points for achieving it!';
               break;
            }
        }
    }
}

后续编辑:

CREATE TABLE `my_db_name`.`users_xp` (
`user_xp_id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`user_id` BIGINT NOT NULL ,
`user_xp_amount` BIGINT NOT NULL DEFAULT '0'
) ENGINE = InnoDB;

你能给我这个表的数据库SQL脚本吗? - Dianamu
2
只要全局变量到处都是,我就无法点赞这个。 - Gordon
你的意思是什么?抱歉,我没听懂 :) - Mihai Matei
那么我就必须设置一个连接到数据库才能使用它。 - Dianamu
致命错误:在/srv/disk8/1177900/www/cdn.g-mine.co.cc/Level System/index.php的第15行,对非对象调用成员函数query(),我在$mysqli->query("UPDATE users_xp时遇到了这个问题。 - Dianamu
显示剩余2条评论

1

为了灵活性,将您的积分存储在数据库表中而不是应用程序级别的逻辑中。这里是一个建议的架构:

表级别:INT A_I P_K id, INT points, VARCHAR name

表用户:INT A_I P_K id, VARCHAR user, VARCHAR password, INT points, INT level_id(基本字段)

现在,对于每个赚取经验值的用户操作,请更新用户的积分。从levels表中获取所有这些行,并将它们与用户的更新积分进行比较,以产生所需的结果 :) 在SQL查询中,记得按points DESC排序,以便您可以在循环内轻松检查升级!如果有级别更新,请将用户的level_id更新为与levels表中相应id匹配的值。您可以使用类似"SELECT levels.name FROM levels WHERE levels.id = $users_level_id"的东西来显示他所在级别的名称。

我建议使用一个标准函数function xpAction(...),在用户执行所有与XP相关的操作时调用它。因此,如果他添加了一篇文章并且您正在运行function addPost($data),只需在其中插入一行以使用正确的参数调用xpAction即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接