游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4347|回复: 10

三国游戏设计过程(一)

[复制链接]

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
发表于 2005-11-24 12:25:00 | 显示全部楼层 |阅读模式
最近看到游戏之家写的三国,感觉还不错,但是就是程序的代码实在不怎么好。所以打算在公司还没有开始新项目之前,有点时间也写一个三国游戏,游戏的目的主要是完成一个良好结构代码结构。所以,是先写文章,后写程序,进度上会有点慢,估计得6个月时间。现在先发前两天写的内容,如果大家觉得好,有必要继续下去,我会继续写。如果你希望在游戏里面增加什么内容,也可以说,只要是合理的要求,我都可以加上去。

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-11-24 12:25:00 | 显示全部楼层

Re:三国游戏设计过程(一)

三国设计过程:

        本文的目的是通过分析一款三国游戏的核心部分,让大家逐步了解一款游戏是如何从设计到编码的过程。

        首先在进行程序设计的时候,需要先对游戏(软件)的需求有所了解,游戏软件可以看做软件的一个分之,它的需求并不是直接来自于客户(玩家),而是来自策划(间接反映客户需求)。所以一般可以把策划的策划案看成软件的需求。当然,如果策划案比较完善,则对开发非常有利,但是对于我们做小游戏的来说,很有可能是一个人从策划,编码,美工,到发行都自己完成,这样三者之间的交流都可以在大脑里瞬间完成^_^。但是如果是一个团队的开发,三者之间是由不同的人完成的,这时候,面对面的交流就可能会很浪费时间,这时候需要把一些需求以文字的形式记录下来,供不同的开发人员在需要的时候翻阅,较少面对面的交流次数。
        好了,说了这些废话,先开始看一下我们游戏的策划案了。这里为了降低开发难度,决定采用类似三国4~5的游戏模型,并加以简化,到时候根据项目的发展,再根据新的需求增加内容。

简单的策划案:
        三国游戏采用传统的回合制,分为内政和战争,内政部分以个月为单位由玩家进行活动,战争以日为回合单位,玩家进行战斗活动。
        内政部分可以分为下列项:
1.        内政
a)        农业
b)        商业
c)        技术
2.        军事
a)        征兵
b)        移动部队
c)        训练
d)        出征
3.        人事
a)        探索
b)        笼络
c)        调动
4.        商业
a)        购买粮食
b)        卖出粮食
5.        外交(暂时不做处理)
a)        同盟
b)        接触盟约

战争部分则采用类似三国5一样的战棋设计方式,玩家在城市的外围围攻城市,只要占领对方的主城即可算攻下城市。
部队拥有的操作:
1.        移动
2.        攻击
a)        一般攻击
b)        突袭
c)        弓箭
3.        计谋
a)        火计
b)        水计
c)        落石(城市防御部队特有)
d)        辱骂(降低士气)
4.        待机
5.        撤退(主帅撤退战斗结束)

兵种设定:
1.        步兵
2.        骑兵
3.        弓箭手

游戏的武将的属性:
1.        名字
2.        武力
3.        智力
4.        统率
5.        忠诚度

城市的属性:
1.        金钱
2.        粮食
3.        人口
4.        士兵
5.        将领

部队属性:
1.        士兵
2.        士气
3.        将领


目前的策划就这么简单,不清楚的地方就参考三国5设计。
       
        有策划案后,就可以进入程序的设计阶段。本文只是对游戏的核心部分进行分析和编码,不会太多涉及界面的设计,所以在程序语言,我打算使用C#进行开发,一方面是工作就是用C#开发,用起来比较顺手,一方面c#支持中文变量名,所以再今后阅读代码的时候会容易很多
        选择好开发环境,下一步就开始对需求进行分析,得到一个设计文档,按照软件工程的做法,设计文档分为概要设计和详细设计,我们这里就不作太多的细分,只是做一份设计文档。

        这个游戏采用面向对象的语言与设计,所以,在一开始的设计就考虑到面向对象的分析。首先是我们需要先确定游戏里会分成那些对象,按照三国志游戏的一般规律,通常是有2个大的不同的部分组成:一个是内政部分,一个是战争部分。不同的游戏在这两个组成部分的侧重点会有所不同,不过这两个部分的功能玩家都是一个很清楚直观的感觉出来,所以,现在设计的这个游戏也先暂时把游戏分为2个大的系统(这里还不能称为对象):内政和战争。

        内政系统对象的设计:
        在设计内政的时候,我们首先要明确我们需要的怎样的一个内政结构,就像上面策划案给出的简单策划,内政的部分主要集中在城市的建设,它的操作主要都是基于城市,每个城市都的操作都是相同的,但是每个城市的属性又都是不一样的。所以,我们可以这样认为,每一个城市都是独立的,可以被划分的,因此,我们确定城市为一个基本对象。
        确定了城市对象,那么在城市的上面,就是我们常说的国家,一个国家是由一个或者多个城市组成的,每个国家所做的事情都是一样的,所不同的就是每个国家都是由不同的城市组成,所以,我们也可以把城市抗衡看成一个对象,这个我们的第二个比较大的对象国家就出来了。
        游戏里我们能看到的2个大的东西已经划分为2个大的模块了,这两个是对象是从属关系(城市属于国家),我们的第三个对象可以看成是独立与这两个对象,但是又与他们紧密相连的对象??人物(将领)对象。三国里面的人物个有不同,但是每个人物拥有的属性都是一样的,所不同的只是这些人物属性的数值不一样,数值高的人物看起来会很强。
        内政里面三个最基本的对象就分析ok了,剩下的是设计这些对象里面的属性和操作了。不用怀疑为什么对象这么少,这里只是刚开始进行的基本划分,只是把内政系统看成是由这三个大的对象组成,这些对象下面可能还会存在很多子对象,这些子对象会在今后的制作过程中逐步填充到这三个对象里面。


最基本的对象代码
           public class C城市
        {
                public C城市()
                {
                }
        }

        public class C国家
        {
                public C国家()
                {
                }

                ArrayList 国家列表 = new ArrayList();
        }

        public class C将领
        {
                public C将领()
                {
                }
        }

        因为将领对象比较简单,所以我们先那它开刀,看看里面涉及那些属性和方法。
        回到上面的策划案,它对将领的描述很简单,只是规定了5个基本属性,没有什么特别的操作,所以,通过设计,目前将领类只包含5个属性,并且没有操作代码。
        public class C将领
        {
                public string 名字 = null;
                public int 武力 = 0;
                public int 智力 = 0;
                public int 统率 = 0;
                public int 忠诚度 = 0;

                public C将领()
                {
                }
        }

        将领的比较简单,下一步是设计城市对象。城市就比较复杂,按照上面的策划案,我们可以知道,在内政系统里,主要由内政、军事、人事三个部分组成。所以,我们现在对内政部分进行一下划分,可以分为3个子模块:内政,军事,人事。

                public class C城市
        {
                public C内政 内政 = new C内政();
                public C军事 军事 = new C军事();
                public C人事 人事 = new C人事();
        }

        public class C内政
        {
        }

        public class C军事
        {
        }

        public class C人事
        {
        }

        子模块处理完成后,下一步再对模块进行分析,先看看内政模块。在策划案里,内政基本上都是一些城市建设方面的内容,这些建设包括农业,商业,科技三个方面,所以,我们添加了三个属性和相应的操作。
        public class C内政
        {

                public int 农业 = 0;
                public int 商业 = 0;
                public int 科技 = 0;

                public void 发展农业()
                {
                }

                public void 发展商业()
                {
                }

                public void 发展科技()
                {
                }
        }

        目前的内政对象里的操作暂时都是空的,我们还没有写入代码,这里只是先占一个位置,等内政模块设计好以后再把逻辑添加上去。

        下面是分析军事对象。在策划案里,对军事部分的策划案很简单,就只是征兵,没有确定征兵后,士兵是属于城市还是属于将领的。以往的三国游戏对于兵力的建设有2种方法,一种是先给城市征兵,城市里的兵成为预备兵。然后再通过分配兵力把城市的预备兵分给各个将领。将领再分配好士兵后才能出去战争,当然也可以直接给各个部队直接征兵。另外一种模式,是所以的士兵都是归城市管理,到发生或者需要战斗的时候,再分配给出征的将领。这两种设计都是合理的。不过我比较认同第一种方式,先征召预备兵,然后再把士兵分配给将领。这样才能体现三国时期不同部队的不同战斗力。征兵和部队的方式确定以后,策划案的内容暂时懒得去描述,先进行编码^_^!
        考虑到城市的军事部分只对城市里的预备兵进行操作,所以他的属性比较简单。操作也很少,详细的内容看代码
       
        public class C军事
        {
                public int 士兵;
                public int 士气;

                public void 征兵()
                {
                }

                public void 训练()
                {
                }

        因为确定了每个将领都能带领自己的士兵,所以原来的将领对象还需要增加一些属性。这些对象和原来的属性有些不一致,原来的是将领自身的属性,现在的是将领手下的部队属性,因此我打算把部队独立出来,作为一个对象来使用,这里就称为部队对象。并且修改了将领对象的部分代码。

        public class C将领
        {
                //        新增加的部队属性
                public C部队 部队 = new C部队();
        }
        public class C部队
        {
                public int 士兵;
                public int 士气;
        }

        内政系统最后一个对象是人事。人事的属性也比较简单,我们现在只是在人事对象里存放当前城市里存在的将领,并且还存在一个搜索的操作。
        public class C人事
        {
                public ArrayList 将领列表 = new ArrayList();

                public void 探索()
                {
                }
        }

        在填充好一些基本属性,我们再回头看看,是不是少了一些东西?
        城市好像缺少了:金钱,粮食,人口属性。那么我们再创建一个城市基本属性的对象。
        public class C城市基本属性
        {
                public C城市基本属性()
                {
                }

                public int 金钱 = 0;
                public int 粮食 = 0;
                public int 人口 = 0;
        }

        好了,基本对象的属性都有了,下面是写游戏的逻辑,把对象的操作填进去。让我们先来看看内政的一些操作了。首先是内政的发展部分,这里有三个操作,分别是发展农业,商业和科技。由于策划案对如何发展,以及发展所涉及的属性和计算公式没有提到,我们就在这里定义一下。
1.        内政的开发肯定是要花钱的,目前的规定是每次开发花费50金
2.        内政开发的时候肯定要有一个将领参加,并且这个将领的能力决定内政属性的涨幅
3.        内政属性的增加的计算公式
a)        农业:农业 = 农业 + 开发将领的武力 / 10
b)        商业:商业 = 商业 + 开发将领的智力 / 10
c)        科技:科技 = 科技 + 开发将领的统率 / 10
4.        每个内政属性都有一个最大值,并且这个最大值会根据不同的城市有不同的值

游戏关于内政属性的开发目前就增加这些规定,下面就要根据这些东西来进行编码。我们现在开这些说明,发现需要在内政对象里给每个一个最大值的属性,同时内政对象还需要和读取和设置另外两个对象(城市基本属性,将领)的属性。在对象里增加一个属性还是比较简单的,但是对象之间的交互就比较麻烦一些了,这里牵扯到我们该在函数里传入那些属性或者对象。因为现在这写操作比较简单,只涉及到2个对象,所以,我们就让这两个对象分别通过函数的参数传进来,修改接口后的新函数如下:
                public bool 发展农业(C城市基本属性 基本属性, C将领 将领)
                {
                        if (基本属性.金钱 <= 50)
                                return false;
                        基本属性.金钱 -= 50;
                        农业 = 农业 + 将领.武力 / 10;
                        if (农业 > 农业最大值)
                                农业 = 农业最大值;
                        return true;
                }
        剩下的发展商业和科技的修改方法也是一样的。

        内政的设置目前就扩充到这里,下面要开始设计军事。在编码钱,我们先扩充一下策划案。
        征兵方案的扩充规则:
1.        征兵需要花钱,每次花费100金
2.        征兵需要将领参与,而且将领的属性决定了征兵的数量
3.        征兵的计算公式:征兵数量 = 500 + 将领的统率
4.        每次征兵城市的人口要减少,公式:数量 = 征兵数量 × 3

                public bool 征兵(C城市基本属性 基本属性, C将领 将领)
                {
                        if (基本属性.金钱 <= 100)
                                return false;
                        基本属性.金钱 -= 100;
                        int 征兵数 = 500 + 将领.统率;
                        士兵 += 征兵数;
                        基本属性.人口 -= 征兵数 * 3;
                        return true;
                }

        因为目前人事的探索涉及到的东西会比较多,所以暂时不进行设计。

界面设计:
        核心的东西设计到这里,感觉这样加东西比较类,特别是对象的操作接口很难以确定,有些东西需要和游戏界面交互后才能知道需要什么样函数。所以现在我们要开始进入游戏界面的设计。
        现在依然是在设计内政系统,所以,现在是先扩充一下内政方面的界面设计策划文档。
        游戏主界面的描述::
1.        游戏的屏幕大小为800×600
2.        游戏主界面是一张很大的全国地图,至少要是屏幕的2倍以上,游戏主界面要支持地图的滚动
3.        地图上要有城市和关卡的图片,并且在点击图片后进入城市界面
4.        在进入城市界面后,主界面无法再进入其它的城市界面

城市界面描述:
1.        界面的大小不能操作640×480
2.        界面需要显示以下内容:
a)        城市的名字
b)        城市的图片
c)        城市的基本信息
i.        金钱
ii.        粮食
iii.        人口
d)        城市的内政信息
i.        农业/农业最大值
ii.        商业/商业最大值
iii.        科技/科技最大值
e)        城市里的军事信息
i.        城市将领数
ii.        城市当前士兵数量(所有将领士士兵综合加上备用兵数量)
iii.        城市备用兵数量
f)        其它信息:
i.        太守名字
ii.        太守头像
3.        界面有4个按键,进行相应的操作
a)        内政:点击后进入内政界面
b)        军事:点击后进入军事界面
c)        人事:点击后进入人事界面

关于主界面的设计暂时先不考虑,我们先来实现城市界面设计。首先在C#里面,每个窗体是一个form,是一个完全面向对象的类,所以我们新建一个城市界面的窗体,也就相当于创建了一个界面类,在这里,这个界面类应该是于我们设计的城市对象一一对应,即每一个界面的form会对应一个核心态的城市对象。最简单的对应方法就是在这个form类里面增加一个“C城市”类的属性,以后关于这个form的操作,以及这个form要显示的城市属性都是读取这个“C城市”类的属性。
我们根据上面新增加关于城市界面的描述,新建了一个城市form,截图如下:

        先抛开button事件,先看看,在界面里显示的属性比原来设计的城市对象要多一些属性:城市名字,城市图片,太守名字,太守图片,武将数量,城市士兵数量。既然这些属性在原来的城市对象里没有,自然要先回头,去修改一下城市对象增加这些属性。
        对于城市的图片,和太守头像图片,我们是不直接存储在对象里,在里面只是存储图片文件名和他所在的目录。同时,太守头像图片位置应该是保存在太守这个将领的对象里。所以,在城市对象里要增加的新属性有三个城市名字,城市图片的位置,以及太守。
        同时,界面还需要取得城市当前士兵的数量,这些数量是要通过计算求出当前在城市将领的士兵数量,并累加城市备用兵的数量,所以,我们还需要增加一个方法来取得士兵数量,因此建立了一个C#的属性“城市士兵数量”。
        将领的数量也是一样,可以增加一个C#的属性提供一个对外接口。

        public class C城市
        {
                //        这次新增加的部分
                public string 名字;
                public string 图片位置;
                public C将领 太守;

                public int 城市士兵数量
                {
                        //        这里用C#的属性功能,这样在外面使用城市类的时候
                        //        使用这个属性就像使用一个变量一样简单。
                        get
                        {
                                int num = 军事.士兵;
                                foreach(C将领 将领 in this.人事.将领列表)
                                        num += 将领.部队.士兵;
                                return num;
                        }
                }
                public int 将领数量
                {
                        get
                        {
                                return this.人事.将领列表.Count;
                        }
                }
        }

        当然我们也可以再增加相应的C#属性,把城市的金钱,内政里的属性进行封装,不过这个步骤等大家有空再去增加,目前为了简单的描述这个系统,这些都没有增加,真正在做游戏的时候都要进行封装。

        添加好需要的属性后,再回到城市界面的设计,下面的需要增加一些用于显示的代码,我们在城市form增加一个bind()的函数,用来把城市对象里需要显示的属性赋值给相应的显示控件。

                C城市 城市 = null;                //        城市属性

                public void bind()
                {
                        this.lab_城市名字.Text        = 城市.名字;
                        this.img_城市.Image                = Image.FromFile(城市.图片位置);
                        this.lab_太守名字.Text        = 城市.太守.名字;
                        this.img_太守.Image                = Image.FromFile(城市.太守.头像);

                        this.lab_金钱.Text                = "金钱: " + 城市.基本属性.金钱.ToString();
                        this.lab_粮食.Text                = "粮食: " + 城市.基本属性.粮食.ToString();

                        this.lab_城市士兵数量.Text        = 城市.城市士兵数量;
                        //        因为要赋值的属性很多,这里就不敲那么多代码了
                }




130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-11-24 12:31:00 | 显示全部楼层

Re:三国游戏设计过程(一)

我的三国还没写完,现在只是到了V1.68,期待楼主的三国早日诞生。
中国写三国的人太少了,主要是难度大,所以这样的贴一定要支持!

你的策划对我的开发也有启发,我原来内政是不扣钱的,现在要加上,
还有灾害后要扣兵等问题都将写在下一个版本。
还有楼主准备用多窗口操作设计,我建议你少用点FORM,
窗口多了,很容易出问题,我之前最多用了5个FORM,
现在是2个,问题少多了,城市一多增加减少收入的时候钱粮错乱,
真的是很麻烦,我改了好多次才找到问题,V1.68没钱粮错乱问题,

其实写三国里面的国家就象一个开发小组,每个城市是一个开发人
员,协调性很重要。

假如写即时战略游戏可能一下就动手写了,但这个三国策略游戏开始的下笔就很有难度,否则KOEI就不会天下第一了......

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-11-25 00:10:00 | 显示全部楼层

Re:三国游戏设计过程(一)

光荣的程序从来也不以为强,多form不是问题的根源。楼主有清晰的结构,可以避免很多不必要出现的bug。一个策略性游戏的结构简单,系统明了,实现简单,很适合作为一整套教程。楼主半年以后写完了这点东西,出了很多文字,就可以出一部dot net游戏开发的书了,功德圆满啊!虽然代码是C#,但对看过vb.net的人来说,阅读代码不存在障碍,实在是一件好事。

0

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2005-11-25 00:16:00 | 显示全部楼层

Re:三国游戏设计过程(一)

不知道我什么时候可以学习一下??

8

主题

120

帖子

120

积分

注册会员

Rank: 2

积分
120
QQ
发表于 2005-11-25 00:58:00 | 显示全部楼层

Re:三国游戏设计过程(一)

我都不会DX什么的
我都想动动手了。。哈哈

14

主题

166

帖子

171

积分

注册会员

Rank: 2

积分
171
 楼主| 发表于 2005-11-25 12:17:00 | 显示全部楼层

Re:三国游戏设计过程(一)

多窗口设计不会造成代码的复杂,只要结构合理,完全可以降低编码的难度.
游戏之家你所认为困难,主要是你的设计问题.

目前项目还在进展中,如果大家内容有什么建议可以提,不过本人没有美工,所以界面方面就只能很粗糙的应付一下了.

87

主题

790

帖子

806

积分

高级会员

Rank: 4

积分
806
QQ
发表于 2005-11-25 18:44:00 | 显示全部楼层

Re:三国游戏设计过程(一)

其实关键还是在元素之间的关系上,单个元素的设计并不困难.在元素之间的关系往往会出现很多难题,这时就需要毅力了.

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-11-25 20:02:00 | 显示全部楼层

Re:三国游戏设计过程(一)

是呀! 城市一多数据很容易打架的,哈哈!

54

主题

2917

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2005-11-27 13:11:00 | 显示全部楼层

Re:三国游戏设计过程(一)

等我完善了战斗系统(如:埋伏,陷阱,砸滚木石头,火烧,火箭等等),将来我也要研究三国游戏系统。然后加上我的战斗系统一定会表现出真正三国战争的精髓。哈哈!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-15 20:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表