Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 正在为这组对象寻找良好的设计模式_Design Patterns_Language Agnostic - Fatal编程技术网

Design patterns 正在为这组对象寻找良好的设计模式

Design patterns 正在为这组对象寻找良好的设计模式,design-patterns,language-agnostic,Design Patterns,Language Agnostic,我最初是在programmers.stackexchange.com上问的,因为我认为答案对stackoverflow来说太主观了。然而,在评论中指出: 这可能更适合StackOverflow。。。这是一个与直接编程问题相关的问题,讨论编程解决方案。一种解决方案可能等同于另一种解决方案,其中两种解决方案之间的选择是主观的,但对整个问题本身的讨论却并非如此,因为某些解决方案显然不适用。所以这个问题确实有一个或几个好的答案,而像“哪一个是最好的文本编辑器?”这样的问题没有 因此,在仔细考虑了一下情况

我最初是在programmers.stackexchange.com上问的,因为我认为答案对stackoverflow来说太主观了。然而,在评论中指出:

这可能更适合StackOverflow。。。这是一个与直接编程问题相关的问题,讨论编程解决方案。一种解决方案可能等同于另一种解决方案,其中两种解决方案之间的选择是主观的,但对整个问题本身的讨论却并非如此,因为某些解决方案显然不适用。所以这个问题确实有一个或几个好的答案,而像“哪一个是最好的文本编辑器?”这样的问题没有

因此,在仔细考虑了一下情况(并查看了一些似乎不适合的模式)之后,我的困境是:

设置 我正在设计一个简单的战斗策略游戏

  • 两名战斗人员在一定时间内相互攻击
  • 比赛结束后,最健康的选手将成为赢家
  • 在比赛期间,球员没有直接干预。玩家在战斗前为他们的战斗人员定义一些策略,“AI”(术语松散地使用)决定战斗人员将做什么
  • 战斗由一个“滴答”秒的任意计时器组成,战斗人员的攻击速度(除其他外)决定他们做某事的频率
  • 除了战斗对象,还有一个“天气”对象,可以对战斗人员的能力产生一些随机环境影响
  • 整个过程只是每秒钟循环一次,环境影响和攻击都会被确定和执行,都会被记录下来,然后日志会作为一个游戏一个游戏地显示给用户
  • 问题 我不确定什么样的设计模式最适合我完成上述任务。我正在寻找一种模式,它可以让我增加未来“战斗”的复杂性。可能通过在战斗中添加更多的对象(更多的战斗人员,可能是一个新的环境对象,等等)

    起初,我认为观察者模式会起作用。我会有一个代表“观察者/主体”的战斗对象。它跟踪一个计时器,并随着计时器的增加,更新所有参与者观察者对象。然而,防御者战斗人员的许多参数都会影响攻击者战斗人员的行动,因此该场景中的“观察者”需要相互了解,因此我不确定这是否是正确的方法


    最后,我并不想完美地确定一个设计模式。也许没有“最佳匹配”,我只是在寻找一个坚实的基础

    试图为一个相当详细的情况找到一个“正确”的设计模式是徒劳的。设计模式解决特定编程语言或语言中出现的某些常见低级情况—不一定存在针对您可能发现的每种情况的特定模式,也不一定只使用一种模式来解决您的问题

    特别是,这种情况并不是设计模式的真正目的——设计模式主要关注类和对象之间的静态关系,而您在这里讨论的本质上是算法。设计模式提供了实现算法的方法,但它们本身并不是真正的算法

    这应该非常简单。您有一个在指定持续时间内运行的while循环。每个迭代代表一秒钟的时间,在该迭代中,它将调用一个或多个方法来处理战斗中涉及的每个相关对象-战斗人员、天气等(有多少种方法,哪些方法是游戏设计问题,而不是(尚未)编程问题)如果愿意,这些对象可以来自保存整个上下文的战斗对象


    这里并不真正需要观察者模式,事实上,通过将其从易于理解的迭代过程更改为事件驱动的过程,它将使问题严重复杂化。如果需要对不同的属性进行访问,战斗人员可以直接查询另一个战斗者。

    < P>如果你真的想在这里使用一个模式,我会考虑一个命令模式。 例如,您可以创建一系列命令“战斗移动”,以便在一段时间内执行。你也可以很容易地根据对手的动作取消命令。随着游戏的不断发展,你可以很容易地添加一些动作/策略


    但这并不是整个游戏的模式,它更多的是针对其中一个方面的解决方案。

    好吧,一切都可以通过对象建模:)

    假设你们不需要“真实”的秒数——你们可以计算整个战斗,将每一步保存在日志中,将日志保存在数据库的某个地方,然后每秒向玩家显示一行日志。您的日志不仅可以是字符串,还可以包含“此时”序列化的战斗人员数据,这样您甚至可以进行“交互式”战斗(玩家可以在战斗中更改其战斗策略,您可以以反序列化的战斗人员状态作为新的起点重新计算战斗)

    下一个。让我们每个战士都是目标:

    class Combatant {
      public $strategy;
      public takeDamage($damageType,$damageAmount){
         if($this->strategy->tryAvoidDamage($damageType,$damageAmount)) return;
         $newDamageAmount=$this->reduceDamageByArmor($damageType,$damageAmount);
         $newDamageAmount=$this->reduceDamageByAbilities($damageType,$newDamageAmount);
         // change your health below...
      }
    
      public dealDamage($weapoon, $enemy){
         $damageType = $weapoon->damageType;
         $damageAmount = $weapoon->damageAmount;
         $damageAmount = this->applySkills($weapoon, $damageType, $damageAmount);
         $enemy->takeDamage($damageType, $damageAmount);
      }
    
    }  
    
    战略也是目标:

    class Strategy{
       public $combatant;
       public tryAvoidDamage($damageType,$damageAmount){
         if($damageType=="melee" && $combatant->actionPoints>10){
           // try to block punch (roll dice for skills etc)
           return $combatant->tryBlockPunch();
         }
         return false; // can't avoid bullet
       }
       public DoAction($enviroment){
          if($combatant->hp<10){
             $combatant->tryCastHealing();
          } else {
            var $enemy = $enviroment->findEnemes()->whereDistanceLessThan(2)->mostWeak();
            if($enemy != null) {
               $combatant->dealDamage($combatant->hands, $enemy) 
            }
          }
       }   
    }
    

    不确定您是否只使用一个DP管理游戏。DPs可能会帮助您解决编写代码时出现的一些问题。例如,我可以看到#3“为”定义一些策略将与策略模式相匹配;)是的,战斗对象将使用策略模式和状态模式的组合。我感兴趣的是这场斗争的整体“管理”。+1表示“试图找到‘正确’的设计模式是徒劳的搜索。”。我认为这是一个好主意,看看是否有一个设计模式,以适应您的问题。如果有那么好的,就用它。如果没有问题,不要为了它而试图把你的问题压缩成一个模式。我同意有时候会有问题
    while($combatantA->isAlive() && $combatantB->isAlive()){
      $combatantA->strategy->DoAction(...)
      $combatantB->strategy->DoAction(...)
    }