Java 数学置换码?

Java 数学置换码?,java,math,permutation,Java,Math,Permutation,我的应用程序的一部分有6个不同的输入,每个输入有5个不同的可能值。这计算出15625个排列。我想相信我不必把每一个都写出来,但我真的不确定。我已经开始编码,好像我必须把每一个都编码出来,但这让我想到一定有更好的方法。所以我来这里是想看看是否有经验丰富的程序员知道更好的方法来做到这一点 还有别的办法吗?除了必须对每一个排列进行编码之外 方程解释: 有6个肢体(输入)。每个输入取决于其剩余运行状况的百分比。这些依赖项(以百分比表示)小于或等于0、大于0且小于或等于25、大于25且小于或等于50、大于

我的应用程序的一部分有6个不同的输入,每个输入有5个不同的可能值。这计算出15625个排列。我想相信我不必把每一个都写出来,但我真的不确定。我已经开始编码,好像我必须把每一个都编码出来,但这让我想到一定有更好的方法。所以我来这里是想看看是否有经验丰富的程序员知道更好的方法来做到这一点

还有别的办法吗?除了必须对每一个排列进行编码之外

方程解释: 有6个肢体(输入)。每个输入取决于其剩余运行状况的百分比。这些依赖项(以百分比表示)小于或等于0、大于0且小于或等于25、大于25且小于或等于50、大于50且小于或等于75以及大于75。每种排列往往会产生不同的输出。此输出显示在应用程序中,供用户使用

[编辑]这不是损失计算。这些是根据玩家受到的伤害大小对玩家统计的惩罚。预期结果要么不影响他们的统计数据,要么减少他们的统计数据。有时,减去的数字对于不同的变量是相同的。如果你看下面的代码,您将看到
head>0.0&&head 0.0&&胸部0.25&&胸部0.25&&leftarm 0.25&&righarm 0.00&&h0.0&&h0.0&&c0.0&&la0.0&&ra0.0&&ll0.0&&rl0.25&&h0.25&&h0.0&&c0.0&&la0.0&&ll0.0&&rl0.50&&hr0.0&&ra&&0.0&&la0.0&&la0.0&&rl0.0和&rl 0.75
如果(MCF!=0.0&&W1AttF!=0.0&&h>0.75&&c>0.0&&c 0.0&&la 0.0&&ra 0.0&&rl 0.25&&c 0.0&&h 0.25&&c 0.0&&la 0.0&&ra 0.0&&ll 0.0&&rl 0.50&&c 0.0&&la 0.0&&rl 0.75
否则,如果(MCF!=0.0&&W1AttF!=0.0&&h>0.0&&h 0.75

&&la>0.0&&la 0.0&&ra 0.0&&ll 0.0&&rl 0.0&&h您可以创建一个方法,将参数转换为与排列对应的从0到15625(5^6)的唯一整数,然后根据它进行分支

编辑:
另一种选择是将此规则移动到配置文件中,并在Java代码中进行处理。

对于每种情况的预期结果,几乎没有什么可以继续的。从代码中的注释中,我收集了一些RPG损伤计算

最好先用自然语言描述问题,或者更确切地说,不是问题,而是控制每个参数组合结果的规则。看看规则中出现的模式,通常可以定义一组相当小的案例,这些案例可以表示为数学公式

如果您真的想完全自由地控制每个案例的结果,则需要枚举案例,并构建包含每个可能案例的结果的数据结构(例如,以某种形式读入内存的每个组合的结果的数据文件)

根据我在你的代码中看到的推测,我猜你是在试图根据位置、武器、防御等来计算伤害

这有助于使用简单的数学公式,例如,首先确定位置,然后根据位置指定一个dmanage修饰符(伪代码):


试着打破你的规则,这样你就可以像上面的例子那样写了。

排列的数目是15625(5^6),而不是7776(6^5)。每个排列可能会产生不同的输出。--但每个案例的预期输出是什么?如果你想要5^6个结果,我认为你没有任何选择,但至少在阅读方面稍微简化的一种方法是将“健康”分类,而不是“健康”(h>0&&h关键问题是:每个排列/组合应该发生什么?似乎在大多数情况下,结果应该是
weapon1attack.setText(“死亡”)
。你可能只需要为结果不是死的情况定义规则,并让死的情况成为默认情况。正如Danil在他的回答中指出的,类似这样的事情可以简洁地写在一个开关中,但是关于如何定义这15625个情况的问题仍然悬而未决。哟你当然不想手动定义它们,但可能基于一些规则…?如果没有合理的计算结果的方法,我建议创建一个查找表
float[][][][]LUT={…}
,根据25/50/75/…规则将值转换为索引,然后执行
result=LUT[i1][i2][i3][i4][i6]
不过,我怀疑如果试图将这么多的值制成表格,会遇到Java源文件大小的限制。此外,OP无法手动执行此操作。必须以某种方式生成表格,在这种情况下,生成代码也可以直接放在表格的位置上。这仍然会导致让他分别对每个分支进行编码。他将能够使用整数代码上的比较运算符合并具有类似操作的分支。作为对OP中评论的回复,创建枚举更好,它是一种更结构化的方法。但我很难想象你如何在Java中创建一个具有15625个不同值的枚举。使用整数有点像C语言中的枚举。我认为它实际上没有那么多。有些将与OP中显示的相同。我必须枚举结果,而不是健康值(即
h>0.00&&h第二次思考,我不这么认为。看到OP,我想我有一个突破性的想法:)我同意。你必须先把你的问题分解成小问题。我想我成功地把它分解了。有关详细信息,请参阅OPEDITS@Mikitz我明白了,我最初的猜测并不遥远
//  HEALTH
//  N > 0.75            == Full
//  N > 0.50 && <= 0.75 == HighHealth
//  N > 0.25 && <= 0.50 == MedHealth
//  N > 0.00 && <= 0.25 == LowHealth
//  N <= 0.00           == Dead
//      SETTING DATA
//      WEAPON 1
//      MELEE
weapon1attack.setText(PenaltiesMeleeHelper);
weapon1accuracy.setText(PenaltiesMeleeHelper);
//      RANGED
weapon1thrownattack.setText(PenaltiesThrownHelper);
weapon1thrownaccuracy.setText(PenaltiesThrownHelper);
//      WEAPON 2
//      MELEE
weapon2attack.setText(PenaltiesMeleeHelper);
weapon2accuracy.setText(PenaltiesMeleeHelper);
//      RANGED
weapon2thrownattack.setText(PenaltiesThrownHelper);
weapon2thrownaccuracy.setText(PenaltiesThrownHelper);
// There are 3 main outcomes that are suffered for being damaged too much
// The reduction of parry (PRY), dodge (DOD), and damage & accuracy (AM)
// The deductions range from -2 to -5. 
// I could declare Enums for each type

PRY2 = (- 2)
DOD2 = (- 2)
AM2 = (- 2)

PRY2 would be put into the equation if la > 0.50 && la <= 0.75 || ra > 0.50 && ra <= 0.75
DOD2 would be put into the equation if la > 0.50 && la <= 0.75 || ra > 0.50 && ra <= 0.75 || ll > 0.50 && ll <= 0.75 || rl > 0.50 && rl <= 0.75
AM2 would be put into the equation if la > 0.50 && la <= 0.75 || ra > 0.50 && ra <= 0.75 || c > 0.50 && c <= 0.75

PRY3 = (- 3)
DOD3 = (- 3)
AM3 = (- 3)

PRY3 would be put into the equation if c > 0.25 && c <= 0.50 || la > 0.25 && la <= 0.50 || ra > 0.25 && ra <= 0.50 || 
DOD3 would be put into the equation if c > 0.25 && c <= 0.50 || la > 0.25 && la <= 0.50 || ra > 0.25 && ra <= 0.50 || ll > 0.25 && ll <= 0.50 || rl > 0.25 && rl <= 0.50 
AM3 would be put into the equation if c > 0.25 && c <= 0.50 || la > 0.25 && la <= 0.50 || ra > 0.25 && ra <= 0.50 || 

PRY4 = (- 4)
DOD4 = (- 4)
AM4 = (- 4)

PRY4 would be put into the equation if la > 0.0 && la <= 0.25 || ra > 0.0 && ra <= 0.25 || ll > 0.0 && ll <= 0.25 || rl > 0.0 && rl <= 0.25
DOD4 would be put into the equation if la > 0.0 && la <= 0.25 || ra > 0.0 && ra <= 0.25 || ll > 0.0 && ll <= 0.25 || rl > 0.0 && rl <= 0.25
AM4 would be put into the equation if la > 0.0 && la <= 0.25 || ra > 0.0 && ra <= 0.25 || ll > 0.0 && ll <= 0.25 || rl > 0.0 && rl <= 0.25

PRY5 = (- 5)
DOD5 = (- 5)
AM5 = (- 5)

PRY5 would be put into the equation if h > 0.0 && h <= 0.25 || c > 0.0 && c <= 0.25 || la <= 0.0 || ra <= 0.0 || ll <= 0.0 || rl <= 0.0
DOD5 would be put into the equation if h > 0.0 && h <= 0.25 || c > 0.0 && c <= 0.25 || la <= 0.0 || ra <= 0.0 || ll <= 0.0 || rl <= 0.0
AM5 would be put into the equation if h > 0.0 && h <= 0.25 || c > 0.0 && c <= 0.25 || la <= 0.0 || ra <= 0.0 || ll <= 0.0 || rl <= 0.0

// I'm not sure how, but somehow it would know, since it's PRY, then it knows to take the Enum and deduct it from the PRY slot and not the DOD or AM slots. 
// Is this a step in the right direction? 
//      SETTING DATA
//      WEAPON 1
//      MELEE           
        try {
            float STRF = NumberUtils.toFloat(pref.getString("strength", ""), 0.0f);
            float MCF = NumberUtils.toFloat(pref.getString("melee", ""), 0.0f);
            float W1AttF = NumberUtils.toFloat(pref.getString("w1attack", ""), 0.0f);

    // ALL LIMBS > 0.00 && h <= 0.25
            if (MCF != 0.0 && W1AttF != 0.0 && h > 0.0 && h <= 0.25 && c > 0.0 && c <= 0.25
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 26));
            } 
        // HEAD h > 0.25 && h <= 0.50   
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.25 && h <= 0.50 && c > 0.0 && c <= 0.25
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 21));
            }
            // HEAD h > 0.50 && h <= 0.75   
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.50 && h <= 0.75 && c > 0.0 && c <= 0.25
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 21));
            }
            // HEAD h > 0.75    
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.75  && c > 0.0 && c <= 0.25
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 21));
            }
        // CHEST c > 0.25 && c <= 0.50
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.0 && h <= 0.25 && c > 0.25 && c <= 0.50
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 26));
            } 
            // CHEST c > 0.50 && c <= 0.75
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.0 && h <= 0.25 && c > 0.50 && c <= 0.75
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 26));
            } 
            // CHEST c > 0.75
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.0 && h <= 0.25 && c > 0.75
                    && la > 0.0 && la <= 0.25 && ra > 0.0 && ra <= 0.25 && ll > 0.0 && ll <= 0.25
                    && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 26));
            } 
        // HEAD ONLY    
            else if (MCF != 0.0 && W1AttF != 0.0 && h > 0.0 && h <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 5));
            } else if (MCF != 0.0 && W1AttF != 0.0 && h <= 0.0) {
                weapon1attack.setText("Dead");
            } 
        // CHEST ONLY   
            else if (MCF != 0.0 && W1AttF != 0.0 && c > 0.0 && c <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 5));
            } else if (MCF != 0.0 && W1AttF != 0.0 && c > 0.25 && c <= 0.50) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 3)); 
            } else if (MCF != 0.0 && W1AttF != 0.0 && c > 0.50 && c <= 0.75) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 2));
            } else if (MCF != 0.0 && W1AttF != 0.0 && c <= 0.0) {
                weapon1attack.setText("Dead");
            } 
        // LEFT ARM ONLY    
            else if (MCF != 0.0 && W1AttF != 0.0 && la > 0.0 && la <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 4));
            } else if (MCF != 0.0 && W1AttF != 0.0 && la > 0.25 && la <= 0.50) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 3)); 
            } else if (MCF != 0.0 && W1AttF != 0.0 && la > 0.50 && la <= 0.75) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 2));
            } else if (MCF != 0.0 && W1AttF != 0.0 && la <= 0.0) {
                weapon1attack.setText("Dead");
            } 
        // RIGHT ARM ONLY   
            else if (MCF != 0.0 && W1AttF != 0.0 && ra > 0.0 && ra <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 4));
            } else if (MCF != 0.0 && W1AttF != 0.0 && ra > 0.25 && ra <= 0.50) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 3)); 
            } else if (MCF != 0.0 && W1AttF != 0.0 && ra > 0.50 && ra <= 0.75) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 2));
            } else if (MCF != 0.0 && W1AttF != 0.0 && ra <= 0.0) {
                weapon1attack.setText("Dead");
            }   
        // LEFT LEG ONLY    
            else if (MCF != 0.0 && W1AttF != 0.0 && ll > 0.0 && ll <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 4));
            } else if (MCF != 0.0 && W1AttF != 0.0 && ll <= 0.0) {
                weapon1attack.setText("Dead");
            }   
        // RIGHT LEG ONLY   
            else if (MCF != 0.0 && W1AttF != 0.0 && rl > 0.0 && rl <= 0.25) {
                weapon1attack.setText(Float.toString((STRF + MCF + W1AttF) - 4));
            } else if (MCF != 0.0 && W1AttF != 0.0 && rl <= 0.0) {
                weapon1attack.setText("Dead");
            }   

            else if (W1AttF == 0.0 || MCF == 0.0) {
                weapon1attack.setText("");
            } else if (MCF != 0.0 && W1AttF != 0.0) {
                weapon1attack.setText(Float.toString(STRF + MCF + W1AttF));
            }   
        }
        catch (NumberFormatException ignore) {}
 modifier = 1.0; // defaults to "normal" damager
 switch (location) {
     case HEAD:
         modfier *= 2.00; // double damage
     case CHEST:
         modifier *= 0.75; // 75% damage
     default:
         // elsewhere: no change
         break;
 }
 // ... further modify based on other parameters like attack
 // type, defense type whatever you have

 // now figure out a base damage, purely fictional
 baseDmg = attack - defense;
 // we don't want negative damage in case def > att,
 // so if negative set to 1.0
 baseDmg = Math.max(baseDmg, 1.0);

 // caluclate final dmg using modifier
 realDmg = baseDmg * modifier;

 if (realDmg > life)
     // dead!
 else 
     // ouch!