1、数据库大作业三国战略2数据库设计报告-模拟三国策略游戏数据库院系: 软件学院 班级: 软件0903班 组员: 卢鹏洲(200992042)组员: 马英杰(200992214) 日期 2011/11/1一、业务规则我们数据库设计的构思来自于平时玩的三国题材游戏。根据游戏中武将、城池、势力、军队、人物关系等各种信息,以及建设、战斗、查看情报等各种功能,提出一种可以实现游戏部分功能的数据库设计方案。 在此,我们首先分析游戏的要实现的功能主要包括:1.情报查看:用户(以下统称玩家)可以查看各个势力、军团、城池的情报。2.任命太守:玩家将一名武将设置为一座城池的太守,太守可在城池中执行内政命令。3.城池
2、经营:城池经营包涵两个分支功能,一个是内政,内政由城池的太守执行(执行效果由智力决定),内政提高城市的治安,治安越高兵粮增加越快。另一个是征兵,选取一个武将对一只部队进行征兵,征兵数量由武将武力决定。 4.攻打城池:选择己方的一个城池发动对敌方一个城池的进攻,攻打时以部队为单位,每只部队由一到两名武将带领。5.输送:将部队或武将由一个城池转移到另一个城池。游戏过程中的主要功能为以上几种,我们的数据库就围绕上述功能设计,尽管要形成一个游戏还有很多细小零碎的功能,其余和数据库关系不大的功能在此就不赘述了。二、 业务流程1.情报查看:玩家执行情报查看功能,相关数据操作如下:1.1“实力情报显示”玩家
3、发出的查看命令,系统显示各势力总体情报。1.2“军团情报显示”玩家选择一个势力,显示该势力军团情报。1.3“城池武将情报显示”选择一个军团,显示该军团城池武将情报。图 1 玩家查看情报数据流图2任命太守:玩家指定一位武将,再指定一座己方城池,将该武将设置为该城池太守,玩家相关数据操作如下:1.1“城池列表显示”1.2“选择城池”玩家选择城池,选择信息传给系统2.1“武将列表显示”2.2“选择武将”玩家选择城池、和太守,选择信息传给系统3.1“修改武将所在”3.2“计算城池太守能力”系统根据玩家指令修改城池3.3“太守能力修改”生成新的太守数据。 图 2 太守任命数据流图3.城池经营-内政:玩家
4、选择城池,根据该城太守智力增加城池治安,相关数据操作如下:1.1“城池列表显示”1.2“城池选择”玩家根据系统给出的城池表选择城池,选择信息传给系统2.1“治安计算”系统根据所选城池最大治安值和太守智力计算出新治安值,并修改城池数据 图 3 内政指令数据流图4.城池经营-征兵:玩家选择城池,之后选择武将、部队,让该武将对该部队执行征兵,相关数据操作如下:1.1“城池列表显示”1.2“选择城池”根据系统提供城池表选择城池2.1“武将、部队显示”系统根据所选城池生成武将部队表2.2“选择武将、部队”由玩家选择执行武将和部队3.1“计算征兵数”系统根据玩家选择计算,然后修改相应数据 图4 征兵指令数
5、据流图5.攻打城池:有玩家选择一个敌对城池,选择由己方武将和部队编成的军队,将所选数据交给系统,系统计算输赢,修改城池、武将、部队信息,数据流图如下: 图 5 攻城指令数据流图6.输送:玩家选择一个城池的部队或武将,转移到另一城池,对两城数据以及转移武将、部队数据进行修改,数据流图如下: 图 6 输送指令数据流图三、 概念设计 图 7 整体ER图四、 逻辑设计势力表:军团表:城池表:部队表:兵种表:太守表:武将表:武将关系表:关系表:如图所示,有钥匙标示的是表的主键,如城池的城池名,有的表不含有主键只是作为外部键,如太守表、武将关系表中没有主键五、 规范化设计第一范式势力(势力名,君主,)军团
6、(军团名,所属势力,军团长)城池(城池名,所属军团,所属势力,太守)太守(镇守城,名字,战力值,农业值)武将(武将名,驻守城,势力,武力,智力)武将关系(武将名,关系武将,关系)部队(部队名,兵种,驻扎城池)兵种(兵种名,地战力,山战力,水战力,城战力)第二范式 同以上第一范式第三范式势力(势力名,君主,)军团(军团名,所属势力,军团长)城池(城池名,所属军团,太守)武将(武将名,驻守城,武力,智力)太守(镇守城,名字,战力值,农业值)武将关系(武将名,关系武将,关系)部队(部队名,兵种,驻扎城池)兵种(兵种名,地战力,山战力,水战力,城战力)BC范式 同以上第三范式六、 物理设计建表语句:C
7、REATE TABLE dbo.势力( 势力名 char(20) NOT NULL, 君主 char(20) NULL, CONSTRAINT PK_势力_1 PRIMARY KEY CLUSTERED ( 势力名 ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARYCREATE TABLE dbo.兵种( 兵种名 char(20) NOT NULL, 地战力 int NULL, 水战力 int NULL, 山战力 int NULL, 城战力 int NULL, CONSTRAINT PK_兵种 PRIM
8、ARY KEY CLUSTERED ( 兵种名 ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARYCREATE TABLE dbo.关系( 武将名 char(20) NULL, 关系 char(20) NULL, 关系武将 char(20) NULL) ON PRIMARYCREATE TABLE dbo.太守( 镇守城 char(20) NULL, 名字 char(20) NOT NULL, 战力值 int NULL, 农业值 int NULL) ON PRIMARYCREATE TABLE dbo.
9、武将( 武将名 char(20) NOT NULL, 武力 int NULL, 智力 int NULL, 势力 char(20) NULL, 驻守城 char(20) NULL, CONSTRAINT PK_武将 PRIMARY KEY CLUSTERED ( 武将名 ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARYCREATE TABLE dbo.军团( 军团名 char(20) NOT NULL, 军团长 char(20) NULL, 所属势力 char(20) NULL, CONSTRAINT
10、PK_军团 PRIMARY KEY CLUSTERED ( 军团名 ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARYCREATE TABLE dbo.城池( 城池名 char(20) NOT NULL, 太守名 char(20) NULL, 军团名 char(20) NULL, 势力名 char(20) NULL, 兵数 int NULL, CONSTRAINT PK_城池 PRIMARY KEY CLUSTERED ( 城池名 ASC)WITH (PAD_INDEX = OFF, IGNORE_DU
11、P_KEY = OFF) ON PRIMARY) ON PRIMARYCREATE TABLE dbo.部队( 部队名 char(20) NOT NULL, 驻扎城池 char(20) NULL, 兵种 char(20) NULL, CONSTRAINT PK_部队 PRIMARY KEY CLUSTERED ( 部队名 ASC)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON PRIMARY) ON PRIMARY关系语句:ALTER TABLE dbo.关系 WITH CHECK ADD CONSTRAINT FK_关系_武将 FOREIGN
12、KEY(武将名)REFERENCES dbo.武将 (武将名)ALTER TABLE dbo.关系 CHECK CONSTRAINT FK_关系_武将ALTER TABLE dbo.太守 WITH CHECK ADD CONSTRAINT FK_太守_城池 FOREIGN KEY(镇守城)REFERENCES dbo.城池 (城池名)ALTER TABLE dbo.太守 CHECK CONSTRAINT FK_太守_城池ALTER TABLE dbo.太守 WITH CHECK ADD CONSTRAINT FK_太守_武将 FOREIGN KEY(名字)REFERENCES dbo.武将 (
13、武将名)ALTER TABLE dbo.太守 CHECK CONSTRAINT FK_太守_武将ALTER TABLE dbo.武将 WITH CHECK ADD CONSTRAINT FK_武将_城池 FOREIGN KEY(驻守城)REFERENCES dbo.城池 (城池名)ALTER TABLE dbo.武将 CHECK CONSTRAINT FK_武将_城池ALTER TABLE dbo.武将 WITH CHECK ADD CONSTRAINT FK_武将_势力 FOREIGN KEY(势力)REFERENCES dbo.势力 (势力名)ALTER TABLE dbo.武将 CHEC
14、K CONSTRAINT FK_武将_势力ALTER TABLE dbo.军团 WITH CHECK ADD CONSTRAINT FK_军团_势力 FOREIGN KEY(所属势力)REFERENCES dbo.势力 (势力名)ALTER TABLE dbo.军团 CHECK CONSTRAINT FK_军团_势力ALTER TABLE dbo.城池 WITH CHECK ADD CONSTRAINT FK_城池_军团 FOREIGN KEY(军团名)REFERENCES dbo.军团 (军团名)ALTER TABLE dbo.城池 CHECK CONSTRAINT FK_城池_军团ALTE
15、R TABLE dbo.部队 WITH CHECK ADD CONSTRAINT FK_部队_兵种 FOREIGN KEY(兵种)REFERENCES dbo.兵种 (兵种名)ALTER TABLE dbo.部队 CHECK CONSTRAINT FK_部队_兵种ALTER TABLE dbo.部队 WITH CHECK ADD CONSTRAINT FK_部队_城池 FOREIGN KEY(驻扎城池)REFERENCES dbo.城池 (城池名)ALTER TABLE dbo.部队 CHECK CONSTRAINT FK_部队_城池七、 SQL部分1.查看蜀国城池情报select * fro
16、m 城池where 势力名=蜀2.零陵增兵30000update 城池set 兵数=(select 新兵数=a.兵数+30000 from (select 兵数 from 城池where 城池名=零陵) a )where 城池名=零陵3.零陵攻城部队选择列表的查询select a.武将名,a.武力,a.智力,b.部队名,b.兵种from(select * from 武将where 驻守城=零陵) a,(select * from 部队where 驻扎城池=零陵) b4.假如选择 卢鹏州-零陵1 生成新表需要新查询select a.武将名,a.武力,a.智力,b.部队名,b.兵种from(sel
17、ect * from 武将where 驻守城=零陵) a,(select * from 部队where 驻扎城池=零陵) bwhere a.武将名卢鹏州 and b.部队名零陵15.列出所有可能的吴魏两国武将配对 显示两名武将的所在城池 以及武力差值select a.武将名,a.驻守城,b.武将名,b.驻守城,difference=(a.武力-b.武力)from 武将a , 武将bwhere a.武将名b.武将名and a.武力b.武力and a.势力=魏 and b.势力=吴6.假设武力和智力与兵数的换算是1:20,与在零陵的卢鹏州相比更为有实力的是,输出城池和武将(重新设置零陵兵力为120
18、00)select a.武将名,a.驻守城,a.总兵数 ,b.武将名,b.驻守城,b.总兵数from(select 武将名,驻守城,总兵数=(20*(武力+智力)+兵数) from 武将,城池where 驻守城=城池名)a,(select 武将名,驻守城,总兵数=(20*(武力+智力)+兵数) from 武将,城池where 驻守城=城池名)bwhere a.武将名=卢鹏州 and a.总兵数b.总兵数7.不在同一势力却有朋友关系的武将,输出武将和势力select a.武将名,a.势力,b.武将名,b.势力,关系from 关系,武将a ,武将bwhere 关系.武将名=a.武将名and 关系武
19、将=b.武将名and a.势力b.势力8.输出在地面上实力最强的城池部队(包括太守的能力值)select 战力=(地战力+战力值),镇守城,部队名,兵种,势力from 部队,兵种,太守,武将where 兵种=兵种名and 镇守城=驻扎城池and 名字=武将名and 势力=魏 order by 战力desc; 9.输出魏蜀前线军团中总兵数和蜀魏前线军团总兵数,并算出差值select a.总兵数,b.总兵数,差值=(a.总兵数-b.总兵数) from(select sum(兵数) 总兵数from 城池group by 军团名having 军团名=魏蜀前线军)a , (select sum(兵数) 总兵数from 城池group by 军团名having 军团名=蜀魏前线军)b10.可以带领弩兵部队的武将select 武将名,城池名,部队名from 城池,部队,武将where 驻守城=城池名and 城池名=驻扎城池and 兵种=弩兵;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1