记录一个小游戏的开发过程。
构思
玩家使用第三方帐号系统登录,可查看他的好友,并选择一名好友,揍之。揍完同步信息到第三方帐号系统的动态中。揍人可以选择多种方式,可使用武器、武功。揍人后,可随机获得物品奖励。玩家拥有自己的虚拟角色,角色可穿戴防具以减少被揍导致的伤害。玩家可学习武功,有主动释放的武功,有被动释放的武功。当玩家被揍的时候只能使用被动的武功,只有防具会生效。各种物品有使用次数限制。次数用尽,物品消失。
设计
使用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);
}
}
步骤六
完善控制器,调试模型层功能,确保正常可用。将数据渲染到模板,粗略显示。
步骤七
完成模板。
待完善