在开发小游戏项目时,有时需要服务端来操作用户的体力。如果使用数据库来保存略显冗余,性能也稍有不足,所有使用Redis的过期机制可以更好更快的快速实现需求。

示例中的Redis经过了多例的封装 参照 多例Redis类实现

<?phpnamespace app\common;use ryjoin\Redis;/*** 体力计算* Class Live* @package app\common*/
class Live
{/*** redis的key* @var string*/protected $key;/*** 体力配置* @var array*/protected $config = ['max' => 5, // 最大值'interval' => 60 // 体力恢复间隔(秒)];/*** 设置用户* Energy constructor.* @param $user_id*/public function __construct($user_id){$this->key = "lives:$user_id";}/*** 获取体力* @return array*/public function get(){$lives = $this->config['max']; // 体力$next_live_time= -1; // 恢复倒计时(秒)if (Redis::db()->exists($this->key)) {$ttl = (int)Redis::db()->ttl($this->key);$reduce = ceil($ttl / $this->config['interval']);$lives -= $reduce;$next_live_time = $ttl % $this->config['interval'];// 如果正好处于恢复时 否则会出现剩余0的情况if ($next_live_time == 0) {$next_live_time = $this->config['interval'] - 1;}}return ['lives' => (int)$lives, // 当前体力'next_live_time' => $next_live_time // 下一次恢复时间(秒)];}/*** 扣除体力* @return bool*/public function reduce(){$lives = $this->get();if ($lives['lives'] == 0) { // 没有体力return false;}if (Redis::db()->exists($this->key)) {$expired_ttl = (int)Redis::db()->ttl($this->key);Redis::db()->set($this->key, 1, $expired_ttl + $this->config['interval']);} else {Redis::db()->set($this->key, 1, $this->config['interval']);}return true;}/*** 增加体力* @return bool*/public function increase(){$lives = $this->get();if ($lives['lives'] == $this->config['max']) { // 体力上限return true;}if (Redis::db()->exists($this->key)) {$expired_ttl = (int)Redis::db()->ttl($this->key);if ($expired_ttl <= $this->config['interval']) {Redis::db()->del($this->key);}Redis::db()->set($this->key, 1, $expired_ttl - $this->config['interval']);}return true;}
}

使用方式 (根据自身业务)

获取当前用户的体力

 /*** 获取用户体力* @param $user_id* @return array*/public function getPlayer($user_id){// 获取体力信息$live = new Live($user_id);$lives = $live->get();return ['currentLives' => $lives['lives'],'nextLiveTime' => $lives['next_live_time'],'watchAdCount' => $this->getWatchAdCount($user_id)];}

观看激励视频后增加用户体力

/*** 激励视频广告上限* @var int*/protected $watchAdCount = 2;/*** 剩余广告次数* @param $user_id* @return int*/protected function getWatchAdCount($user_id){$todayWatchCount = (int)Redis::db()->get("game:watch:$user_id");return $this->watchAdCount - $todayWatchCount;}/*** 激励视* 频增加体力* @param $user_id* @return bool*/public function watchAd($user_id){$watchAdCount = $this->getWatchAdCount($user_id);if ($watchAdCount == 0) {$this->code = Code::FAILURE;$this->error = '次数不足';return false;}// 增加用户体力$live = new Live($user_id);$live->increase();Redis::db()->incrBy("game:watch:$user_id", 1);Redis::db()->expire("game:watch:$user_id", Tools::nowTillTomorrowZero());return true;}

扣除体力,当然扣除后是会自动恢复的

  // 扣除体力 每次-1 $live = new Live($GLOBALS['user_id']);$result = $live->reduce();

更多使用方式

如果有多个体力的场景,那么可以修改Live类中的key 这样就可以复用到多个体力场景

    /*** redis的key* @var string*/protected $key;/*** 设置用户* Energy constructor.* @param $user_id*/public function __construct($key, $user_id){$this->key = "$key:$user_id";}

PHP+Redis实现游戏体力值加减及自动恢复的操作相关推荐

  1. Unity 休闲游戏体力值恢复

    1.做休闲游戏实现一个体力恢复的功能,当游戏退出离线的时候,体力值也是恢复的,这个时候就需要计算游戏离线了多久. 2.作为测试 我脚本中的R和A分别可以增加体力和减少体力. 3.即使游戏退出,下次进入 ...

  2. C++小游戏——卡牌加减乘

    #include <iostream> #include <algorithm> #include <cstdlib> #include <ctime> ...

  3. 【Computer Organization笔记06】浮点数的数据表示,浮点数加减运算

    本次笔记内容: P11 计算机组成原理(11) P12 计算机组成原理(12) 本节课对应幻灯片:组成原理13 data,第72页起.此外,本节课内容"浮点数"已经在"汇 ...

  4. mysql日期减后取月_mysql加减时间-函数-时间加减

    select timediff('23:40:00', ' 18:30:00'); -- 两时间相减 SELECT substring( timediff('23:40:00', ' 18:30:00 ...

  5. 微信小程序:购物车加减

    此贴为自己记录贴,以便日后做到同样的项目能给自己提个醒 在加入购物车时,会将商品编号(goods_id).数量(quan)等有用的信息存入购物车表(cart),有则在原有的基础上添加数量,无则新增一条 ...

  6. string类型加减_测试人员应该知道的Redis知识(四) String

    一.概述 完整的说,应该是Binary-safe string,二进制安全字符串.从官网内容我们可以看到,String类型是最简单的一种数据类型,和Memcached的类型一致,一个key对应一个va ...

  7. 表达式求值:从“加减”到“带括号的加减乘除”的实践过程

    本文乃Siliphen原创,转载请注明出处:http://blog.csdn.NET/stevenkylelee ● 为什么想做一个表达式求值的程序 最近有一个需求,策划想设置游戏关卡的某些数值,这个 ...

  8. 华为OD机试 - 数字加减游戏(Java JS Python)

    题目描述 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字s变成数字t. 每个回合,小明可以用当前的数字加上或减去一个数字. 现在有两种数字可以用来加减,分别为a,b(a!=b),其中b没有使 ...

  9. Java 中日期的几种常见操作 —— 取值、转换、加减、比较

    Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提 ...

最新文章

  1. iOS 跑马灯封装(带点击事件)
  2. 数据科学干货分享来了!
  3. Boost:是否对齐的测试程序
  4. 花旗linux 内核 如何调试,揭秘首个运行在Linux平台的核心银行系统
  5. [20151112]ORA-01450?3215?.txt
  6. MySQL练习题和代码附录
  7. RFID打印机有什么用
  8. 【Java编程思想笔记】-集合1
  9. javaweb day14
  10. SQLite数据库导出Excel教程
  11. c语言贪吃蛇答辩项目,贪吃蛇项目V1答辩.PDF
  12. js 实现60秒倒计时
  13. Mysql数据库的安装--三分钟搞定
  14. 2019年上半年英语四、六级成绩查询方式和时间
  15. 证件照怎么制作?超简单的证件照制作教程来了
  16. ERD图“乌鸦脚”形式表示的关系的使用方法与理解
  17. Android博通BCM libbt-vendor.so 分析蓝牙初始化流程
  18. 详解自定义钉钉机器人推送消息(一) PHP篇
  19. 举个栗子!Tableau技巧(53):添加跳转按钮实现页面切换
  20. 公开课 | 解密HW究竟怎么玩?之 第一篇

热门文章

  1. vue项目将多张图片生成一个gif动图
  2. App store最新审核标准公布
  3. QMIX: Monotonic Value Function Factorisation for Deep Multi-Agent Reinforcement Learning
  4. PyTorch中的masked_select、masked_fill_()、 masked_fill()的区别
  5. web服务器的.do文件是什么,.do是什么文件
  6. ICRA 2023 | 第一届RoboDepth鲁棒深度估计竞赛
  7. 2019 年开工福利
  8. 【字节青训营】微服务架构原理核心服务治理与具体实践
  9. 百知教育-胡鑫喆讲师-java-第一章07
  10. 计算机英语boppps,BOPPPS教学法在英语教学中的应用