杀人游戏系列 之一

本文以一个游戏为例,向大家演示了了linq to sql技术,wcf技术,wpf技术在程序开发中的应用。本游戏程序是5个人的团队,花了5天的时间完成的。其中,在此之前,我们对wcf和wpf从来都没有接触过。也和大家一样现学现做。程序做的很是仓促,自己后来看着都很烂。不足之处,还请大家指出并谅解。
本文不光向大家展示这些技术,同时还把整个项目过程,完整的展现给大家。在此,特别感谢Peter, Boler, Sean, Cloudy. 谢谢你们允许我把它拿到网上来,形成本文.本文将按实际项目中的时间,给大家展开。最后,一起提供所有code。

1,业务分析
首先team在一起讨论了杀人游戏。其中,好多人并不曾玩过。为了让大家有个明确的认识,我们还特意花了20分钟的时间,玩了一场。通过游戏,大家对游戏的规则有了一个初步的认识。对其中的角色的职责,比如平民,杀手,警察等,也有了初步的认识。Sean从网上当下来一段游戏规则,如下

玩家角色分为平民方和杀手方,好人方通过指认功能将所有的杀手指认出来,并通过投票投死杀手,平民则胜利,游戏结束。反之,杀手通过“杀人”功能和指认功能将全部平民杀死或者投票投死则杀手方胜利,游戏结束。具体流程: 

当注册用户进入游戏并点击按钮后,即表示其可以开始杀人游戏,待就绪用户数达到规定范围内时,游戏创建者点击,游戏开始,系统自动为游戏参与者随机分配角色,对于杀手角色,会自动在其窗口中提示其身份; 
游戏是从白天开始的,所有玩家可以在白天的时候发言和投票,当其中一个玩家的票数超过当前存活玩家总数的一半时,该玩家死亡,没有遗言;当没有玩家的票数过半,则当天不死人,系统设置的时间到后进入夜晚; 
进入夜晚,系统将在玩家列表中显示自己的杀手标志,白天标志消失,如不是杀手角色则不显示。杀手集团只能在夜晚系统规定的时间内使用“杀人”功能,并且必须共同杀死同一个人,该“杀人”功能才有效。当杀手集团完成杀人或者夜晚时间过去后,夜晚立即结束,被杀玩家死亡,被杀者可以留遗言。被杀者以及被投票投死的玩家将在玩家列表出显示各自角色的标志,该标志所有人可见。死者在亡灵区可自由发言,存活玩家看不见亡灵区对话; 
此时进入第二天白天,所有玩家可以发言并且投票,规则同上。以此类推,直到游戏结束

最终,为了简化游戏,我们制定了如下的游戏规则。 原文转贴

1). There are 2 roles, civilian and man.

2) All the civilians and bad men can vote to anyone, Host server determines the most- ballot person to die during daytime.

3) All the bad men can vote to anyone of the commonalties to be killed, also they get the result by voting, and the most- ballot person will be killed during night.

4) The scenario 2) and scenario 3) recurrent once one scenario is finished.

5).After any one of the 2 scenarios finished each time, Host server will judge if all the rest persons are civilians or bad men, if this comes to true, the side of the rest persons will this round, the game finished.

6).While voting in scenario 2) and scenario 3), if once there are more than 1 person get the most-ballot, the voting is invalid, it will let all the players vote again in this scenario till the only one most-ballot person is selected (killed), then go to another scenario.

2,建立领域模型
这些游戏的规则,是我们在实际玩游戏时制定出来的。此时还并没有牵扯到程序这个层面上。那通过游戏规则的制定,我们对这个模型也愈加清楚。综合上面游戏规则中出现的对象,来建立模型用图来表示,

3, 程序架构设计
随后,我们又讨论了程序的架构,决定使用什么样的技术。决定使用数据库,并使用linq to sql做为数据访问层。当然,说实话,这有点多余,但是可以拿分的点。先不管那么多了。又决定使用wpf做界面层,wcf来做通信层。既然是网络版的,依然还要把服务端和客户端各自细分一下。整个程序的架构如下



4,分工
最后,大家决定分工合作。Tom负责linq to sql 层面的,Peter主攻wcf方向,cloudy和sean主攻 wpf方向,boler主要是业务逻辑。这样,一天的工作就结束了,大家各自领着自己的任务去忙活了。
5, 结语
我们最先接触到是业务逻辑。并不是ui,更不是数据库。那么先有数据库呢还是先有对象?linq to sql 能做到先有对象吗?Tom能带给你不同的感受吗?请留意第二篇。

下一篇
杀人游戏系列 之三 提供游戏代码下载
杀人游戏系列 之二
杀人游戏系列 之一


本blog相关linq to sql文章
C# 3.0 入门系列(一)
C# 3.0入门系列(二)
C# 3.0入门系列(三)
C# 3.0入门系列(四)-之Select操作
C#3.0入门系列(五)-之Where操作
C#3.0入门系列(六)-之OrderBy操作
C#3.0入门系列(七)--之OR工具介绍
C#3.0入门系列(八)-之GroupBy操作
C#3.0入门系列(九)-之GroupBy操作
C#3.0入门系列(十)-之Join操作
C#3.0入门系列(十一)-之In, Like操作
C#3.0入门系列(十二)-Lambda表达式中Lifting
C# 3.0与Linq To Sql的学习方法--浅谈

Linq To Sql进阶系列(一)-从映射讲起
Linq To Sql进阶系列(二)M:M关系
Linq To Sql进阶系列(三)CUD和Log
Linq To Sql进阶系列(四)User Define Function篇
Linq To Sql进阶系列(五)Store Procedure篇
Linq To Sql进阶系列(六)用object的动态查询与保存log篇
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
posted @ 2007-10-12 15:32 Tom Song 阅读(...) 评论(...) 编辑 收藏