星际开地图对战,等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,取客户端口,异步选择,检查连接状态,转换图像...
altium DXP protel 快捷键汇总 很全很强大 再也不用东拼西凑了
通达信指标公式源码 东拼西凑找最近最高量画线主图.doc
图形,讲解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特效是找来的改了一点点,拼接技术贼垃圾,只是自己用用,侵删
本书摒弃东拼西凑的编书模式,最大限度地保持原创风格。以独有的知识体系,严密的内在逻辑,鲜活的示范案例,深入的讲解剖析,将Java面向对象的本质和特征淋漓尽致地揭示给读者。本书大量采用表格、图示、UML分析等...
自己写的directdraw程序,内容是东拼西凑的(天下程序一大抄啊),控制副显卡输出文字,如果运行不了可以改下显示模式和文字输出位置,有在弄双显示器的同学可以参考
本书摒弃东拼西凑的编书模式,最大限度地保持原创风格。以独有的知识体系,严密的内在逻辑,鲜活的示范案例,深入的讲解剖析,将Java面向对象的本质和特征淋漓尽致地揭示给读者。本书大量采用表格、图示、UML分析等...
VcSmith适合给那些成天与VC代码打交道,不满足现有编程工具提供的开发效率,或不满足现有工具的易用性、直观性,或者有几款好用工具但无法整合起来用,东拼西凑用得不舒服,改用VcSmith或许是个明智选择。...
东拼西凑,整理出仿MSN日历的记事本的小玩意
最新版本在分支1.0里,使用了策略设计模式+反射框架Reflections,更好地处理了if else、文件类型扩展的问题 功能一览: 对各种文件可以进行解析,提取出文本内容,针对word、pdf等文件可以提取出目录 目前所支持的...
999朵玫瑰花,易语言源代码,初学易语言时东拼西凑编写。
质因子的解法,东拼西凑写下来的,写的不好见谅
最新公司给了好多EXCEL的复习题库,让我们去复习考试,一个一个去看实在有点枯燥,记忆起来比较困难就想在网上找一下有没有通过导入EXCEL题库,自己复习的软件,然后找了半天不是运行不了就是要收费之类的,总是找不...
调研了很多框架和模式,最后自己东拼西凑搞出来了这么一个玩意。 服务端 毫无疑问使用node,使用typescript可以有效的在编码同时查错,强类型语言写服务端毫无压力。 #app.ts 只贴重要代码 var webpack = require('...
前言 为什么要在这里写博客 在此之前在其他平台也有写博客,折腾来折腾腾去还是准备来这里的Issues上写,成为大佬的第一步嘛。哈哈哈:beaming_face_with_smiling_eyes: 用 hexo 发布博文操作流程繁琐,图床啥的很...