團隊項目技術規格說明書v1.0
以下技術規格說明書的撰寫是按照《構建之法》的“技術說明書”的相關內容,主要思路是用功能驅動設計
一.從功能流程中提取所需的對象:
在這個WBS圖的基礎上,對首先要實現的基本功能進行了如下設計分析:
外包軟件開發功能描述:
外包開發的功能流程和細節如上圖所示,從流程的分析中,我們其實可以從中提取出這么幾個對象:
- 外包任務類,描述一個外包任務的類,其中包含了任務目標,任務報酬等等屬性。
- 外包任務產生類,就是需求的提出方,是用來產生外包任務的
- 公司類,就是你所要經營的這個公司,接受外包任務並完成
- 職員類,外包任務的完成需要每一位員工的工作
- Date類,我們需要一個類來記錄時間
- 會計類,我們需要一個類來管理收入支出,並做好相應的記錄
當然這里僅僅簡單的描述提取出的類,具體的屬性和方法的定義后面再說。
職員雇佣和解雇功能描述:
職員雇佣和解雇的簡單的功能流程如上所示,我們可以從中提取出的模型有:
- 人才市場類,即管理可雇佣人員的類
- 公司的人才管理類,我們可能需要讓一個公司設置一個人事部來管理所有的職員
UI模塊:
這里UI的設計需要和cocos creator的特性結合起來,cocos creator本身在屬性選擇器中提供了很多屬性的確定,而且也提供了很多api來動態的確定屬性,這里UI模塊的分析我決定采用一個原型圖一個原型圖來分析。
1. 開始界面原型圖
如圖所示,這是游戲開始界面,這里不再贅述
2. 游戲界面
左上角是當前日期,右上角是當前資金,中間是場景,下面是菜單欄,分別為開發
,人事
,系統設置
,注意到有個待解鎖
功能是用戶一開始僅能實現接外包和人員的雇佣和解雇,更多的功能是當用戶的資金和人員達到某個目標時再解鎖,關於下一階段的游戲核心功能目前還在討論中,所以這里先這樣決定。
最下面是狀態欄,用於顯示開發進度等信息。
3. 接受任務界面
在這里你可以看到所有任務的描述
4. 雇佣界面
你可以看到每個職員的信息,並決定是否雇佣,解雇與此類似
5. 設置界面
以上只是簡單的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_)
一個項目目前自己有這么幾種狀態:
- 已產生但未被接受 對應0
- 被接受且尚未完成 對應1
- 被接受已經被完成 對應2
- 被接受卻失敗 對應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)
調用 personControl
的 fire
,這里可以增加相應的提示信息,
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
- 如果結果小於0,那么結合可能的UI提示信息,並return false
- 如果結果大於等於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合法
判斷是不是人員已滿:
- 如果當前已滿,那么可以提示一些信息,並返回false
- 如果沒滿,那么增加這個員工並返回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_
是否已經完成:
- 如果當前項目已經完成了,那么先調用自己的
stop
方法,並直接調用projectGenerator
的finishProject
方法(因為projectGenerator
的全局性,這里不需要通過Company來傳遞了); - 如果當前項目並未完成,那么判斷:
- 如果當前項目已經逾期,那么我們先調用自己的
stop
方法,並調用projectGenerator
的failProject
方法(我們的公司是個誠實的公司...原來是想着讓projectGenerator
來判斷,但是那樣projectGenerator
需要一直檢查,不如在這里讓公司自己判斷項目是不是逾期,逾期自動觸發相應邏輯) - 如果還沒有逾期,那么什么都不做
- 如果當前項目已經逾期,那么我們先調用自己的
6. showPersons()
返回所有person的信息,這里可以自己選擇合適的形式
6. update()
每隔一段時間(待確定多長),判斷如下邏輯;
- 如果當前狀態
flag
為false,表示不工作,什么也不做(或許這里可以用於加上動畫的控制) - 如果當前狀態
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
方法,
- 如果返回true,那么就在自己的列表中去掉這個person
- false可能有信息的提示,具體再定
3. addPerson(Person person)
在用戶點擊解雇
按鈕后觸發這個函數
調用Company的fire
方法,
- 如果返回true。那么就把這個person加入到自己的列表中
目前api文檔還在更新和補充中...