星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给。但这些是根据种族的不同而不同。
待解决的问题:我们需要根据种族的不同,而对玩家进行不同的初始化,最好将这些不同的处理方式封装。
思路:定义初始化的接口,然后制作不同种族的初始化类。
策略模式(Strategy)示例:
为了使代码不至于过长,一部分类的定义不在此写出,如果要调试,请用字符串等方式替代new。
<?php
// 玩家的类
class player {
//所属种族
public $race;
//部队
public $army;
//建筑
public $building;
//人口供给
public $supply;
//构造函数,设定所属种族
public function __construct($race)
{
$this->race = $race;
}
}
//初始化的接口
interface initialPlayer {
//制造初始化的部队
public function giveArmy($player);
//制造初始化的建筑
public function giveBuilding($player);
//初始化人口供给
public function giveSupply($player);
}
//虫族的初始化算法
class zergInitial implements initialPlayer {
// 制造初始化的部队
public function giveArmy($player)
{
// 一个Overlord
$player->army[] = new Overlord();
//四个虫族农民
for($i=0; $i<5;$i++)
{
$player->army[] = new Drone();
}
}
// 制造初始化的建筑
public function giveBuilding($player)
{
// 一个基地
$player->building[] = new Hatchery();
}
//初始化人口供给
public function giveSupply($player)
{
//虫族初始人口供给为9
$player->supply = 9;
}
}
// 人族的初始化算法
class terranInitial implements initialPlayer {
//制造初始化的部队
public function giveArmy($player)
{
//四个人族农民
for($i=0; $i<5;$i++)
{
$player->army[] = new SVC();
}
}
//制造初始化的建筑
public function giveBuilding($player)
{
//一个基地
$player->building[] = new Hatchery();
}
//初始化人口供给
public function giveSupply($player)
{
//人族初始人口供给为10
$player->supply = 10;
}
}
// 初始化的控制类
class initialController {
// 构造函数,参数为玩家的数组
public function __construct($playerArray)
{
foreach ($playerArray as $player)
{
switch ($player->race)
{
case ‘zerg’:
$initialController = new zergInitial();
break;
case ‘terran’:
$initialController = new terranInitial();
break;
}
$initialController->giveArmy($player);
$initialController->giveBuilding($player);
$initialController->giveSupply($player);
}
}
}
//假设两个虫族,一个人族
$playerArray = array(new player(‘zerg’), new player(‘zerg’), new player(‘terran’));
//进行初始化工作
$initialController = new initialController($playerArray);
?>
用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。
实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。
附:
<?php
//打折接口
interface IDiscountor
{
public function getDiscount();
}
//普通用户打折类
class commonDiscountor implements IDiscountor
{
public function getDiscount()
{
$discount = 1;
return $discount;
}
}
//高级用户打折类
class advanceDiscountor implements IDiscountor
{
public function getDiscount()
{
$discount = 0.9;
return $discount;
}
}
//vip用户打折类
class vipDiscountor implements IDiscountor
{
public function getDiscount()
{
$discount = 0.8;
return $discount;
}
}
//打折类
class discountor
{
public function getDiscount($rank)
{
switch ($rank) {
case 'common':
$discountor = new commonDiscountor();
break;
case 'advance':
$discountor = new advanceDiscountor();
break;
case 'vip':
$discountor = new vipDiscountor();
break;
}
return $discountor->getDiscount();
}
}
$discountor = new discountor();
echo $discountor->getDiscount('advance');
这个就是策略模式(Strategy),将不同情况的算法分拆到不同的类(比如advanceDiscountor类),然后调用者(discountor类)根据具体的情况,用算法类的对象来处理。
分享到:
相关推荐
### 设计模式基础知识点 #### 一、设计模式概述 设计模式是一种被广泛采用的解决方案模板,用于解决软件设计中的常见问题。它不仅有助于代码的重用,还提高了代码的可读性和可靠性。设计模式是软件工程的重要组成...
闲来无事就做了个批处理综合工具,取名为东拼西凑的原因就是这个程序本来就是我东拼西凑搞出来的。没有任何技术,也没有版权,想怎么改就怎么改,如果可以的话留下我的链接。 里面用到的批处理大部分来至非常批处理...
易语言东拼西凑Web屏幕监视器源码,窗口消息处理,客户进入,客户离开,数据到达,启动,停止,监听,发送文本,发送,接收,接收文本,断开连接,取服务器端口,取服务器IP,取客户IP,取客户端口,异步选择,检查连接状态,转换图像...
Protel是Altium Designer的早期版本名称,两者在快捷键和功能上有许多相似之处。下面是一些关于Altium DXP Protel快捷键及其对应的功能的详细说明: 1. **设计导航浏览器快捷键**: - `Ctrl + F4`:关闭当前活动...
以下是对通达信指标公式源码的解析,涵盖了公式的组成部分、技术指标和交易策略。 一、公式组成部分 1. 移动平均线:MA5、MA10、MA20、MA60分别表示5日、10日、20日和60日的移动平均线。 2. 技术指标:AA1、AA2、...
图形,讲解pbr很好的资料 什么是PBR? 基于物理的渲染过程。 PBR是一种着色和渲染技术,用于更精确的描述光如何与物体表面互动。 ...(1)方法论和算法基于精确的计算公式,免除创作表面的猜想过程。...
IBM-关注公用事业网络安全缺陷:从东拼西凑防线,转变为成竹在胸,安心无忧-2019.3-20页.pdf.pdf
Starry-LoginActually, this JS code is come from another githuber and I changed a little bit, my stitching technology is very poor.怎么说呢,js特效是找来的改了一点点,拼接技术贼垃圾,只是自己用用,侵删
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助...
当前,生鲜电商的盈利模式仍然在探索之中,即使是每日优鲜、盒马鲜生这类处于一线的生鲜电商平台也面临盈利压力。生鲜电商想要在市场中占有一席之地,需要不断创新商业模式,优化供应链管理,提升物流效率,同时也要...
别再东拼西凑找资料了!我们为您精心整理了从2016年12月至2023年6月的所有四级真题,一网打尽,不留死角。这不仅仅是一本真题集,更是您通往四级考试成功的密钥! 在这本真题集中,您将体验到历年四级考试的全貌,...
本书摒弃东拼西凑的编书模式,最大限度地保持原创风格。以独有的知识体系,严密的内在逻辑,鲜活的示范案例,深入的讲解剖析,将Java面向对象的本质和特征淋漓尽致地揭示给读者。本书大量采用表格、图示、UML分析等...
VcSmith适合给那些成天与VC代码打交道,不满足现有编程工具提供的开发效率,或不满足现有工具的易用性、直观性,或者有几款好用工具但无法整合起来用,东拼西凑用得不舒服,改用VcSmith或许是个明智选择。...
部分教辅图书质量参差不齐,甚至存在粗制滥造的现象,缺乏创新和原创性,多为东拼西凑的内容,质量把关不严,导致家长在选择时感到困惑。此外,教辅图书的模仿现象严重,许多图书在书名、封面设计以及内容上互相借鉴...
东拼西凑的架构在应对信息安全威胁时显得脆弱,缺乏整体规划。此外,设备管理分散,配置信息混乱,使得故障处理和维护工作被动,消耗大量人力资源。 其次,企业应关注IT架构的安全性。安全威胁可能来自内外部,如...
最新版本在分支1.0里,使用了策略设计模式+反射框架Reflections,更好地处理了if else、文件类型扩展的问题 功能一览: 对各种文件可以进行解析,提取出文本内容,针对word、pdf等文件可以提取出目录 目前所支持的...
- 伪原创方法包括段落置换、内容替换、东拼西凑、内容加减、首尾原创等,以保持文章的新鲜感和独特性。 - 图片的添加和ALT属性的正确设置可以提升用户体验和搜索引擎识别度。 4. 页面关键字选择规范: - 关键字...
999朵玫瑰花,易语言源代码,初学易语言时东拼西凑编写。
质因子的解法,东拼西凑写下来的,写的不好见谅