五子棋的AI构想 有句话叫“当局者迷,旁观者清。”,但这句话在由AI所控制的计算机玩家上是不成立的,因为计算机必须知道有那些获胜方式,并计算出每下一步棋到棋盘上任一格子的获胜几率,也就是说,一个完整的五子棋的AI构想必须:
1、能够知道所有的获胜组合; 2、建立和使用获胜表; 3、设定获胜的分数; 4、使电脑具有攻击和防守的能力; 一、求五子棋的获胜组合 在一场五子棋的游戏中,计算机必须要知道有那些的获胜组合,因此我们必须求得获胜组合的总数。我们假定当前的棋盘为1010。 (1)计算水平方向的获胜组合数,每一列的获胜组合是:6,共10列,所以水平方向的获胜组合数为:610=60 (2)计算垂直方向的获胜组合总数,每一行的获胜组合是:6,共10行,则垂直方向的获胜组合数为:610=60 (3)计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为6+(5+4+3+2+1)2=36 (4)计算反对角线方向的获胜组合总数,反对角线上的获胜组合总数为6+(5+4+3+2+1)2=36 ,这样所有的获胜组合数为:60+60+36+36=192 二、建立和使用获胜表 我们已经计算出了一个1010的五子棋盘会有192种获胜方式,这样我们可以利用数组建立获胜表,获胜表的主要作用是:1,判断当前的获胜方式是否有效;2,判断当前的获胜方式中到底有多少子落入该获胜组合中。详细的使用您将在后面的程序中可以看出。 三,分数的设定 在游戏中为了让计算机能够决定下一步最佳的走法,必须先计算出计算机下到棋盘上任一空格的分数,而其中最高分数便是计算机下一步的最佳走法。 原理:我们判定当前讨论的空格与当前讨论的点有几种获胜的方式,有几种该空格就加几分。这种原理初听起来似乎是无法入手,没关系,当您了解我们后面的程序后您就会明白这种决策原理了。 这种决策有一些缺陷,因为如果只根据这个模型设计,就有可能出现电脑或玩家有三个子连成一线的时候,计算机却判断不出,它认为其他某些空格是当前的获胜的最佳位置而不去攻击或防守。没关系我们完全可以通过一个加强算法来改变当前的分值情况,也就是说当电脑或玩家有三个子或四个子连成一线时,我们通过加强算法将当前与三个子或四个子有关的空格的分值提高,从而可以弥补这一缺憾。 四、攻击与防守 以上的方式,事实上计算机只是计算出了最佳的攻击位置,为了防守我们还应计算当前玩家的最佳的攻击位置。这样有什么用呢?道理很简单,如果玩家最佳攻击位置的分数大于计算机最佳攻击位置上的分数,那么计算机就将下一步的棋子摆在玩家的最佳攻击位上以阻止玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。 事实上,这个AI构想是很强大的如果你不是很厉害的五子棋高手的话,可能很快会被计算机打败。我在联众上可是中级棋手啊,跟这种构想打的时候胜率也不是很高。 使用vbnet编写五子棋 一、编写前的准备: 1、用计算机的思想描述整个下棋的过程 考虑步骤: (1)为了简便我们可以先让电脑先走第一步棋,电脑每走一步就会封掉许多玩家的获胜可能情况。 (2)当玩家走棋的时候我们首先应该考虑玩家走棋的合法性。 (3)如果合法,那么玩家也会封掉许多电脑的获胜的可能情况。 (4)电脑的思考路径:首先判断当前玩家和电脑的所有获胜组合是否需要进行加强赋值,
是进行加强赋值,否则进行普通的赋值。 (5)比较当前玩家和电脑谁的分值最大。将分值最大的点作为电脑的下一步走法。 2、利用vbnet窗体和图形工具建立五子棋的棋盘界面 (1)添加一个picturebox控件 作用:使用picturebox控件绘制棋子和棋盘 (2)添加一个label控件 作用:显示当前的获胜标志,也就是当某一方获胜或和棋时显示此标签。 (3)添加一个mainmenu控件 作用:控制游戏的开始或结束 (4)添加一个mediaplay组件 作用:使程序可以播放音乐。 3、设置整体框价 我们采取1010的棋盘,为主要的平台。利用数组定义整个棋盘桌面,利用数组定义获胜组合以及获胜标志等。 二,声明全局数组和变量 定义虚拟桌面: Dim table(9, 9) As Integer 定义当前玩家桌面空格的分数: Dim pscore(9, 9) As Integer 定义当前电脑桌面空格的分数: Dim cscore(9, 9) As Integer 定义玩家的获胜组合: Dim pwin(9, 9, 191) As Boolean 定义电脑的获胜组合: Dim cwin(9, 9, 191) As Boolean 定义玩家的获胜组合标志: Dim pflag(191) As Boolean 定义电脑的获胜组合标志:
Dim cflag(191) As Boolean 定义游戏有效标志: Dim theplayflag As Boolean 三、初始化游戏 '
' 模块名称: initplayenvironment
'
' 描述: 此函数主要功能如下:
' 1 设置背景音乐。
' 2 设置游戏状态有效。
' 3 初始化游戏状态标签。
' 4 直接指定电脑的第一步走法。
' 5 初始化基本得分桌面。
' 6 电脑和玩家获胜标志初始化。
' 7 初始化所有获胜组合。
' 8 重新设定玩家的获胜标志。
'
'
Sub initplayenvironment()
playerFileName = "\music\zhyu01mid"
playerPlay()
theplayflag = True
'游戏有效
Label1Visible = False
'游戏状态标签不显示
PictureBox1Refresh()
'清空picturebox1的内容
yuandian(130, 130)
'调用绘图函数绘制当前电脑先走的位置
Dim i, j, m, n As Integer
For i = 0 To 9
For j = 0 To 9
table(i, j) = 0
Next
Next
'桌面初始化
For i = 0 To 191
pflag(i) = True
cflag(i) = True
Next
'获胜标志初始化
table(4, 4) = 1
'由于我们设定电脑先手,并下了4,4位所以将其值设为1
''' 初始化获胜组合
n = 0
For i = 0 To 9
For j = 0 To 5
For m = 0 To 4
pwin(j + m, i, n) = True
cwin(j + m, i, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 9
For j = 0 To 5
For m = 0 To 4
pwin(i, j + m, n) = True
cwin(i, j + m, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 5
For j = 0 To 5
For m = 0 To 4
pwin(j + m, i + m, n) = True
cwin(j + m, i + m, n) = True
Next
n = n + 1
Next
Next
For i = 0 To 5
For j = 9 To 4 Step -1
For m = 0 To 4
pwin(j - m, i + m, n) = True
cwin(j - m, i + m, n) = True
Next
n = n + 1
Next
Next
''' 初始化获胜组合结束
For i = 0 To 191
If pwin(4, 4, i) = True Then
pflag(i) = False
End If
Next
'由于电脑已下了4,4位所以我们需要重新设定玩家的获胜标志
End Sub
四,处理鼠标事件 '
' 模块名称: themousedown
'
' 描述: 此函数主要实行以下功能:
' 1 判定当前游戏标志是否有效。
' 2 将实际坐标转化成虚拟坐标。
' 3 绘制玩家的棋子。
' 4 执行检查获胜函数。
' 5 执行电脑算法函数。
'
'
Sub themousedown(ByVal x As Integer, ByVal y As Integer)
If theplayflag = False Then
Exit Sub
End If
'检查游戏状态是否有效
Dim i, j As Integer
Dim zhx, zhy As Integer
zhx = Int((x - 10) / 30)
zhy = Int((y - 10) / 30)
For i = 0 To 9
For j = 0 To 9
If table(zhx, zhy) > 0 Then
Exit Sub
End If
Next
Next
'检查当前鼠标点击的格子是否有效
Dim mycolor As Color
Dim g As SystemDrawingGraphics
g = PictureBox1CreateGraphics
mycolor = ColorWhite
Dim brush1 As SystemDrawingBrush = New SolidBrush(mycolor)
gFillEllipse(brush1, zhx 30 + 10, zhy 30 + 10, 30, 30)
'绘制玩家的棋子
table(zhx, zhy) = 2
For i = 0 To 191
If cwin(zhx, zhy, i) = True Then
cflag(i) = False
End If
Next
'重设电脑的获胜标志
checkwin()
'检查当前玩家是否获胜
diannao()
'调用电脑算法
End Sub 五、获胜检查算法。 '
' 模块名称: checkwin
'
' 描述: 此模块执行以下功能:
' 1 检查是否和棋。
' 2 检查电脑是否获胜。
' 3 检查玩家是否获胜。
'
'
Sub checkwin()
Dim i, j, k, m, n As Integer
Dim ca As Integer
Dim pa As Integer
Dim cnormal As Integer = 0
For i = 0 To 191
If cflag(i) = False Then
cnormal = cnormal + 1
End If
Next
If cnormal = 190 Then
Label1Visible = True
Label1Text = "和棋,请重新开始!"
PictureBox1Refresh()
theplayflag = False
Exit Sub
End If
'设定和棋规则
For i = 0 To 191
If cflag(i) = True Then
ca = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 1 Then
If cwin(j, k, i) = True Then
ca = ca + 1
End If
End If
Next
Next
If ca = 5 Then
Label1Visible = True
Label1Text = "电脑获胜,请重新开始"
PictureBox1Refresh()
theplayflag = False
Exit Sub
End If
End If
Next
'检查电脑是否获胜
For i = 0 To 191
If pflag(i) = True Then
pa = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 2 Then
If pwin(j, k, i) = True Then
pa = pa + 1
End If
End If
Next
Next
If pa = 5 Then
Label1Visible = True
Label1Text = "玩家获胜,请重新开始"
PictureBox1Refresh()
theplayflag = False
Exit Sub
End If
End If
Next
'检查玩家是否获胜
End Sub六、电脑算法 '
' 模块名称: diannao
'
' 描述: 此程序主要执行以下功能:
' 1 初始化赋值系统。
' 2 赋值加强算法。
' 3 计算电脑和玩家的最佳攻击位。
' 4 比较电脑和玩家的最佳攻击位并决定电脑的最佳策略。
' 5 执行检查获胜函数。
'
' Sub diannao()
Dim i, j, k, m, n As Integer
Dim dc As Integer
Dim cab As Integer
Dim pab As Integer
For i = 0 To 9
For j = 0 To 9
pscore(i, j) = 0
cscore(i, j) = 0
Next
Next
'初始化赋值数组
''' 电脑加强算法
For i = 0 To 191
If cflag(i) = True Then
cab = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 1 Then
If cwin(j, k, i) = True Then
cab = cab + 1
End If
End If
Next
Next
Select Case cab
Case 3
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If cwin(m, n, i) = True Then
cscore(m, n) = cscore(m, n) + 5
End If
End If
Next
Next
Case 4
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If cwin(m, n, i) = True Then
yuandian(m 30 + 10, n 30 + 10)
table(m, n) = 1
For dc = 0 To 191
If pwin(m, n, dc) = True Then
pflag(dc) = False
checkwin()
Exit Sub
End If
Next
End If
End If
Next
Next
End Select
End If
Next
For i = 0 To 191
If pflag(i) = True Then
pab = 0
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 2 Then
If pwin(j, k, i) = True Then
pab = pab + 1
End If
End If
Next
Next
Select Case pab
Case 3
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If pwin(m, n, i) = True Then
pscore(m, n) = pscore(m, n) + 30
End If
End If
Next
Next
Case 4
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 0 Then
If pwin(m, n, i) = True Then
yuandian(m 30 + 10, n 30 + 10)
table(m, n) = 1
For dc = 0 To 191
If pwin(m, n, dc) = True Then
pflag(dc) = False
checkwin()
Exit Sub
End If
Next
End If
End If
Next
Next
End Select
End If
Next
''' 电脑加强算法结束 ' 赋值系统
For i = 0 To 191
If cflag(i) = True Then
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 0 Then
If cwin(j, k, i) = True Then
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 1 Then
If cwin(m, n, i) = True Then
cscore(j, k) = cscore(j, k) + 1
End If
End If
Next
Next
End If
End If
Next
Next
End If
Next
For i = 0 To 191
If pflag(i) = True Then
For j = 0 To 9
For k = 0 To 9
If table(j, k) = 0 Then
If pwin(j, k, i) = True Then
For m = 0 To 9
For n = 0 To 9
If table(m, n) = 2 Then
If pwin(m, n, i) = True Then
pscore(j, k) = pscore(j, k) + 1
End If
End If
Next
Next
End If
End If
Next
Next
End If
Next
''' 赋值系统结束
''' 分值比较算法
Dim a, b, c, d As Integer
Dim cs As Integer = 0
Dim ps As Integer = 0
For i = 0 To 9
For j = 0 To 9
If cscore(i, j) > cs Then
cs = cscore(i, j)
a = i
b = j
End If
Next
Next
For i = 0 To 9
For j = 0 To 9
If pscore(i, j) > ps Then
ps = pscore(i, j)
c = i
d = j
End If
Next
Next
If cs > ps Then
yuandian(a 30 + 10, b 30 + 10)
table(a, b) = 1
For i = 0 To 191
If pwin(a, b, i) = True Then
pflag(i) = False
End If
Next
Else
yuandian(c 30 + 10, d 30 + 10)
table(c, d) = 1
For i = 0 To 191
If pwin(c, d, i) = True Then
pflag(i) = False
End If
Next
End If
''' 分值比较算法结束
checkwin()
End Sub 七、绘制棋子 '
' 模块名称: yuandian
'
' 描述: 此函数主要进行电脑棋子的绘制。
'
' Sub yuandian(ByVal x As Integer, ByVal y As Integer)
Dim mycolor As Color
Dim g As SystemDrawingGraphics
g = PictureBox1CreateGraphics
Dim zhx, zhy As Integer
zhx = Int((x - 10) / 30)
zhy = Int((y - 10) / 30)
mycolor = ColorBlack
Dim brush1 As SystemDrawingBrush = New SolidBrush(mycolor)
gFillEllipse(brush1, zhx 30 + 10, zhy 30 + 10, 30, 30)
End Sub
系统文件gamedll出错。可能是盗号木马、流氓软件等恶意程序所导致,其感染相关文件并加载起来,一旦杀毒软件删除被感染的文件,就会导致相关组件缺失,游戏等常用软件运行不起来,通常会伴随下几种情况:
1、桌面图标无法删除
2、网络游戏打不开
3、电脑无故蓝屏
4、电脑没声音
5、桌面无法显示
6、主页被修改为网址导航
建议先杀毒,再去下载个gamedll
下载完文件后,如下 *** 作:
1 退出正在运行的所有程序。(包括杀毒啊,暴风啊,QQ啊)
2 单击开始,然后单击运行。
3 键入 regsvr32 Gamedll,然后单击确定。
4 当收到“DllRegisterServer in Gamedll succeeded“提示时关闭窗口。
python可以只用来实现游戏服务端,前端可以使用别的语言,比如flash之类的。
写GUI可以用python自带的Tkinter或者使用Qt的python库。
如果解决了您的问题请采纳!
如果未解决请继续追问
“游戏系统策划”这个职业的主要工作内容是什么呢?
游戏策划,只是在游戏开发公司中的一种职称,是游戏开发的核心,主要的工作是要编写游戏背景故事,制定游戏规则,以及设计游戏和整个游戏世界的一些细节。游戏设计简单的说就是手机游戏细节上的设计师、规则的提出者。例如运用大伙儿喜欢玩的王者荣耀举例说明。这款游戏的地形图和地貌大约是怎么样的,英雄人物传出的专业技能伤害值、制冷值多少,英雄人物长相、服饰、武器装备的大致款式,商城系统、造就、排名榜等游戏功能。
这都是游戏设计在游戏软件开发早期设置好的。游戏设计也依据岗位工作职责不相同分成好几个职位,主要包含承担全部手机游戏整体规划的方向主策划,承担游戏过关玩法技巧定制的关卡策划,承担手机游戏程序模块关键点设置的系统策划,承担游戏里面故事情节世界背景故事编写的文案编辑,接下来就是承担游戏里面各类标值概率计算公式有关的数值策划。优就业课程设置中便包括手机游戏策划运营方面的知识,如果对游戏市场有兴趣,但是却不善于编码的情形下,实际上就可以选择学习培训游戏设计,此类职位未来发展趋势也是非常不错的。
以创始人与维护者的身份加入到游戏世界,将创意想法设计方案传达给流程和工艺美术;制作游戏全球中的人物,并给予她们性格和生命;在网游世界中加入各种各样有趣的小故事和事件,丰富多彩全部网游世界内容;调整游戏里的自变量和标值,使网游世界均衡平稳;制做多姿多彩的游戏武器和战斗系统;设计方案先人从来没有想过的游戏的玩法和系统,带来游戏玩家从未有过的开心。
深层次了解自己商品,全面了解游戏玩家。根据在线客服,社区论坛来获知游戏玩家难题,游戏玩家要求。并且为了维持住手机游戏的稳定,数据信息也罢,网络服务器也罢。为公司发展挣钱全靠搞活动,提升收入。实时改善商品,根据各种方式发觉游戏里的难题,并和产品研发一起沟通交流改善手机游戏。
摘要:
本文是在概要设计实践和学习中的一些心得与学习笔记,希望与大家分享,如有不妥之处欢迎指正。
关键字:
概要设计,结构化,OOD
正文:
在需求明确、准备开始编码之前,要做概要设计,而详细设计可能大部分公司没有做,有做的也大部分是和编码同步进行,或者在编码之后。因此,对大部分的公司来说,概要设计文档是唯一的设计文档,对后面的开发、测试、实施、维护工作起到关键性的影响。
一、问题的提出
概要设计写什么?概要设计怎么做?
如何判断设计的模块是完整的?
为什么说设计阶段过于重视业务流程是个误区?
以需求分析文档还是以概要设计文档来评估开发工作量、指导开发计划准确?
结构化好还是面向对象好?
以上问题的答案请在文章中找。
二、概要设计的目的
将软件系统需求转换为未来系统的设计;
逐步开发强壮的系统构架;
使设计适合于实施环境,为提高性能而进行设计;
结构应该被分解为模块和库。
三、概要设计的任务
制定规范:代码体系、接口规约、命名规则。这是项目小组今后共同作战的基础,有了开发规范和程序模块之间和项目成员彼此之间的接口规则、方式方法,大家就有了共同的工作语言、共同的工作平台,使整个软件开发工作可以协调有序地进行。
总体结构设计:
功能(加工)->模块:每个功能用那些模块实现,保证每个功能都有相应的模块来实现;
模块层次结构:某个角度的软件框架视图;
模块间的调用关系:模块间的接口的总体描述;
模块间的接口:传递的信息及其结构;
处理方式设计:满足功能和性能的算法
用户界面设计;
数据结构设计:
详细的数据结构:表、索引、文件;
算法相关逻辑数据结构及其 *** 作;
上述 *** 作的程序模块说明(在前台?在后台?用视图?用过程?······)
接口控制表的数据结构和使用规则
其他性能设计。
四、概要设计写什么
结构化软件设计说明书结构(因篇幅有限和过时嫌疑,在此不作过多解释)
任务:目标、环境、需求、局限;
总体设计:处理流程、总体结构与模块、功能与模块的关系;
接口设计:总体说明外部用户、软、硬件接口;内部模块间接口(注:接口≈系统界面)
数据结构:逻辑结构、物理结构,与程序结构的关系;
模块设计:每个模块“做什么”、简要说明“怎么做”(输入、输出、处理逻辑、与其它模块的接口,与其它系统或硬件的接口),处在什么逻辑位置、物理位置;
运行设计:运行模块组合、控制、时间;
出错设计:出错信息、处错处理;
其他设计:保密、维护;
OO软件设计说明书结构
1 概述
系统简述、软件设计目标、参考资料、修订版本记录
这部分论述整个系统的设计目标,明确地说明哪些功能是系统决定实现而哪些时不准备实现的。同时,对于非功能性的需求例如性能、可用性等,亦需提及。需求规格说明书对于这部分的内容来说是很重要的参考,看看其中明确了的功能性以及非功能性的需求。
这部分必须说清楚设计的全貌如何,务必使读者看后知道将实现的系统有什么特点和功能。在随后的文档部分,将解释设计是怎么来实现这些的。
2 术语表
对本文档中所使用的各种术语进行说明。如果一些术语在需求规格说明书中已经说明过了,此处不用再重复,可以指引读者参考需求说明。
3 用例
此处要求系统用用例图表述(UML),对每个用例(正常处理的情况)要有中文叙述。
4 设计概述
41 简述
这部分要求突出整个设计所采用的方法(是面向对象设计还是结构化设计)、系统的体系结构(例如客户/服务器结构)以及使用到的相应技术和工具(例如OMT、Rose)
42 系统结构设计
这部分要求提供高层系统结构(顶层系统结构、各子系统结构)的描述,使用方框图来显示主要的组件及组件间的交互。最好是把逻辑结构同物理结构分离,对前者进行描述。别忘了说明图中用到的俗语和符号。
43 系统界面
各种提供给用户的界面以及外部系统在此处要予以说明。如果在需求规格说明书中已经对用户界面有了叙述,此处不用再重复,可以指引读者参考需求说明。如果系统提供了对其它系统的接口,比如说从其它软件系统导入/导出数据,必须在此说明。
44 约束和假定
描述系统设计中最主要的约束,这些是由客户强制要求并在需求说明书写明的。说明系统是如何来适应这些约束的。
另外如果本系统跟其它外部系统交互或者依赖其它外部系统提供一些功能辅助,那么系统可能还受到其它的约束。这种情况下,要求清楚地描述与本系统有交互的软件类型以及这样导致的约束。
实现的语言和平台也会对系统有约束,同样在此予以说明。
对于因选择具体的设计实现而导致对系统的约束,简要地描述你的想法思路,经过怎么样的权衡,为什么要采取这样的设计等等。
5 对象模型
提供整个系统的对象模型,如果模型过大,按照可行的标准把它划分成小块,例如可以把客户端和服务器端的对象模型分开成两个图表述。在其中应该包含所有的系统对象。这些对象都是从理解需求后得到的。要明确哪些应该、哪些不应该被放进图中。所有对象之间的关联必须被确定并且必须指明联系的基数。聚合和继承关系必须清楚地确定下来。每个图必须附有简单的说明。
6 对象描述
在这个部分叙述每个对象的细节,它的属性、它的方法。在这之前必须从逻辑上对对象进行组织。你可能需要用结构图把对象按子系统划分好。
为每个对象做一个条目。在系统对象模型中简要的描述它的用途、约束(如只能有一个实例),列出它的属性和方法。如果对象是存储在持久的数据容器中,标明它是持久对象,否则说明它是个临时对象(transient object)。
对每个对象的每个属性详细说明:名字、类型,如果属性不是很直观或者有约束(例如,每个对象的该属性必须有一个唯一的值或者值域是有限正整数等)。
对每个对象的每个方法详细说明:方法名,返回类型,返回值,参数,用途以及使用的算法的简要说明(如果不是特别简单的话)。如果对变量或者返回值由什么假定的话,Pre-conditions和Post-conditions必须在此说明。列出它或者被它调用的方法需要访问或者修改的属性。最后,提供可以验证实现方法的测试案例。
7 动态模型
这部分的作用是描述系统如何响应各种事件。一般使用顺序图和状态图。
确定不同的场景(Scenario)是第一步,不需要确定所有可能的场景,但是必须至少要覆盖典型的系统用例。不要自己去想当然地创造场景,通常的策略是描述那些客户可以感受得到的场景。
71 场景(Scenarios)
对每个场景做一则条目,包括以下内容:
场景名:给它一个可以望文生义的名字
场景描述:简要叙述场景是干什么的以及发生的动作的顺序。
顺序图:描述各种事件及事件发生的相对时间顺序。
72 状态图
这部分的内容包括系统动态模型重要的部分的状态图。可能你想为每个对象画一个状态图,但事实上会导致太多不期望的细节信息,只需要确定系统中一些重要的对象并为之提供状态图即可。
8 非功能性需求
五、概要设计怎么做
结构化软件设计方法:
详细阅读需求规格说明书,理解系统建设目标、业务现状、现有系统、客户需求的各功能说明;
分析数据流图,弄清数据流加工的过程;
根据数据流图决定数据处理问题的类型(变换型、事务型、其他型);
通过以上分析,推导出系统的初始结构图;
对初始结构图进行改进完善:所有的加工都要能对应到相应模块(模块的完整性在于他们完成了需求中的所有加工),消除完全相似或局部相似的重复功能(智者察同),理清模块间的层次、控制关系,减少高扇出结构,随着深度增大扇入,平衡模块大小。
由对数据字典的修改补充完善,导出逻辑数据结构,导出每种数据结构上的 *** 作,这些 *** 作应当属于某个模块。
确定系统包含哪些应用服务系统、客户端、数据库管理系统;
确定每个模块放在哪个应用服务器或客户端的哪个目录、哪个文件(库),或是在数据库内部建立的对象。
对每个筛选后的模块进行列表说明。
对逻辑数据结构进行列表说明。
根据结构化软件设计说明书结构对其他需要说明的问题进行补充说明,形成概要设计说明书。
OO软件设计方法:
在OOA基础上设计对象与类:在问题领域分析(业务建模和需求分析)之后,开始建立系统构架。
第一步是抽取建立领域的概念模型,在UML中表现为建立对象类图、活动图和交互图。对象类就是从对象中经过“察同”找出某组对象之间的共同特征而形成类:
对象与类的属性:数据结构;
对象与类的服务 *** 作: *** 作的实现算法;
对象与类的各外部联系的实现结构;
设计策略:充分利用现有的类;
方法:继承、复用、演化;
活动图用于定义工作流,主要说明工作流的5W(Do What、Who Do、When Do、Where Do、Why Do)等问题,交互图把人员和业务联系在一起是为了理解交互过程,发现业务工作流中相互交互的各种角色。
第二步是构建完善系统结构:对系统进行分解,将大系统分解为若干子系统,子系统分解为若干软件组件,并说明子系统之间的静态和动态接口,每个子系统可以由用例模型、分析模型、设计模型、测试模型表示。软件系统结构的两种方式:层次、块状
层次结构:系统、子系统、模块、组件(同一层之间具有独立性);
块状结构:相互之间弱耦合
系统的组成部分:
问题论域:业务相关类和对象(OOA的重点);
人机界面:窗口、菜单、按钮、命令等等;
数据管理:数据管理方法、逻辑物理结构、 *** 作对象类;
任务管理:任务协调和管理进程;
第三步是利用“4+1”视图描述系统架构:用例视图及剧本;说明体系结构的设计视图;以模块形式组成包和层包含概要实现模型的实现视图;说明进程与线程及其架构、分配和相互交互关系的过程视图;说明系统在 *** 作平台上的物理节点和其上的任务分配的配置视图。在RUP中还有可选的数据视图。
第四步是性能优化(速度、资源、内存)、模型清晰化、简单化(简单就是享受)。
六、概要设计的原则
总体原则和方法:由粗到细的原则,互相结合的原则,定性分析和定量分析相结合的方法,分解和协调的方法和模型化方法。
要系统考虑系统的一般性、关联性、整体性和层次性。
分解协调:目的是为了创造更好的系统。系统分解是指将一个复杂的系统分解为若干个子系统,系统协调一是系统内协调,即根据系统的总结构、总功能、总任务和总目标的要求,使各个子系统之间互相协调配合,在各个子系统局部优化基础上,通过内部平衡的协调控制,实现系统的整体优化;
屏蔽抽象:从简单的框架开始,隐含细节;
一致性:统一的规范、统一的标准、统一的文件模式;
每个模块应当有一个统一命名的容易理解的名字;
编码:由外向内(界面->核心);
面向用户:概要设计是对于按钮按下后系统“怎么做”的简要说明;
模块、组件的充分独立性、封闭性;
同时考虑静态结构与动态运行;
每个逻辑对象都应当说明其所处物理对象(非一一对应);
每个物理对象都有合适的开发人员,并且利于分工与组装。(详细说明见本人另一篇文章:系统构架设计应考虑的因素);
确立每个构架视图的整体结构:视图的详细组织结构、元素的分组以及这些主要分组之间的接口;
软件构架与使用的技术平台密切相关,目前常用的平台有J2EE、NET、CORBA等等,因此具体的软件构架人员应当具备使用这些平台的软件开发经验;
通过需求功能与设计模块之间的列表对应,检查每个需求功能是否都有相应的模块来实现,保证需求功能的可追溯性和需求实现(模块)的完整性,同时可以检查重复和不必要的模块。
在需求调研分析过程中对业务处理过程了解的完整性和准确性非常重要。调查了解清楚所有的业务流程才能设计出适合各流程业务节点用户业务特点和习惯的软件,使开发出来的软件更受欢迎。当然在进行软件概要设计时,要尽量排除业务流程的制约,即把流程中的各项业务结点工作作为独立的对象,设计成独立的模块,充分考虑他们与其他各种业务对象模块的接口,在流程之间通过业务对象模块的相互调用实现各种业务,这样,在业务流程发生有限的变化时(每个业务模块本身的业务逻辑没有变的情况下),就能够比较方便地修改系统程序模块间的调用关系而实现新的需求。如果这种调用关系被设计成存储在配置库的数据字典里,则连程序代码都不用修改,只需修改数据字典里的模块调用规则即可。
七、概要设计的重要输出
编码规范:信息形式、接口规约、命名规则;
物理模型:组件图、配置图;
不同角度的构架视图:用例视图、逻辑视图、进程视图、部署视图、实施视图、数据视图(可选);
系统总体布局:哪些部分组成、各部分在物理上、逻辑上的相互关系;
两个不可忽视的输出:
与需求功能的关系:对于需求中的每一个功能,用哪一层、哪个模块、哪个类、哪个对象来实现(一对多关系);反过来,应当说明将要创建的系统每一层、每个模块、每个对象、每一个类“做什么”,他们是为了帮助实现哪些功能(一对多关系)。(需求的颗粒度在一开始往往是比较粗的,因此根据功能点对于整体项目规模的估计或得到项目WBS其误差范围也是比较大的。更为重要的原因是,需求往往不是编码工作分解的准确依据,因为一个需求的功能点可能对应多个代码模块,而多个需求的功能点也可能只对应一个或少数代码模块,同时还有软件复用等因素要考虑,因此只有在概要设计完成以后才能准确地得到详细设计或编码阶段的二次 WBS,并估计较为准确的整体项目规模。)
逻辑与物理位置:每个对象在逻辑上分别落在哪一层、哪个模块、哪个类;在物理上每个模块、每个对象、每一个类放在哪个应用服务器或客户端的哪个目录、哪个文件(库),或者是建立在数据库管理系统中的什么东东(过程、函数、视图、触发器等等)。
八、结构化与面向对象方法特点比较
1 从概念方面看,结构化软件是功能的集合,通过模块以及模块和模块之间的分层调用关系实现;面向对象软件是事物的集合,通过对象以及对象和对象之间的通讯联系实现;
2 从构成方面看,结构化软件=过程+数据,以过程为中心;面向对象软件=(数据+相应 *** 作)的封装,以数据为中心;
3 从运行控制方面看,结构化软件采用顺序处理方式,由过程驱动控制;面向对象软件采用交互式、并行处理方式,由消息驱动控制;
4 从开发方面看,结构化方法的工作重点是设计;面向对象方法的工作重点是分析;但是,在结构化方法中,分析阶段和设计阶段采用了不相吻合的表达方式,需要把在分析阶段采用的具有网络特征的数据流图转换为设计阶段采用的具有分层特征的结构图,在面向对象方法中则不存在这一问题。
5 从应用方面看,相对而言,结构化方法更加适合数据类型比较简单的数值计算和数据统计管理软件的开发;面向对象方法更加适合大型复杂的人机交互式软件和数据统计管理软件的开发;
参考文献:
《实用软件工程》第二版,郑人杰、殷人昆、陶永雷等著
《微软项目:求生法则》Steve McConnell著,余孟学译
《软件工程:实践者的研究方法》(第5版)Roger SPressman著
《软件构架实践》SEI软件工程译丛,林·巴斯著
《RUP2000》电子版;
《UML与系统分析设计》张龙祥著;
《面向对象的分析与设计》杨正甫著;
41游戏的的思路、构想
411游戏想法的产生
相信大家一定都在8位机机上玩过《冒险岛》这款游戏,非常有趣味性。
游戏中玩家通过不断的闯关,来解救公主。在每个关都很很多的怪物阻挡着你,所以需要运用各种机关或者秘籍来杀死它们。杀死他们的同时还可以获得各种奖励,加生命,加血等,增加了游戏的趣味性。
如图2所示:
这款《冒险岛》游戏的实现相对于其他RPG或者网络版手机游戏稍简单一些,适合初学者作为练习,所以我决定编写一款类似的手机游戏。
由于之前对手机游戏的编程知识以及游戏的设计只有初步的了解,因此,我们在游戏的构架和思路上经历了几个阶段。
这款《冒险岛》游戏的实现相对于其他RPG或者网络版手机游戏稍简单一些,适合初学者作为练习,所以我决定编写一款类似的手机游戏。
由于之前对手机游戏的编程知识以及游戏的设计只有初步的了解,因此,我们在游戏的构架和思路上经历了几个阶段。
412对游戏设计的初步认识
刚开始我们只对J2ME有初步的了解。这时我们只是模仿之前在PC上看到的游戏,用语言把游戏的实现感性的描述为几大部分:
游戏界面系统:包括游戏开始界面;游戏开局界面;游戏运行界面;游戏结束界面。
游戏元素:菜单类;画布类;人物类;排行榜类。
413模块成型阶段
在进一步熟悉了J2ME知识后,对框架做出了一些修改,逐步把游戏的基本功能确定。游戏依次进入加载界面;主菜单;游戏运行界面;游戏结束界面。
具体实现的功能为:
1.主菜单,有如下选项:
(1)开始游戏——进入游戏界面。
(2)声音——设置声音的有无选项。
(3)帮助——介绍游戏的玩法。
(4)排行榜——玩家所得分数的排行榜。
(5)关于——用来显示说明信息以及背景。
2.游戏运行界面,包括:
游戏界面;目前游戏得分;游戏关数;生命次数;
3.游戏结束界面:游戏结束后,显示一行说明信息,然后退回到菜单。
游戏的主要模块为:
1.游戏主MIDlet(GameMIDlet)——对游戏生命周期的判断;对画布类的调用;管理游戏程序中各个屏幕之间的转换。
2.游戏画布(MyGame)——对游戏所用变量,常量的设定;游戏的初始化;游戏中精灵运动轨迹的控制;精灵与砖块的碰撞检测以及砖块状态的控制;游戏中各关卡的基本设定;游戏中对按键状态的处理。
3.菜单类——游戏中菜单事件的处理。
4.GameOgre类——游戏中怪物的类。
5.GamePlayer类——玩家控制的精灵类。
6.GameRMS类——用于实现分数排行榜。
7.PlayMusic类——用于实现音乐的播放。
8.MySet类——声音大小的设置。
42 程序的类结构
程序一共有8个主要类,其中菜单类负责各个屏幕的切换。程序的类结构如图3所示:
43 游戏的流程图
进入游戏菜单。初始情况下,游戏菜单有5个选项,它们分别是开始游戏、游戏说明和排行榜、设置、关于。选择开始新游戏则进入游戏,在游戏中如果按下非游戏键则中断游戏返回菜单,此时菜单中增加了一个继续游戏的选项,可以返回游戏也可以重新开始新的游戏。在菜单中选择游戏说明或者高分记录,则进入相应的屏幕,他们都能用“后退”软键返回菜单。菜单中的退出选项用于退出程序。游戏的流程如图4所示:
441主类GameMIDlet的实现
MIDlet是最核心的类。MIDlet程序有三种状态:
1.暂停状态
2.运行状态
3.销毁状态
J2ME程序都是从MIDlet类开始执行,系统在执行MIDlet程序时,首先构造一个MIDlet类型的对象,然后使程序进入到暂停状态,按照生命周期的规定,系统会自动调用MIDlet对象的startApp方法使程序进入到运行状态,开始程序的执行。
下图是运行时显示的画布对象:
首先,先要创建MIDlet类型的对象,下面我们来看对象的构造方法:
//主程序构造方法
public GameMIDlet()
{
rs = null;
RecordName = “GameRMS”;
GameMenudisplay = DisplaygetDisplay(this) ;
GameMenumidlet = this;
}
java
开发语言
oppo手机型号及价格
精选推荐
广告
JAVA基于J2ME的手机游戏开发(文档+源代码)zip
0下载·0评论
2022年1月27日
JAVA基于J2ME的手机游戏开发免费
717阅读·0评论·0点赞
2022年8月23日
JAVA五子棋手机网络对战游戏的设计与实现(源代码+论文)
568阅读·2评论·0点赞
2022年12月5日
J2ME手机游戏引擎程序结构简述
170阅读·0评论·0点赞
2021年9月12日
最新45款Java手机游戏开发源代码免费下载
10下载·0评论
2019年3月4日
经典50个Java手机游戏源码7z
3下载·0评论
2022年7月8日
无敌版游戏下载
精选推荐
广告
java手机小游戏源码_Java手机版数独小游戏(J2me)JAVA游戏源码下载
435阅读·0评论·0点赞
2021年3月14日
java 300行代码 冒险闯关小游戏(代码+讲解)
2637阅读·1评论·6点赞
2022年9月9日
java俄罗斯方块代码_俄罗斯方块java分享一个Java写的俄罗斯方块源码 算法简单(300行) 注释详细!
304阅读·0评论·0点赞
2021年3月5日
java小游戏源码_分享几款java小游戏源码
4921阅读·0评论·4点赞
2021年3月5日
java手机游戏开发如何_用JAVA开发手机游戏需要如何构建开发环境?
1209阅读·0评论·0点赞
2021年2月26日
《精通Java手机游戏与应用程序设计》源码
35阅读·0评论·0点赞
2022年3月24日
java怎么制作游戏,看完这篇彻底明白了
4803阅读·0评论·2点赞
2021年6月29日
泡泡堂代码 JAVA_Java手机游戏泡泡堂源码
566阅读·0评论·1点赞
2021年3月14日
十款经典游戏的Java版本(开源)
190W阅读·95评论·214点赞
2014年12月7日
飞翔的小鸟--Java小游戏实战(代码完整)
11W阅读·13评论·50点赞
2021年4月5日
Vue——获取后端json数据中的URL并通过按钮跳转到此URL
1683阅读·4评论·0点赞
2021年2月5日
java安卓游戏源码下载_77个安卓游戏 android源码
801阅读·0评论·0点赞
2021年3月15日
去首页
看看更多热门内容
①有两种方法
②第一种方法,把游戏的当前运行数据都转化为统一的字符串格式,存入文本文件,在重新载入游戏的时候全部逆 *** 作还原到程序里。
③第二种方法,直接把所有数据封装模板化到类的实例,也就是说,你把类的内存内容完整读到文本文件里,等下次读取,再完整创建一个同样的内存区域,存入文本内容,并让类指针指向此块区域。(这要确保,类内所有内容都是非外沿的:也就是不是索引数据,都是保存数据)
以上就是关于五子棋游戏程序设计(VB)全部的内容,包括:五子棋游戏程序设计(VB)、游戏方面问题,模块game.dll加载失败、用Python写游戏除了pygame 还有什么模块 写GUI用什么模块除了easygui和wx等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)