首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用户水准系统

用户水准系统
EN

Game Development用户
提问于 2019-05-15 18:37:21
回答 2查看 270关注 0票数 0

我之前已经问过这个问题了,但我只想用一种新的分级格式对其进行编码。我想做的是,用户将获得exp,一旦他们升级,他们以前的经验将被添加到他们的当前exp。

因此,在一个场景中,它是这样的: User1在1级,exp_needed为1000,达到2级。他获得了1,000的经验,所以他现在在2级,current_exp为1,000,并且需要1,400。或者,如果User1获得了1,100的经验,那么他就在2级,current_exp为1,100和1,400。依此类推,取决于算法。但如果用户获得1,100 exp,则得到-900/1,400的结果。

以下代码如下:

代码语言:javascript
运行
AI代码解释
复制
while($user->curr_exp >= $user->exp_needed){
       $user->curr_exp -= ($user->exp_needed) + $user->prev_exp;   
       $user->prev_exp = $user->exp_needed;
       if($user->level <= 19){
       $user->exp_needed = $user->prev_exp * 1.4;
       }
       elseif($user->level >= 20 && $user->level <= 39){
       $user->exp_needed = $user->prev_exp * 1.1;
       }
       elseif($user->level >= 40 && $user->level <= 59){
       $user->exp_needed = $user->prev_exp * 1.05;
       }
       elseif($user->level >= 60 && $user->level <= 79){
       $user->exp_needed = $user->prev_exp * 1.04;
       }
       elseif($user->level >= 80 && $user->level <= 99){
       $user->exp_needed = $user->prev_exp * 1.03;
       }
       elseif($user->level == 100){
       $user->exp_needed = $user->exp_needed * 0;
       }
       $user->level += 1;
       $user->save();
      }

有什么办法处理这件事吗?谢谢。

EN

回答 2

Game Development用户

发布于 2019-05-16 02:13:02

我认为你的水准系统不必要的复杂,因为它使水准的阈值取决于玩家当前的经验。

首先,我建议设定固定的水准阈值,由你事先决定。例如,前20层需要1000 exp,1400 exp,1960 exp .诸若此类。例如,可以将它们保存在数组上。

现在假设玩家在1级,100级,并且需要900 exp达到2级。他获得1000 exp,现在他在1100 exp,因此它被提升到2级。例如,达到3级的阈值设置为1400

您可以通过两种方式进行:

  1. 将他当前的exp保持在1100,所以现在他只需要一个额外的1300就可以到达1000+1400=2400 exp。
  2. 将他的exp重置为0,现在他需要到达1400 exp才能达到第3级。

第二个解决方案的缺点是,你失去了实际的总经验球员所做的,因为你是放弃任何额外的经验,他得到的水平上升。为此,您可以使用永远不会重置的第二个变量curr_total_exp

票数 1
EN

Game Development用户

发布于 2019-05-15 22:59:13

100级别是最大的,所以我们添加了一个检查,以防止无限循环。

代码语言:javascript
运行
AI代码解释
复制
while ($user->curr_exp >= $user->exp_needed && $user->level < 100) {

仅减去升级所需的XP:

代码语言:javascript
运行
AI代码解释
复制
    $user->curr_exp -= $user->exp_needed;

将XP从此级别添加到以前的XP中:

代码语言:javascript
运行
AI代码解释
复制
    $user->prev_exp += $user->exp_needed;

    if ($user->level < 20) {
        $user->exp_needed = $user->prev_exp * 1.4;
    }

如果级别小于20,则不需要检查它是大于还是等于,因为我们有else

代码语言:javascript
运行
AI代码解释
复制
    elseif ($user->level < 40) {
        $user->exp_needed *= 1.1;
    }
    elseif ($user->level < 60) {
        $user->exp_needed *= 1.05;
    }
    elseif ($user->level < 80) {
        $user->exp_needed *= 1.04;
    }
    elseif ($user->level < 100) {
        $user->exp_needed *= 1.03;
    }
    else {
        $user->exp_needed = 0;
    }
    $user->level += 1;
    $user->save();
}

我们不修改exp_needed基于prev_exp,因为我们需要一个可预测的指数序列: 1000,1400,1960,2744.而不是1000,1400,3360.

如果您想要根据所有已获得的XP计算它,请保留代码原样。

票数 0
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/171991

复制
相关文章
Django中的QuerySet
  查询集,类似一个列表,包含了满足查询条件的所有项。QuerySet 可以被构造,过滤,切片,做为参数传递,这些行为都不会对数据库进行操作。只有你查询的时候才真正的操作数据库。意味着QuerySet是惰性执行的----即创建查询集不会带来任何的数据库访问,直到查询集需要求值的时候,Django才会真正运行这个查询。
forxtz
2020/10/10
1.4K0
day61-Django基础-模板语言示例+数据库外键
哈哈哈哈哈哈哈哈哈哈或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或哈哈哈哈哈哈哈哈哈哈或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或哈哈哈哈哈哈哈哈哈哈或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或哈哈哈哈哈哈哈哈哈哈或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或或
少年包青菜
2019/09/21
4570
django queryset 合并
1. 通过自带的方法: a1 = User.objects.filter(id__gt=8) a2 = User.objects.filter(id__lt=4) a3 = a1 | a2 注:这种方式合并的结构还是一个queryset,相当于a3把a1和a2的条件合并了,推荐,因为可以用order_by等函数了 只能合并同种model对象的数据 2. 用python的chain合并 from itertools import chain a1 = User.objects.filter(id__
kirin
2020/11/05
7910
Django的Manager和QuerySet
要从数据库检索对象,需要通过模型类的 Manager 构建一个 QuerySet。换言之,models,manager和queryset是我们和数据库交互必须的三个东西。 models本身没有什么需要多说的,Django 使用了一套直观的系统:一个模型类代表一张数据表,一个模型类的实例代表数据库表中的一行记录。
zy010101
2021/10/20
1.1K0
Django之ORM 外键关联(三)
Django 的 ORM 是创建 SQL 去查询和操作数据库的一个 Python 式的方式。
小团子
2019/07/18
2.2K0
Django之ORM 外键关联(三)
Django(19)QuerySet API[通俗易懂]
我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。他的方法全部都是通过Python动态添加的方式,从QuerySet类中拷贝过来的。示例图如下:
全栈程序员站长
2022/09/16
7510
Django(19)QuerySet API[通俗易懂]
Django(15)外键和表关系[通俗易懂]
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:
全栈程序员站长
2022/09/19
2.2K0
Django之QuerySet详解
在内部,创建、过滤、切片和传递一个QuerySet不会真实操作数据库,在你对查询集提交之前,不会发生任何实际的数据库操作。可以使用下列方法对QuerySet提交查询操作:
菲宇
2022/12/21
2.4K0
django开发中关于外键设置
我们要把源码中的db_constraint设置成Flase这样就有关联关系,但是不会受他约数
小小咸鱼YwY
2019/09/11
1.4K0
django RawQuerySet 与QuerySet
使用orm查询,得到的结果类型是QuerySet,这种类型drf可以进行下一步处理, 使用原生sql查询,例如
kirin
2020/11/23
1.5K0
django合并多个queryset
这几天正在做一个关于权限控制的django框架,今天上午遇见了一个bug,因为我的需求是,每个人拥有的权限不同,所以你所能够访问的菜单也不同,那么这时候不同的人员访问不同的菜单是不一样的。
kirin
2020/11/23
2.8K0
Django 2.1.7 查询集 QuerySet
上一篇Django 2.1.7 模型 - 条件查询 F对象 Q对象 聚合查询讲述了关于Django模型的介绍F对象、Q对象、聚合查询等功能。
Devops海洋的渔夫
2019/06/15
1.2K0
从 MySQL 物理外键开始的思考
之前是由于有师弟跟我讨论这个问题,然后我是顺便搜了下知乎把想法也都写下,现在把他放回博客,然后进行了一下细化,依然是just a door系列,依然是为了更前面的探讨一些问题,本期topic是物理外键~let’s start with mysql
芋道源码
2019/10/29
3.8K0
从 MySQL 物理外键开始的思考
Django学习笔记之Django QuerySet的方法
一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get、filter、exclude、delete神马的感觉就已经无所不能了,但随着项目但业务逻辑越来越复杂,这几个方法可能就不能很好但满足我们了,所以这时候,最好的办法是神马??对,读文档!这里的读文档不是有业务需求时去查文档,而是要为了阅读文档而阅读文档。以下也是作为我的文档阅读笔记,我记下了一些我以后可能会用到或者一些技巧性提升的东西,好,不废话,正文开始: 首先,我们假设有以下两个model:
Jetpropelledsnake21
2018/07/05
6030
Django-models & QuerySet API
IntegerField  – 整型 BooleanField  – 布尔值类型 NullBooleanField  – 可以为空的布尔值 CharField     – 字符串类型 必须提供max_length参数,字符长度 TextField      – 文本类型 EmailField     – 一个带有检查 Email 合法性的 CharField GenericIPAddressField      IP地址 URLField        URL类型 SlugField  – 字符串类型,只包含字母,数字,下划线或连字符 CommaSeparatedIntegerField   – 字符串类型,格式必须为逗号分割的数字 UUIDField   uuid类型 DateTimeField     – 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField   – 日期格式 YYYY-MM-DD TimeField   – 时间格式 HH:MM[:ss[.uuuuuu]] FloatField(Field)    – 浮点型 DecimalField(Field)   – 10进制小数 BinaryField(Field)    – 二进制类型
kirin
2020/07/23
1.4K0
Django model update foreign key 外键更新
parent model: master.anken(primary key:id→anken_no) ※ id:自動生成
刀枪不入de王二花
2022/07/20
1.1K0
Django model update foreign key 外键更新
Django学习笔记:QuerySet API
我们通常做查询操作的时候,都是通过模型名字.objects的方式进行操作。其实模型名字.objects是一个django.db.models.manager.Manager对象,而Manager这个类是一个“空壳”的类,他本身是没有任何的属性和方法的。他的方法全部都是通过Python动态添加的方式,从QuerySet类中拷贝过来的。
SingYi
2022/07/14
6400
Django学习笔记:QuerySet API
点击加载更多

相似问题

姜戈QuerySet TypeError

11

姜戈__init__ QuerySet

19

姜戈过滤querySet联盟?

318

按字段中的值计算queryset中的对象。姜戈

12

姜戈。获取模板中当前使用的对象

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文