【问题标题】:Xp and leveling system PHP MYSQLxp和练级系统PHP MYSQL
【发布时间】:2012-10-27 06:14:59
【问题描述】:

我查看了所有已提出的问题和答案,但我似乎找不到最适合我的答案。我想做的是制作一个系统,当用户处于某个 xp 限制时,该系统会进入下一个级别。它显示了在下一个 xp 之前需要多少 xp。

所以

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

我将如何去做,所以如果 xp 达到一定数量,请显示下一个级别需要多少 xp 的数量。

【问题讨论】:

  • 这行得通吗?函数 xpIncrease($amount) { if ($amount>=$details['xp_needed']) { $amount-=$details['xp_needed']; $details['xp_needed']=$newValue; //用户升级,更新xp_needed xpIcrease($amount); //再次调用它,因为用户可能会升级两次或更多... } else { //只需使用 SQL 添加它 } }

标签: php mysql


【解决方案1】:

你可以试试这样的:

我们的数据库中有users_xp 表,带有user_xp_id(主键 - 自动递增)、user_iduser_xp_amount(默认值:0)字段。当我们想要更新用户 xp 数量时,我们应该这样做:

$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 数量时,我们可以从我们的 db 表中获取它

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;

【讨论】:

  • $my_xp = 325;那就是设置 xp,我想让它工作,所以当你发布一些东西时,它会在你的 xp 中添加 5xp。我们将如何做到这一点?-
  • 你能给我一个表的db表sql脚本吗
  • 只要到处都是全局变量,我就不能对此表示赞同
  • 什么意思?对不起,但我不明白:)
  • @MateiMihai 最好将数据库处理程序作为参数传递给函数,而不是依赖global。见:Why is Global State so Evil?
【解决方案2】:

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

表层级: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(基本字段)

现在,对于每个获得 XP 的用户操作,更新用户的积分。从levels 表中获取所有这些行并使用用户的更新点检查它们以产生您需要的结果:) 在 SQL 查询中,请记住 ORDER by points DESC 以便您可以在循环内轻松检查升级!如果有级别更新,只需更新用户的level_id 以匹配levels 表中对应的id。您可以使用"SELECT levels.name FROM levels WHERE levels.id = $users_level_id" 之类的内容来显示他所在关卡的名称。

我推荐一个标准函数function xpAction(...),您可以在用户可以执行的所有与 XP 相关的操作中调用它。因此,如果他添加了一个帖子,而您正在运行 function addPost($data),则只需在其中添加一行以使用正确的参数调用 xpAction

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2019-04-30
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2014-01-17
    相关资源
    最近更新 更多