-----------回顾分割线-----------
系列之一讲述了游戏规则,系列之二讲述了旧版的前台效果、代码中不好的地方、以及新版的改进核心,此篇开始就是新版代码编写全过程。此系列旨在开发类似“谁是卧底+杀人游戏”的捉鬼游戏在线版,记录从分析游戏开始的开发全过程,通过此项目让自己熟悉面向对象的SOLID原则,提高对设计模式、重构的理解。
索引目录:
0. 索引(持续更新中)
2. 设计业务对象与对象职责划分(1)(图解旧版本)
3. 设计业务对象与对象职责划分(2)(旧版本代码剖析)
4. 设计业务对象与对象职责划分(3)(新版本业务对象设计)
5. 业务对象核心代码编写与单元测试(游戏开始前:玩家入座与退出)
6. 业务对象核心代码编写与单元测试(游戏开始:抽题、分角色、开启鬼讨论模式)
……(未完待续)
-----------回顾结束分割线-----------
先放上svn代码,地址:https://115.29.246.25/svn/Catghost/
账号:guest 密码:guest(支持源代码下载,已设只读权限,待我基本做出初始版本后再放到git)
-----------本篇开始分割线-----------
快乐的码字生活又开始了~ 先上之前(新版本业务对象设计)分析过的流程图:
上一篇已经做了1-4步,本篇处理的5-8都属于游戏开始的初始化——游戏玩家一达到数量立即自动开始,然后自动执行5-8步,第8之后就是等待鬼(Ghost)讨论谁开始首轮发言。
进一步说明就是,游戏自动检测玩家入座人数符合配置文件中的总人数时,自动由PlayerManager类通知Table,由Table再通知Game,让Game执行他自己的Start()方法。在Start()方法中,我们需要做上图的5-8步,即:抽题、分角色、开启鬼讨论模式(抽题与分角色两个步骤是可以互换的,但此处为遵循现实中的做法,便于客观理解而设计)。
一、抽题
(1)单例模式【此处有错,第四节更正】:题目类Subject,被设计为单例模式,因为只需在游戏开始前抽一次题就够了,而不需要像其他管理者(发言管理者SpeakManager、循环管理者LoopManager、投票官VoteManager、死神DeathManager、胜负判官WinManager)那样在后续的游戏进行过程中,会出现多次,所以一个实例就够了。此处同时提到负责分角色——角色管理者RoleManager(没有使用单例模式),因为RoleManager只是在Game中需要被调用一次,其他地方不会再调用也不允许再调用(不可能游戏进行到一半又重新分角色),但是Subject题目类却会始终伴随游戏进行,被各个玩家不断查阅自己的词(发言者要记录不能透露词中的字、胜负判官要判断是否被鬼猜中词),为了全局访问点,所以只能单例模式,全局访问点也是单例模式存在的一个重要的原因。
(2)应该从题库抽题:为了重点放在游戏流程环节,题库和抽题的做法就不强调了,此处先写死在程序里以便测试。
public void GetSubjectFromDictionary() { // Todo: get subject from system with random CivilianWord = "孙悟空"; IdiotWord = "周星驰"; GhostWord = NewGhostWord(CivilianWord, IdiotWord); }