星际争霸游戏如何运用迭代器模式实现英雄迭代?

2026-04-01 09:111阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1414个文字,预计阅读时间需要6分钟。

星际争霸游戏如何运用迭代器模式实现英雄迭代?

本文介绍了PHP设计模式中的迭代器模式。迭代器模式允许遍历集合对象中的元素,而无需暴露其内部表示。以下是一个简化的例子:

迭代器模式实例:

假设我们有一个任务系统,其中包含多种任务,如农民任务、战士任务和玩家任务。每种任务都可以被迭代以执行。

phpinterface TaskIterator { public function first(); public function next(); public function isDone(); public function currentTask();}

class TaskCollection { private $tasks=[];

public function addTask(Task $task) { $this->tasks[]=$task; }

public function createIterator() { return new TaskIteratorImpl($this->tasks); }}

class TaskIteratorImpl implements TaskIterator { private $tasks; private $currentIndex=0;

public function __construct($tasks) { $this->tasks=$tasks; }

public function first() { $this->currentIndex=0; return $this->currentTask(); }

public function next() { if ($this->currentIndex tasks)) { $this->currentIndex++; } return $this->currentTask(); }

public function isDone() { return $this->currentIndex >=count($this->tasks); }

public function currentTask() { if ($this->currentIndex tasks)) { return $this->tasks[$this->currentIndex]; } return null; }}

class Task { private $name;

public function __construct($name) { $this->name=$name; }

public function getName() { return $this->name; }}

// 使用示例$taskCollection=new TaskCollection();$taskCollection->addTask(new Task('农民任务'));$taskCollection->addTask(new Task('战士任务'));$taskCollection->addTask(new Task('玩家任务'));

$iterator=$taskCollection->createIterator();

while (!$iterator->isDone()) { $task=$iterator->currentTask(); echo 执行任务: . $task->getName() . \n; $iterator->next();}

这个例子中,`TaskCollection` 类负责管理任务集合,而 `TaskIterator` 和 `TaskIteratorImpl` 类则用于迭代这些任务。通过迭代器模式,我们可以轻松地遍历任务集合,而无需关心其内部结构。

本文实例讲述了php设计模式之迭代器模式。分享给大家供大家参考,具体如下:

星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿。

我们自然会想到把电脑的农民放到一个数组,然后一旦玩家造兵,或者战斗打响,把这个数组循环,让里面的农民采矿。

但问题出来了,由于每个任务的设定会有所不同,我们总希望任务的开发比较方便,而且容易修改(一旦发现bug)。

何况有些任务不是农民采矿,而是电脑出兵攻击玩家。

那么过多的固定细节(用数组存放)以及依赖细节(对数组循环),将使得代码的关联性变得很高。

待解决的问题:把循环处理的事务变的抽象。

思路:关键是对农民的循环,用数组处理只是一种方式,我们考虑抽象的数组,而不是具体的数组。

迭代器(Iterator)模式示例:

<?php //聚集接口,意思是所有电脑的农民都聚集在这个类里面 interface IAggregate { //让具体的聚集类实现的,获取使用的迭代器的方法 public function createIterator(); } //具体的聚集类 class ConcreteAggregate implements IAggregate { //存放农民的数组,注意可以不用数组来处理,看完所有的代码就知道了 public $workers; //增加元素的方法,这里元素就是农民 public function addElement($element) { $this->workers[] = $element; } //获取元素的方法 public function getAt($index) { return $this->workers[$index]; } //获取元素的数量的方法 public function getLength() { return count($this->workers); } //获取迭代器的方法 public function createIterator() { return new ConcreteIterator($this); } } //迭代器接口,注意php5有个内置的接口叫Iterator,所以这里我们改成IIterator interface IIterator { //是否元素循环完毕 public function hasNext(); //返回下一个元素,并将指针加1 public function next(); } //具体的迭代器类 class ConcreteIterator implements IIterator { //要迭代的集合 public $collection; //指针 public $index; //构造函数,确定迭代的集合,并将指针置零 public function __construct($collection) { $this->collection = $collection; $this->index = 0; } //是否元素循环完毕 public function hasNext() { if($this->index < $this->collection->getLength()) { return true; } else { return false; } } //返回下一个元素,并将指针加1 public function next() { $element = $this->collection->getAt($this->index); $this->index++; return $element; } } //初始化电脑的农民的聚集对象 $farmerAggregate = new ConcreteAggregate(); //添加农民,这里简单的用字符串表示 $farmerAggregate->addElement('SVC1'); $farmerAggregate->addElement('SVC2'); //获取迭代器 $iterator = $farmerAggregate->createIterator(); //将农民聚集对象循环 while ($iterator->hasNext()) { //获取下一个农民 $element = $iterator->next(); //我们简单的输出 echo $element; } ?>

用途总结:迭代器模式建立了类似数组的形式,从上面的代码可以看到,如果要修改循环的处理,或者修改被循环的集合,都不必修改其它相关的代码。

实现总结:需要一个管理聚集的类,比如上面的ConcreteAggregate。另外需要迭代器类,比如上面的ConcreteIterator。然后把所有的操作,比如添加元素,获取下一个元素,指针之类的数组方面的操作抽象出来,这样其它的代码只要使用方法,比如getLength(),而不是细节化的count()函数,这样即使不用数组存放农民,也不需要改动聚集类以外的代码。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

星际争霸游戏如何运用迭代器模式实现英雄迭代?

希望本文所述对大家PHP程序设计有所帮助。

本文共计1414个文字,预计阅读时间需要6分钟。

星际争霸游戏如何运用迭代器模式实现英雄迭代?

本文介绍了PHP设计模式中的迭代器模式。迭代器模式允许遍历集合对象中的元素,而无需暴露其内部表示。以下是一个简化的例子:

迭代器模式实例:

假设我们有一个任务系统,其中包含多种任务,如农民任务、战士任务和玩家任务。每种任务都可以被迭代以执行。

phpinterface TaskIterator { public function first(); public function next(); public function isDone(); public function currentTask();}

class TaskCollection { private $tasks=[];

public function addTask(Task $task) { $this->tasks[]=$task; }

public function createIterator() { return new TaskIteratorImpl($this->tasks); }}

class TaskIteratorImpl implements TaskIterator { private $tasks; private $currentIndex=0;

public function __construct($tasks) { $this->tasks=$tasks; }

public function first() { $this->currentIndex=0; return $this->currentTask(); }

public function next() { if ($this->currentIndex tasks)) { $this->currentIndex++; } return $this->currentTask(); }

public function isDone() { return $this->currentIndex >=count($this->tasks); }

public function currentTask() { if ($this->currentIndex tasks)) { return $this->tasks[$this->currentIndex]; } return null; }}

class Task { private $name;

public function __construct($name) { $this->name=$name; }

public function getName() { return $this->name; }}

// 使用示例$taskCollection=new TaskCollection();$taskCollection->addTask(new Task('农民任务'));$taskCollection->addTask(new Task('战士任务'));$taskCollection->addTask(new Task('玩家任务'));

$iterator=$taskCollection->createIterator();

while (!$iterator->isDone()) { $task=$iterator->currentTask(); echo 执行任务: . $task->getName() . \n; $iterator->next();}

这个例子中,`TaskCollection` 类负责管理任务集合,而 `TaskIterator` 和 `TaskIteratorImpl` 类则用于迭代这些任务。通过迭代器模式,我们可以轻松地遍历任务集合,而无需关心其内部结构。

本文实例讲述了php设计模式之迭代器模式。分享给大家供大家参考,具体如下:

星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿。

我们自然会想到把电脑的农民放到一个数组,然后一旦玩家造兵,或者战斗打响,把这个数组循环,让里面的农民采矿。

但问题出来了,由于每个任务的设定会有所不同,我们总希望任务的开发比较方便,而且容易修改(一旦发现bug)。

何况有些任务不是农民采矿,而是电脑出兵攻击玩家。

那么过多的固定细节(用数组存放)以及依赖细节(对数组循环),将使得代码的关联性变得很高。

待解决的问题:把循环处理的事务变的抽象。

思路:关键是对农民的循环,用数组处理只是一种方式,我们考虑抽象的数组,而不是具体的数组。

迭代器(Iterator)模式示例:

<?php //聚集接口,意思是所有电脑的农民都聚集在这个类里面 interface IAggregate { //让具体的聚集类实现的,获取使用的迭代器的方法 public function createIterator(); } //具体的聚集类 class ConcreteAggregate implements IAggregate { //存放农民的数组,注意可以不用数组来处理,看完所有的代码就知道了 public $workers; //增加元素的方法,这里元素就是农民 public function addElement($element) { $this->workers[] = $element; } //获取元素的方法 public function getAt($index) { return $this->workers[$index]; } //获取元素的数量的方法 public function getLength() { return count($this->workers); } //获取迭代器的方法 public function createIterator() { return new ConcreteIterator($this); } } //迭代器接口,注意php5有个内置的接口叫Iterator,所以这里我们改成IIterator interface IIterator { //是否元素循环完毕 public function hasNext(); //返回下一个元素,并将指针加1 public function next(); } //具体的迭代器类 class ConcreteIterator implements IIterator { //要迭代的集合 public $collection; //指针 public $index; //构造函数,确定迭代的集合,并将指针置零 public function __construct($collection) { $this->collection = $collection; $this->index = 0; } //是否元素循环完毕 public function hasNext() { if($this->index < $this->collection->getLength()) { return true; } else { return false; } } //返回下一个元素,并将指针加1 public function next() { $element = $this->collection->getAt($this->index); $this->index++; return $element; } } //初始化电脑的农民的聚集对象 $farmerAggregate = new ConcreteAggregate(); //添加农民,这里简单的用字符串表示 $farmerAggregate->addElement('SVC1'); $farmerAggregate->addElement('SVC2'); //获取迭代器 $iterator = $farmerAggregate->createIterator(); //将农民聚集对象循环 while ($iterator->hasNext()) { //获取下一个农民 $element = $iterator->next(); //我们简单的输出 echo $element; } ?>

用途总结:迭代器模式建立了类似数组的形式,从上面的代码可以看到,如果要修改循环的处理,或者修改被循环的集合,都不必修改其它相关的代码。

实现总结:需要一个管理聚集的类,比如上面的ConcreteAggregate。另外需要迭代器类,比如上面的ConcreteIterator。然后把所有的操作,比如添加元素,获取下一个元素,指针之类的数组方面的操作抽象出来,这样其它的代码只要使用方法,比如getLength(),而不是细节化的count()函数,这样即使不用数组存放农民,也不需要改动聚集类以外的代码。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

星际争霸游戏如何运用迭代器模式实现英雄迭代?

希望本文所述对大家PHP程序设计有所帮助。