数据库大作业三国战略.docx
《数据库大作业三国战略.docx》由会员分享,可在线阅读,更多相关《数据库大作业三国战略.docx(20页珍藏版)》请在冰点文库上搜索。
数据库大作业三国战略
数据库设计报告
-------------------模拟三国策略游戏数据库
院系:
软件学院
班级:
软件0903班
组员:
卢鹏洲
(2)
组员:
马英杰(4)
日期2011/11/1
一、业务规则
我们数据库设计的构思来自于平时玩的三国题材游戏。
根据游戏中武将、城池、势力、军队、人物关系等各种信息,以及建设、战斗、查看情报等各种功能,提出一种可以实现游戏部分功能的数据库设计方案。
在此,我们首先分析游戏的要实现的功能
主要包括:
1.情报查看:
用户(以下统称玩家)可以查看各个势力、军团、城池的情报。
2.任命太守:
玩家将一名武将设置为一座城池的太守,太守可在城池中执行内政命令。
3.城池经营:
城池经营包涵两个分支功能,一个是内政,内政由城池的太守执行(执行效果由智力决定),内政提高城市的治安,治安越高兵粮增加越快。
另一个是征兵,选取一个武将对一只部队进行征兵,征兵数量由武将武力决定。
4.攻打城池:
选择己方的一个城池发动对敌方一个城池的进攻,攻打时以部队为单位,每只部队由一到两名武将带领。
5.输送:
将部队或武将由一个城池转移到另一个城池。
游戏过程中的主要功能为以上几种,我们的数据库就围绕上述功能设计,尽管要形成一个游戏还有很多细小零碎的功能,其余和数据库关系不大的功能在此就不赘述了。
二、业务流程
1.情报查看:
玩家执行情报查看功能,相关数据操作如下:
“实力情报显示”玩家发出的查看命令,系统显示各势力总体情报。
“军团情报显示”玩家选择一个势力,显示该势力军团情报。
“城池武将情报显示”选择一个军团,显示该军团城池武将情报。
图1玩家查看情报数据流图
2.任命太守:
玩家指定一位武将,再指定一座己方城池,将该武将设置为该城池太守,玩家相关数据操作如下:
“城池列表显示”
“选择城池”玩家选择城池,选择信息传给系统
“武将列表显示”
“选择武将”玩家选择城池、和太守,选择信息传给系统
“修改武将所在”
“计算城池太守能力”系统根据玩家指令修改城池
“太守能力修改”生成新的太守数据。
图2太守任命数据流图
3.城池经营-内政:
玩家选择城池,根据该城太守智力增加城池治安,相关数据操作如下:
“城池列表显示”
“城池选择”玩家根据系统给出的城池表选择城池,选择信息传给系统
“治安计算”系统根据所选城池最大治安值和太守智力计算出新治安值,并修改城池数据
图3内政指令数据流图
4.城池经营-征兵:
玩家选择城池,之后选择武将、部队,让该武将对该部队执行征兵,相关数据操作如下:
“城池列表显示”
“选择城池”根据系统提供城池表选择城池
“武将、部队显示”系统根据所选城池生成武将\部队表
“选择武将、部队”由玩家选择执行武将和部队
“计算征兵数”系统根据玩家选择计算,然后修改相应数据
图4征兵指令数据流图
5.攻打城池:
有玩家选择一个敌对城池,选择由己方武将和部队编成的军队,将所选数据交给系统,系统计算输赢,修改城池、武将、部队信息,数据流图如下:
图5攻城指令数据流图
6.输送:
玩家选择一个城池的部队或武将,转移到另一城池,对两城数据以及转移武将、部队数据进行修改,数据流图如下:
图6输送指令数据流图
三、概念设计
图7整体ER图
四、逻辑设计
势力表:
军团表:
城池表:
部队表:
兵种表:
太守表:
武将表:
武将关系表:
关系表:
如图所示,有钥匙标示的是表的主键,如城池的城池名,有的表不含有主键只是作为外部键,如太守表、武将关系表中没有主键
五、规范化设计
第一范式
势力(势力名,君主,)
军团(军团名,所属势力,军团长)
城池(城池名,所属军团,所属势力,太守)
太守(镇守城,名字,战力值,农业值)
武将(武将名,驻守城,势力,武力,智力)
武将关系(武将名,关系武将,关系)
部队(部队名,兵种,驻扎城池)
兵种(兵种名,地战力,山战力,水战力,城战力)
第二范式同以上第一范式
第三范式
势力(势力名,君主,)
军团(军团名,所属势力,军团长)
城池(城池名,所属军团,太守)
武将(武将名,驻守城,武力,智力)
太守(镇守城,名字,战力值,农业值)
武将关系(武将名,关系武将,关系)
部队(部队名,兵种,驻扎城池)
兵种(兵种名,地战力,山战力,水战力,城战力)
BC范式同以上第三范式
六、物理设计
建表语句:
CREATETABLE[dbo].[势力](
[势力名][char](20)NOTNULL,
[君主][char](20)NULL,
CONSTRAINT[PK_势力_1]PRIMARYKEYCLUSTERED
(
[势力名]ASC
)WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
CREATETABLE[dbo].[兵种](
[兵种名][char](20)NOTNULL,
[地战力][int]NULL,
[水战力][int]NULL,
[山战力][int]NULL,
[城战力][int]NULL,
CONSTRAINT[PK_兵种]PRIMARYKEYCLUSTERED
(
[兵种名]ASC
)WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
CREATETABLE[dbo].[关系](
[武将名][char](20)NULL,
[关系][char](20)NULL,
[关系武将][char](20)NULL
)ON[PRIMARY]
CREATETABLE[dbo].[太守](
[镇守城][char](20)NULL,
[名字][char](20)NOTNULL,
[战力值][int]NULL,
[农业值][int]NULL
)ON[PRIMARY]
CREATETABLE[dbo].[武将](
[武将名][char](20)NOTNULL,
[武力][int]NULL,
[智力][int]NULL,
[势力][char](20)NULL,
[驻守城][char](20)NULL,
CONSTRAINT[PK_武将]PRIMARYKEYCLUSTERED
(
[武将名]ASC
)WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
CREATETABLE[dbo].[军团](
[军团名][char](20)NOTNULL,
[军团长][char](20)NULL,
[所属势力][char](20)NULL,
CONSTRAINT[PK_军团]PRIMARYKEYCLUSTERED
(
[军团名]ASC
)WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
CREATETABLE[dbo].[城池](
[城池名][char](20)NOTNULL,
[太守名][char](20)NULL,
[军团名][char](20)NULL,
[势力名][char](20)NULL,
[兵数][int]NULL,
CONSTRAINT[PK_城池]PRIMARYKEYCLUSTERED
(
[城池名]ASC
)WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
CREATETABLE[dbo].[部队](
[部队名][char](20)NOTNULL,
[驻扎城池][char](20)NULL,
[兵种][char](20)NULL,
CONSTRAINT[PK_部队]PRIMARYKEYCLUSTERED
(
[部队名]ASC
)WITH(PAD_INDEX=OFF,IGNORE_DUP_KEY=OFF)ON[PRIMARY]
)ON[PRIMARY]
关系语句:
ALTERTABLE[dbo].[关系]WITHCHECKADDCONSTRAINT[FK_关系_武将]FOREIGNKEY([武将名])
REFERENCES[dbo].[武将]([武将名])
ALTERTABLE[dbo].[关系]CHECKCONSTRAINT[FK_关系_武将]
ALTERTABLE[dbo].[太守]WITHCHECKADDCONSTRAINT[FK_太守_城池]FOREIGNKEY([镇守城])
REFERENCES[dbo].[城池]([城池名])
ALTERTABLE[dbo].[太守]CHECKCONSTRAINT[FK_太守_城池]
ALTERTABLE[dbo].[太守]WITHCHECKADDCONSTRAINT[FK_太守_武将]FOREIGNKEY([名字])
REFERENCES[dbo].[武将]([武将名])
ALTERTABLE[dbo].[太守]CHECKCONSTRAINT[FK_太守_武将]
ALTERTABLE[dbo].[武将]WITHCHECKADDCONSTRAINT[FK_武将_城池]FOREIGNKEY([驻守城])
REFERENCES[dbo].[城池]([城池名])
ALTERTABLE[dbo].[武将]CHECKCONSTRAINT[FK_武将_城池]
ALTERTABLE[dbo].[武将]WITHCHECKADDCONSTRAINT[FK_武将_势力]FOREIGNKEY([势力])
REFERENCES[dbo].[势力]([势力名])
ALTERTABLE[dbo].[武将]CHECKCONSTRAINT[FK_武将_势力]
ALTERTABLE[dbo].[军团]WITHCHECKADDCONSTRAINT[FK_军团_势力]FOREIGNKEY([所属势力])
REFERENCES[dbo].[势力]([势力名])
ALTERTABLE[dbo].[军团]CHECKCONSTRAINT[FK_军团_势力]
ALTERTABLE[dbo].[城池]WITHCHECKADDCONSTRAINT[FK_城池_军团]FOREIGNKEY([军团名])
REFERENCES[dbo].[军团]([军团名])
ALTERTABLE[dbo].[城池]CHECKCONSTRAINT[FK_城池_军团]
ALTERTABLE[dbo].[部队]WITHCHECKADDCONSTRAINT[FK_部队_兵种]FOREIGNKEY([兵种])
REFERENCES[dbo].[兵种]([兵种名])
ALTERTABLE[dbo].[部队]CHECKCONSTRAINT[FK_部队_兵种]
ALTERTABLE[dbo].[部队]WITHCHECKADDCONSTRAINT[FK_部队_城池]FOREIGNKEY([驻扎城池])
REFERENCES[dbo].[城池]([城池名])
ALTERTABLE[dbo].[部队]CHECKCONSTRAINT[FK_部队_城池]
七、SQL部分
1.查看蜀国城池情报
select*from城池
where势力名='蜀'
2.零陵增兵30000
update城池
set兵数=(select新兵数=a.兵数+30000from(select兵数from城池
where城池名='零陵')a)
where城池名='零陵'
3.零陵攻城部队选择列表的查询
selecta.武将名,a.武力,a.智力,b.部队名,b.兵种
from(select*from武将where驻守城='零陵')a,
(select*from部队where驻扎城池='零陵')b
4.假如选择卢鹏州-零陵1生成新表需要新查询
selecta.武将名,a.武力,a.智力,b.部队名,b.兵种
from(select*from武将where驻守城='零陵')a,(select*from部队where驻扎城池='零陵')b
wherea.武将名<>'卢鹏州'andb.部队名<>'零陵1'
5.列出所有可能的吴魏两国武将配对显示两名武将的所在城池以及武力差值
selecta.武将名,a.驻守城,b.武将名,b.驻守城,difference=(a.武力-b.武力)from武将a,武将b
wherea.武将名<>b.武将名anda.武力>b.武力anda.势力='魏'andb.势力='吴'
6.假设武力和智力与兵数的换算是1:
20,与在零陵的卢鹏州相比更为有实力的是,输出城池和武将(重新设置零陵兵力为12000)
selecta.武将名,a.驻守城,a.总兵数,b.武将名,b.驻守城,b.总兵数from
(select武将名,驻守城,总兵数=(20*(武力+智力)+兵数)from武将,城池
where驻守城=城池名)a,
(select武将名,驻守城,总兵数=(20*(武力+智力)+兵数)from武将,城池
where驻守城=城池名)b
wherea.武将名='卢鹏州'anda.总兵数7.不在同一势力却有朋友关系的武将,输出武将和势力
selecta.武将名,a.势力,b.武将名,b.势力,关系from关系,武将a,武将b
where关系.武将名=a.武将名and关系武将=b.武将名anda.势力<>b.势力
8.输出在地面上实力最强的城池部队(包括太守的能力值)
select战力=(地战力+战力值),镇守城,部队名,兵种,势力from部队,兵种,太守,武将
where兵种=兵种名and镇守城=驻扎城池and名字=武将名and势力='魏'
orderby战力desc;
9.输出魏蜀前线军团中总兵数和蜀魏前线军团总兵数,并算出差值
selecta.总兵数,b.总兵数,差值=(a.总兵数-b.总兵数)from
(selectsum(兵数)总兵数
from城池
groupby军团名
having军团名='魏蜀前线军')a,
(selectsum(兵数)总兵数
from城池
groupby军团名
having军团名='蜀魏前线军')b
10.可以带领弩兵部队的武将
select武将名,城池名,部队名from城池,部队,武将
where驻守城=城池名and城池名=驻扎城池and兵种='弩兵';