回合制游戏的速度算法?

时间:2015-04-24 04:49:59

标签: java android algorithm

我正在创建一个基于文本的演示RPG项目,我很难找到和/或找出使用角色的方法。快速形成一种算法,确定战斗中的攻击顺序。首先,我想对已经建立的相关算法进行任何输入或指导。否则,我可以使用我的算法想法的帮助。条款和代码如下。它仍然需要很多工作。提前谢谢!

- 我如何确定订单?

1)我在LinkedHashMap中按降序排列6个字符的速度(键值0中的最高速度)以保持顺序

2)使用最快的速度作为参考,我乘以一个因子,这个因子给出了我用来确定角色顺序的那个速度的一小部分。例如,假设最快速度为50,因子为0.1。这将产生5(50 * 0.1 = 5)的值。

3)现在我递归地减去从因子计算中收到的值来确定速度顺序。让我们说字符速度是char1 = 50,char2 = 40,char3 = 38,char4 = 33,char5 = 30,char6 = 25。我首先将最快的字符添加到另一个LinkedHashMap,然后我使用我的因子来接收一个新的值,基本上我做50-5来得到45.我检查第二个最快的字符(char2)是否有一个大于45的速度,如果是这样我将char2添加到地图中,否则我将先前添加的char添加到地图(char1)。然后我再次进行减法,45-5得到40并做同样的检查。我继续这个,直到我将所有字符添加到地图至少一次。我认为这是我的速度模式。我只需要重复这个模式,只是在字符死亡时将其修改。以下是基于我上面提供的示例的订单:

char1 w / 50 speed

char1 w / 50速度(再次)

char2 w / 40 speed

char3 w / 38 speed

char4 w / 33 speed

char5 w / 30 speed

char6 w / 25 speed

现在你看到我想要做的事情,我愿意接受建议。这是我编程的方法,假设我已经按速度订购了LinkedHashMap。

    // stores entire speed pattern
    LinkedHashMap<Integer, Integer> map = new LinkedHashMap<Integer, Integer>(); 

    // order un-ordered hashMap "list"
    List<Entry<Integer, Integer>> list = new LinkedList<Entry<Integer, Integer>>(sortedMap.entrySet());
    Collections.sort(list, new Comparator<Entry<Integer, Integer>>() {
        @Override
        public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {        
            return o2.getValue().compareTo(o1.getValue());
        }
    });

    // maintaining insertion order with the help of LinkedList
    Map<Integer, Integer> result = new LinkedHashMap<Integer, Integer>();
    for (int i = 0; i < list.size(); i++) {
        result.put(i, list.get(i).getValue());
    }

    int count = 0;
    // note: totalChars = 6
    // note: multiplierSpeedPattern = 0.1
    double highestSpeed = result.get(0); // highest speed
    while (Math.round(highestSpeed) > 0 && count < totalChars) {        
       double temp = highestSpeed;
       highestSpeed = (double) (temp - (multiplierSpeedPattern * temp));
       int roundedHighestSpeed = (int) Math.round(highestSpeed);
       Log.i(TAG, "roundedHighestSpeed: " + roundedHighestSpeed);
       Iterator iter = result.entrySet().iterator();
       if (iter.hasNext()) {    
           if (result.get(0) > roundedHighestSpeed && result.get(1) < roundedHighestSpeed) {
               map.put(count, result.get(count));           
               count++;                     
           } else if (result.get(1) > roundedHighestSpeed && result.get(2) < roundedHighestSpeed) {
               map.put(count, result.get(count));
               count++;
           } else if (result.get(2) > roundedHighestSpeed && result.get(3) < roundedHighestSpeed) {
               map.put(count, result.get(count));
               count++;
           } else if (result.get(3) > roundedHighestSpeed && result.get(4) < roundedHighestSpeed) {
               map.put(count, result.get(count));
               count++;
           } else if (result.get(4) > roundedHighestSpeed && result.get(5) < roundedHighestSpeed) {
               map.put(count, result.get(count));
               count++;
           } else if (result.get(5) > roundedHighestSpeed) {
               map.put(count, result.get(count));
               count++;
           } else {
               map.put(count, result.get(count));
               count++;
           }
       }
   }

我的逻辑不正确,因为我需要以某种方式检查我是否已经在地图中添加了一个角色。对此有何帮助?

1 个答案:

答案 0 :(得分:1)

不幸的是,我没有时间仔细阅读你的问题。然而,对于这类问题,通常会先对元素进行排序。

然而,LinkedHashMap保留了插入顺序,但没有对元素进行排序。使用TreeMap对顺序进行排序(用作键的实例的类必须实现Comparable,否则您将在运行时获得类转换异常)。

这应该可以完成大部分工作。有关算法的详细信息,我真的推荐这本伟大的书&#34;算法简介&#34; (由Cormen,Leierson,Rivest和Stein撰写)。它提供了很好的示例和解释以及各种算法。对于您的问题,请查看排序/扫描算法。