一个游戏的开发过程


记录一个小游戏的开发过程。

构思

玩家使用第三方帐号系统登录,可查看他的好友,并选择一名好友,揍之。揍完同步信息到第三方帐号系统的动态中。揍人可以选择多种方式,可使用武器、武功。揍人后,可随机获得物品奖励。玩家拥有自己的虚拟角色,角色可穿戴防具以减少被揍导致的伤害。玩家可学习武功,有主动释放的武功,有被动释放的武功。当玩家被揍的时候只能使用被动的武功,只有防具会生效。各种物品有使用次数限制。次数用尽,物品消失。

设计

使用MVC模型,M下存在数据访问层。采用AOP方式开发。

开发步骤

  1. 列出所有页面地址
  2. 确定页面可传递参数列表
  3. 确定页面使用数据
  4. 建立模型,提供获取所需数据方法
  5. 编写控制器,确定需要的参数及调用的模型方法
  6. 完成数据访问层
  7. 完善控制器
  8. 完成视图

步骤一

  • 首页 / 登录用户好友列表
  • 用户帐号绑定 /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);
	}
}

步骤六

完善控制器,调试模型层功能,确保正常可用。将数据渲染到模板,粗略显示。

步骤七

完成模板。

 

待完善


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注