项目技术规格说明书 团队项目技术规格说明书v1.0

以下技术规格说明书的撰写是按照《构建之法》的“技术说明书”的相关内容,主要思路是用功能驱动设计

一.从功能流程中提取所需的对象:

项目技术规格说明书
团队项目技术规格说明书v1.0

在这个WBS图的基础上,对首先要实现的基本功能进行了如下设计分析:

外包软件开发功能描述:

项目技术规格说明书
团队项目技术规格说明书v1.0

外包开发的功能流程和细节如上图所示,从流程的分析中,我们其实可以从中提取出这么几个对象:

  1. 外包任务类,描述一个外包任务的类,其中包含了任务目标,任务报酬等等属性。
  2. 外包任务产生类,就是需求的提出方,是用来产生外包任务的
  3. 公司类,就是你所要经营的这个公司,接受外包任务并完成
  4. 职员类,外包任务的完成需要每一位员工的工作
  5. Date类,我们需要一个类来记录时间
  6. 会计类,我们需要一个类来管理收入支出,并做好相应的记录

当然这里仅仅简单的描述提取出的类,具体的属性和方法的定义后面再说。

职员雇佣和解雇功能描述:

项目技术规格说明书
团队项目技术规格说明书v1.0

职员雇佣和解雇的简单的功能流程如上所示,我们可以从中提取出的模型有:

  1. 人才市场类,即管理可雇佣人员的类
  2. 公司的人才管理类,我们可能需要让一个公司设置一个人事部来管理所有的职员

UI模块:

这里UI的设计需要和cocos creator的特性结合起来,cocos creator本身在属性选择器中提供了很多属性的确定,而且也提供了很多api来动态的确定属性,这里UI模块的分析我决定采用一个原型图一个原型图来分析。

1. 开始界面原型图

项目技术规格说明书
团队项目技术规格说明书v1.0

如图所示,这是游戏开始界面,这里不再赘述

2. 游戏界面

项目技术规格说明书
团队项目技术规格说明书v1.0

左上角是当前日期,右上角是当前资金,中间是场景,下面是菜单栏,分别为开发,人事,系统设置,注意到有个待解锁功能是用户一开始仅能实现接外包和人员的雇佣和解雇,更多的功能是当用户的资金和人员达到某个目标时再解锁,关于下一阶段的游戏核心功能目前还在讨论中,所以这里先这样决定。

最下面是状态栏,用于显示开发进度等信息。

3. 接受任务界面

项目技术规格说明书
团队项目技术规格说明书v1.0

在这里你可以看到所有任务的描述

4. 雇佣界面

项目技术规格说明书
团队项目技术规格说明书v1.0

你可以看到每个职员的信息,并决定是否雇佣,解雇与此类似

5. 设置界面

项目技术规格说明书
团队项目技术规格说明书v1.0

以上只是简单的UI原型设计,实际开发时,这些界面的用户体验才是最重要的。

二.具体功能的设计

经过我们开发组的讨论和整个组的审核,我们目前制定了如下的游戏内部功能api设计:


1. ProjectGenerator

properties:

1. Project projects_[N]

保存了上次产生的 N 个任务的信息,一开始是 null,一旦调用一次 createProject 后更新,所以 ProjectGenerator 不仅可以产生任务还会负责监管任务,就好比自己有一个外包项目需要交给外包公司来做,那么自己需要监视外包公司是否及时完成

functions:

1. void createProject()

根据难度评价逻辑产生可选的任务并保存到projects_数组中

2. void failProject(Project project)

设置这个project对应的项目的state已接受但未完成;

设置这个project对应项目的完成时间;

降低对这个公司的能力的评价;

3. void finishProject(Project project)

根据这个 project 返回这个任务的报酬,并调用公司的profit

同时设置这个 project 对应的标志位为被接受且已完成;

设置这个project对应项目的完成时间

同时会增加这个这个 project 对应公司的评价;


2. Project

properties:

1. 需要达到的三个标准(object require_):

UI的优劣程度(number require_.ui),
功能的优劣程度(number require_.func),
BUG的数量(number require_.bugnum).

2. 目前达到的三个标准(object current_):

目前UI的优劣程度(number current_.ui),
目前功能的优劣程度(number current_.func),
目前BUG的数量(number current_.bugnum).

3. 状态位(eState state_)

一个项目目前自己有这么几种状态:

  1. 已产生但未被接受 对应0
  2. 被接受且尚未完成 对应1
  3. 被接受已经被完成 对应2
  4. 被接受却失败 对应3

相应的枚举变量eState已经定义在了相应的文件中

4. 种类(string category_)

供以后扩展,现在可以先不考虑具体逻辑

5. 种类(string category_)

属于哪一类
(可能有的种类之后会扩展)

6. 报酬(number reward_)

这个项目的酬金

7. deadline(number deadline_)

这个项目最长几天需要完成

8. 所属公司(Company company_)

这个项目被交给哪个公司完成

9. 接受时间(number receiveDay_)

现在规定时间按天为单位,所以这里需要记录下来接受时在第几天

10. 完成时间(number finishDay_)

记录下完成时在第几天,可以提供给评价公司成绩时使用,或者记录时使用

Functions:

1. void augment(string attribute, number increment)

@require:attribute 属于{"ui","func","bugnum"}之一,表示要增加的属性的类型;increment >=0 表示增加的数值;

attribute对应的属性增加相应的数值

2. boolean isFinished()

根据当前的三个属性的值和目标值判断是否已经完成

3. boolean isOverdue()

根据当前时间和项目被接受时间判断是否已经逾期

4. 这里省去各种各样的set方法和get方法

3. Company

properties:

1. Account account_

自己的会计部门,负责资金的管理和记录

2. PersonControl personControl_

自己的人事部门,负责人员的雇佣,解雇,培养,工作

3. Project project_

考虑到如果你在做一个项目,那么就不能做另一个项目,所以这里我把这个属性设置为一个

多个项目以后有时间好好规划后再拓展

functions:

1. receiveProject(Project project)

@require:project!=null && project.repOK()(这个project合法)

在用户选中了一个任务,并点击了确定按钮后,会触发这个方法;

设置project的开始时间,改变其状态为已接受但未完成

设置project_project

调用 personControl_work 方法开始工作;

3. boolean profit(number num, string cause)

调用account_的profit方法

4. boolean expend(number num, string cause)

调用account_的expend方法

5. boolean hire(Person person)

调用 personControl_hire,如果返回 false ,那么雇佣失败,返回 false

如果雇佣成功,那么返回true

6. boolean fire(Person person)

调用 personControlfire,这里可以增加相应的提示信息,

7. showPersons()

调用personControl_showPersons方法返回当前所有职员信息


4. Account

会计类负责账单的记录和资金管理

properties:

1. gold_

表示当前的资金

2. records_

表示资金流动记录(待考虑)

functions:

1. void profit(number num, string cause)

gold_+=num;

同时记录下cause

2. boolean expend(number num,string cause )

计算gold_-num

  1. 如果结果小于0,那么结合可能的UI提示信息,并return false
  2. 如果结果大于等于0,那么记录下相应的cause,并return true
3. boolean isEnough(number num)

判断当前资金gold_是否够num的支出

3. update(dt)

随时更新相应的label为当前的金钱


5. PersonControl

管理职员的类

propertites:

1. 职员数组 persons_[]

当前员工的数组

2. 当前员工数量 currentNum_

当前有多少员工

3. 当前最大员工数量 maxNum_

当前最多可以有多少员工

5. boolean flag_

是否在工作状态,默认值为false,表示不在工作状态

(这个状态主要用于update时的判断)

6. 要做的 Project project_

functions:

1. boolean hire(Person person)

@require:自己的列表中没这个person且这个person合法

判断是不是人员已满:

  1. 如果当前已满,那么可以提示一些信息,并返回false
  2. 如果没满,那么增加这个员工并返回true
2. fire(Person person)

@require: 自己的列表中有这个员工且在这个person合法

从数组中去掉这个员工,返回true

3. void work(Project project)

表示要开始做这个项目

更新自己要做的project_

调用每个员工的work;

设置自己的flag为true;

4. stop()

设置自己的flag为false;

调用每个人的stop;

5. void commit()

遍历所有员工,调用每个人的commit方法;

然后判断当前project_是否已经完成:

  1. 如果当前项目已经完成了,那么先调用自己的stop方法,并直接调用projectGeneratorfinishProject方法(因为projectGenerator的全局性,这里不需要通过Company来传递了);
  2. 如果当前项目并未完成,那么判断:
    1. 如果当前项目已经逾期,那么我们先调用自己的stop方法,并调用projectGeneratorfailProject方法(我们的公司是个诚实的公司...原来是想着让projectGenerator来判断,但是那样projectGenerator需要一直检查,不如在这里让公司自己判断项目是不是逾期,逾期自动触发相应逻辑)
    2. 如果还没有逾期,那么什么都不做
6. showPersons()

返回所有person的信息,这里可以自己选择合适的形式

6. update()

每隔一段时间(待确定多长),判断如下逻辑;

  1. 如果当前状态flag为false,表示不工作,什么也不做(或许这里可以用于加上动画的控制)
  2. 如果当前状态flag为true,那么调用自己的commit方法;

6. Person

properties:

1. 描述一个人能力的6个属性(object ability_):

都是整数:

编程能力 ability_.coding

管理能力 ability_.management

架构能力 ability_.structure

测试能力 ability_.test

艺术能力 ability_.art

创新能力 ability_.creativity

2. 薪资 salary_

一个人每个月需要的工资

3. 状态 state_

这个人目前的状态,可能有:①闲着②工作③放假

状态与这个人物表现出的动作有关

4. 所属公司 company_

引用,这个人所属的公司

5. 正在做的任务 project_

Functions:

1. getCommit()

根据这个人的能力值,获得他在一段时间(这里还有待商榷,需要确定职员对项目每隔多长时间贡献一次)内可以对项目的属性贡献多少(这里的算法涉及到人员的能力->对项目属性的贡献 这个转化算法)

而且要根据project当前已经达到的点数来确定自己的贡献值,对于已经达到目标的属性不需要增加了

2. commit()

先通过this.getCommit() 获得自己可以做的贡献点数

然后通过project.augment()方法增加对应的点数

3. work(Project project)

表示要开始工作了;

设置当前 project_;

设置自己的工作状态为工作状态;

4. stop()

设置自己的状态为闲着


7. Date

存储当前的日期

properties:

1. number time_

以天为单位的日期,初始为0,每隔speedPerday增加1

2. number speedPerday_

每隔多少帧增加一天,在设置游戏速度可能会用到,会设置正常和较快两个档位

3. number count_

距离上次日期更新后过了多少帧

functions:

1. void updateDate()

time_+=1

当遇到每个月第一天就发出员工工资支付事件

2. number getDate()

return time_

(经过测试,update的执行顺序是按照场景中的结点从上到下,从父到子依次执行的,所以我这里把Date组件放在最前面)

3. update()

根据count_speedPerday_来更新时间

4. string getDate()

return 以某种格式的日期,供UI使用


8. PersonGenerator

人才市场吧算是

properties:

1. Person persons_[]

可供选择的人员数组

functions:

1. showPersons()

返回每个person的信息,供UI显示

2. removePerson(Person person)

在用户点击雇佣按钮后,会触发这个函数

调用Company的hire方法,

  1. 如果返回true,那么就在自己的列表中去掉这个person
  2. false可能有信息的提示,具体再定
3. addPerson(Person person)

在用户点击解雇按钮后触发这个函数

调用Company的fire方法,

  1. 如果返回true。那么就把这个person加入到自己的列表中

目前api文档还在更新和补充中...