简单的PHP Level-up进度计算

时间:2013-10-14 06:58:31

标签: php wordpress variables math levels

我正在为wordpress博客创建升级系统。我相信这个问题更多的是针对Php和数学,而不是wordpress,这就是我在这里提问的原因。

我希望用户在评级(或者你可以称之为xp)自定义字段获得“级别”时获得25的倍数(虽然我更希望xp要求以指数方式增加,但请查看请求#2以下)。

我在 functions.php 文件中有这个。

function movie_level() {
   if ( is_single() ) {
      global $post;
      $movie_level = get_post_meta( $post->ID, "movie_level", true);
      if ( !isset( $movie_level ) OR empty( $movie_level ) OR !is_numeric( $movie_level ) ) {
     $movie_level = 1;
     add_post_meta( $post->ID, "movie_level", $movie_level );
      }
  $vmeta = get_post_meta( get_the_ID(), 'ratings_score', true );
  $movie_percentage_check = $vmeta / ( 25*$movie_level ) * 100;
  if ( $movie_percentage_check == 100 ) {
         $new_level = $movie_level + 1;
         update_post_meta( $post->ID, "movie_level", $new_level );
         $update_rating = $vmeta + 1;
         update_post_meta( $post->ID, "ratings_score", $update_rating );
      } return $movie_level;
    }
 }

当收视率达到25时,它为movie_movie级别添加+1。

在我的 single.php 文件中,我有以下内容:

 $meta = get_post_meta( get_the_ID(), 'ratings_score', true );
 $level= movie_level();
 $perc = $meta / ( 25 * $level ) * 100;

 echo '<div class="progress large-6 small-12 columns "><span class="meter" style="width:'.$perc.'%"><span></span></span></div>';

 echo movie_level();

使用进度条css组件显示进度到下一级别。

  1. 当达到新级别时,如何让$ perc再次从0%开始?使用我当前的等式,进度条将始终显示从级别1 - 级别3(例如)开始的进度,而不是级别2 - 级别3.

  2. 如何更新我的代码,以便每个级别的评级要求呈指数级增长,并且仍能达到我想要的要求#1

1 个答案:

答案 0 :(得分:1)

我认为你正在跳过一些你不需要的箍,但首先是几个注意事项。

movie_level函数中,您要检查级别是否需要增加,只有在相关变量发生变化时进行检查才有意义 - 即更新时进行更改{{1} }或movie_level。您也会返回ratings_score,但如果您已添加movie_level,则不会反映+ 1,因此您始终会返回旧分数(当您使用new_level存储时新的分数)。这可能是你想要的,但我怀疑它不是。

您尝试回答的关键问题是 - 到下一个级别有多远?对于25个块,下一个级别为(movie_level * 25),下一个级别的数量为(movie_level * 25) - rating_score。作为一个百分比,((movie_level * 25) - rating_score) / 25(如果你愿意,也许* 100)。

适用于固定块,对于指数块,您可以将下一个目标显式存储为变量。但是您可以应用与上面相同的逻辑,假设函数level_target(x)返回级别x的目标分数。然后,您可以计算level_target(movie_level) - rating_score的距离,但您需要知道该级别level_target(movie_level) - level_target(movie_level - 1)的大小。

所以要获得百分比:(level_target(movie_level) - rating_score)/(level_target(movie_level) - level_target(movie_level - 1))

您可以将level_target作为函数实现,或者计算出您想要的内容并将其直接合并,这样可以简化等式。

指数级别的增长将会迅速增加,因此您可能希望获得最大值。但如果你想要

 0, 25, 50, 100, 200, 400 ...

你可以注意到它等同于

 25 * 0, 25 * 1, 25 * 2, 25 * 4, 25 * 8, 25 * 16 ...

然后注意序列0,1,2,4,8,16 ......只是增加2的幂。所以level_target(x) = 25 * pow(2,x)

将下一个目标等级存储为单独变量可能更有用的原因是你可以将旧目标等级加倍并避免必须做2件事的权力(你可以解决它的差异)等级因为它总是正好是目标等级的一半。

编辑

澄清我的字段更改评论。您只需要在rating_score更改后重新计算movie_level(反之亦然),因此通常只会在更改时重新计算变量。

我不知道您的应用程序,但假设只有一个页面,其中movie_level和/或rating_score的值可以更改(比如编辑分数页面),但还有其他几十页这一切都显示了进度条。如果您只在价值变化的页面上查看($movie_percentage_check == 100),那么您不需要在其他任何地方进行检查(因为这些值在其他任何地方都无法改变,因此您可以知道它不是真的)。

在所有视图页面上检查它并不一定是坏事,特别是对于简单的站点。并且在某些情况下您需要(如果系统的某些其他部分可以某种方式更新值)。在一个更复杂的系统中,你希望避免做你不需要的工作,这样才能编辑&#39;页面应该更改值,&#39;查看&#39;页面应该只读取/使用值。

我可能没有那么好解释,希望这有帮助。