记录一个小游戏的开发过程。
构思
玩家使用第三方帐号系统登录,可查看他的好友,并选择一名好友,揍之。揍完同步信息到第三方帐号系统的动态中。揍人可以选择多种方式,可使用武器、武功。揍人后,可随机获得物品奖励。玩家拥有自己的虚拟角色,角色可穿戴防具以减少被揍导致的伤害。玩家可学习武功,有主动释放的武功,有被动释放的武功。当玩家被揍的时候只能使用被动的武功,只有防具会生效。各种物品有使用次数限制。次数用尽,物品消失。
设计
使用MVC模型,M下存在数据访问层。采用AOP方式开发。
开发步骤
- 列出所有页面地址
- 确定页面可传递参数列表
- 确定页面使用数据
- 建立模型,提供获取所需数据方法
- 编写控制器,确定需要的参数及调用的模型方法
- 完成数据访问层
- 完善控制器
- 完成视图
步骤一
- 首页 / 登录用户好友列表
- 用户帐号绑定 /user/bind/sina|qq 登录用户帐号绑定信息
- 用户角色 /player/uid 登录用户信息,角色属性信息,受伤信息,持有武器,防具,药品,秘籍.所学武功
- 用户仓库 /player/storage 登录用户持有武器,防具,药品,秘籍信息.相关物品持久度信息
- 揍人 /k/uid /k/u/username 揍与被揍用户username对应uid关系信息(如果有). 被揍用户角色属性信息,持有武器,防具,药品,秘籍.所学武功
- 揍人结果 /k/result 揍与被揍用户username对应uid关系信息(如果有). 被揍用户角色属性信息,持有武器,防具,药品,秘籍.所学武功
步骤二
- 用户信息模型 uid[thirdname[username,nick,sex,avatar,time]]
根据用户uid获取用户信息,根据用户username获取用户信息,新建用户信息,修改用户信息,删除用户
- #用户信息反查模型 username[uid] ###数据访问层###
根据username查询uid
- 用户角色信息模型 uid[strength,intrastrength]
根据用户uid查询用户角色信息,更新用户体力、内力值、健康度
- 仓库模型 uid[weapon[id],armor[id],drug[id],book[id]]
增减武器、防具、药品、秘籍,查询武器、防具、药品、秘籍数量
- 武器模型 uid[id[name,desc,lethality,coststrength,costmoney,persistence,particle,effect]]
读取武器属性信息,读取武器揍人后效果
- 防具模型 uid[id[name,desc,defense,persistence,particle]]
读取防具信息
- 秘籍模型 uid[id[name,desc,requirement[]]]
读取秘籍信息,学习秘籍
- 武功模型uid[id[name,desc,type,costintrastrength,proficiency,ability[before[continue[result,text]]inprogress[strength,]after[]]]]
使用武功,遗忘武功
- 药品模型 uid[id[name,desc,effect,persistence]]
使用药品
- 揍人模型 uid[kuid,time,result[acquire[id,type,quantity]]]
揍人
步骤三
写出所有模型,并思考每个模型应该具有的方法。此方法是业务方法,而不是数据操作方法。
<?php /** * 用户信息模型 * @author wclssdn<ssdn@vip.qq.com> * */ class UserModel extends Model { /** * 注册用户 * @param string $uniqueid 第三方帐号唯一ID * @param string $nickname 第三方提供用户昵称 * @param number $sex 第三方提供用户性别 * @param string $avatar 第三方提供用户头像 * @return boolean array */ public function register($uniqueid, $nickname, $sex, $avatar) { } /** * 绑定第三方用户到本站用户 * @param number $uid * @param string $uniqueid * @return boolean */ public function bind($uid, $uniqueid) { } /** * 根据用户ID获取用户信息 * @param number $uid * @return array boolean */ public function getUserByUid($uid) { } /** * 根据第三方唯一ID获取用户信息 * @param string $uniqueid * @return array boolean */ public function getUserByUniqid($uniqueid) { } }
步骤四
写出控制器的逻辑。此步骤可发现上个步骤中遗漏的模型方法。
<?php class AdminController extends Controller { public function userlistAction(){ $page = $this->request->getParam('page'); $page = max(1, $page); $every = 20; $userModel = Ioc::loadObject('UserModel'); $userList = $userModel->getUserList($page, $every); } public function banuserAction(){ $uid = $this->request->getParam('uid'); $userModel = Ioc::loadObject('UserModel'); $userModel->ban($uid); } public function klistAction(){ $page = $this->request->getParam('page'); $page = max(1, $page); $every = 20; $kModel = Ioc::loadObject('KModel'); $kList = $kModel->getKList($page, $every); } public function synclistAction(){ $page = $this->request->getParam('page'); $page = max(1, $page); $every = 20; $syncModel = Ioc::loadObject('SyncModel'); $syncList = $syncModel->getSyncList($page, $every); } public function syncAction(){ $type = $this->request->getParam('type'); //个人战报, 最近战报 $uid = $this->request->getParam('uid'); //发谁的个人战报 $syncModel = Ioc::loadObject('SyncModel'); $kModel = Ioc::loadObject('KModel'); switch ($type){ case 'personal': $klist = $kModel->getListByUid($uid, 1, 10); break; case 'new': $klist = $kModel->getList(1, 10); break; } } }
此步骤只写大概操作,需要接收哪些参数,需要调用哪些模型的哪些方法。具体数据格式只需要在脑中想下即可,感觉可实现即可。
步骤五
完成所有数据访问层的编写。当然,我用的是封装好的数据库操作类,KVDB类。所以,可直接实例化对象为数据访问层对象。
<?php /** * sae KVDB操作类 * @author wclssdn<ssdn@vip.qq.com> * */ class KvdbDao implements NoSqlDao { private $kv; public function __construct() { $this->kv = new SaeKV(); $ret = $this->kv->init(); if ($ret !== true){ throw new Exception('Kvdb init failed'); } } /* * (non-PHPdoc) @see NoSqlDao::add() */ public function add($key, $val, $expire = 0) { return $this->kv->add($key, $val); } /* * (non-PHPdoc) @see NoSqlDao::update() */ public function update($key, $val) { return $this->kv->set($key, $val); } /* * (non-PHPdoc) @see NoSqlDao::replace() */ public function replace($key, $val) { return $this->kv->replace($key, $val); } /* * (non-PHPdoc) @see NoSqlDao::delete() */ public function delete($key) { return $this->kv->delete($key); } /* * (non-PHPdoc) @see NoSqlDao::get() */ public function get($key) { return $this->kv->get($key); } /* * (non-PHPdoc) @see NoSqlDao::mget() */ public function mget(array $keys) { return $this->kv->mget($keys); } }
步骤六
完善控制器,调试模型层功能,确保正常可用。将数据渲染到模板,粗略显示。
步骤七
完成模板。
待完善