【问题标题】:Site Design: How to award users tasks with achievements?网站设计:如何用成就奖励用户任务?
【发布时间】:2011-08-23 12:21:51
【问题描述】:

所以我想在我的网站上设置成就系统。人们执行任务并上传这些信息,然后将这些信息存储在数据库中(想想“时间”、“日期”、“任务”等)。检查他们的信息和奖励成就的最佳方法是什么?我是否只需要一个成就.php,一旦信息上传,它将触发该文档运行所有检查以确定用户是否需要获得成就?还是我应该设置服务器端来奖励用户?

感谢任何帮助或建议、cmets 等:D

编辑:我目前在数据库中列出了成就,(id, name, class)

任务存储为 ('date_time','time','device','user_id[fk]')

编辑 2:许多成就的计算不仅基于用户当前提交的任务,而且除了新添加的任务外,还会考虑以前的任务。 EX:如果用户在连续三天内完成了3个任务,那么他们将获得奖励

【问题讨论】:

    标签: php mysql html


    【解决方案1】:

    您最好的选择可能是为任务创建一个点值表,然后创建一个存储过程,该过程可以从相应的表中获取适当的计数并将它们乘以点值。这就是我过去所做的 - 它还允许您从数据库中即时修改点值。

    【讨论】:

    • 数据库中的存储过程?我强烈建议不要这样做
    • 任务并没有真正的点值,它们只是基于稀有度的 3 个单独的类别。我打算设置它的方式是拥有一个 php 文件,该文件将根据用户完成的最新任务执行一系列条件。很多奖项都是基于数据的积累。 (例如:该人在 5 天内完成 5 个任务,[或 1 天,依此类推......])这种在用户上传任务后有一个文件执行这些条件的方法虽然看起来不是最佳解决方案.
    • 然后废弃 pointValue 表并手动计算您的稀有度..?
    【解决方案2】:

    您如何在任务提交过程中创建一个触发器(或者您在用户完成任务时插入数据),然后执行必要的操作让该用户确定他/她是否获得了成就,以及然后相应地更新成就表。

    然后,每次你在前端为用户加载信息时,数据已经在他/她的成就表中,你可以直接访问它(我相信你已经做)。

    【讨论】:

      【解决方案3】:

      这实际上取决于您对业务逻辑布局的偏好,以及您希望实现的实时性。如果你想在你的 sql server 上卸载一堆业务逻辑,把它放在一个存储过程中,否则,将计算分类到 php 中的一个类中,并使用该类来确定新的成就。

      我肯定会建议在正常页面响应之外进行处理。可能会启动对 php cli 的服务器端调用,或者设置一个 cron 作业以在特定时间间隔通过检查成就来运行所有个人。

      编辑:

      至于授予成就的实际方法,我认为您最灵活和最简单的实现(我敢肯定,您会发现更简单/不太灵活和更灵活/不太简单的选项)是创建一个 AwardRunner类、一个 IAward 接口和一堆 IAward 的单独实现,用于您拥有的每个奖项。基本的想法是这样的:

      <?php
          class AwardRunner {
              var $UserId = 0;
      
              function AwardRunner($userId) {
                  $this->UserId = $userId;
      
                  $dir = "/path/to/your/folder/full/of/IAwards/";
                  $includes = read_dir($dir);
      
                  //include all files that exist
                  foreach($includes as $include)
                  {
                      if (is_file($include))
                      {
                        require($include);
                      }
                  }
              }
      
              public function Run() {
                  $classList = get_declared_classes();
      
                  foreach($classList as $key => $className)
                  {
                      if (in_array('IAward', class_implements($className))) {
                          $award = $className();
                          $award->UserId = $this->UserId; 
                          $award->GrantIfUserQualifies();
                      }
                  }
      
              }
      
              //function for reading all files in a directory.
              //this is recursive, so any files in subfolders will also make it in
              function read_dir($dir) 
              {
                  $array = array();
                  $d = dir($dir); 
                  while (false !== ($entry = $d->read())) {
                      if($entry!='.' && $entry!='..') {
                          $entry = $dir.'/'.$entry;
                          if(is_dir($entry)) {
                              $array = array_merge($array, read_dir($entry));
                          } else {
                              $array[] = $entry;
                          }
                      }
                  }
                  $d->close();
                  return $array;
              }   
      }
      ?>
      

      我认为 IAward 接口的外观从用法上会很清楚,尽管您可能会从表中添加 Id 字段,以便它能够将自己插入数据库中,就像调用 AwardRunner 类的方式一样。

      无论您是否在所有用户中循环分配奖励过程,或者在每次任务提交后将其触发,这个想法都应该有效。

      【讨论】:

      • 在服务器上运行成就检查,独立于用户体验,对我来说听起来是最好的解决方案。我只是不确定我应该如何让它检查要奖励的成就。现在我有一个页面,上面有一堆成就条件。然而,由于各种原因,这似乎不是最佳解决方案。有什么想法吗?
      • @daveomcd,查看修改后的答案。
      • 非常感谢,我觉得我在这方面已经非常接近一个完整的新手了,但我相信能够理解你在上面所做的一切。我从来没有想过这样做,至少现在似乎是一种令人惊叹的设置方式! :) 感谢所有的帮助,现在我要开始设置它了!
      • @daveomcd,没问题。我最近实际上在 c# 中做了类似的事情,所以我只需要让它在 php 中有意义。真正令人高兴的是,要添加新奖励,您只需将文件放入文件夹中,下一个批处理过程就会将其拾取并应用。
      猜你喜欢
      • 2021-03-24
      • 2011-07-01
      • 2020-12-18
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      相关资源
      最近更新 更多