第六章 人机交互界面 的表示模型 山东大学计算机学院
目的 在界面设计的早期阶段,研究建立一种用户界面表示模型 利用形式化的设计语言来分析和表达用户任务以及用户和系统之间的交互情况; 使界面表示模型能方便地映射到实际的设计实现。 山东大学计算机学院
界面模型分类 任务分解和分析 结构模型 constructional model 能力模型(competence model) 描述用户的目的 行为模型(performance model) 预测和描述用户合法的交互行为序列 结构模型 constructional model 系统组成模型 山东大学计算机学院
本章主要内容 三种模型: 如何由界面的行为表示模型转换到系统的结构模型。 行为模型 结构模型 事件-对象模型 主要从用户和任务的角度考虑如何来描述人机交互界面,将详细介绍GOMS,UAN及LOTOS模型。 结构模型 主要从系统的角度来表示人机交互界面。重点介绍状态转换网络(STN-State Transition Network)和产生式规则 ( Production Rule )。 事件-对象模型 是一种面向对象的表示模型,它将人机交互活动归结为事件与对象的相互作用。 如何由界面的行为表示模型转换到系统的结构模型。 山东大学计算机学院
参考材料 1) The Psychology of Human-Computer Interaction by S.K. Card et al. 2) Human-Computer Interaction (2nd Edition) by Alan J. Dix, et al. 3) 董士海等:《人机交互和多通道用户界面》. 科学出版社,1999. 2. 4) A Comparison of Approaches for Specifying Multi-Modal Interactive Systems,by Joelle Coutaz et al. 山东大学计算机学院
GOMS简介 1983年由Card, Morgan和Newell 提出的。 通过目标 (Goal)、操作 (Operator)、方法 (Method) 以及选择规则 (Selection) 四个元素来描述用户的行为。 GOMS是在交互系统中用来分析建立用户行为的模型。它采用“分而治之”的思想,将一个任务进行多层次的细化。 山东大学计算机学院
GOMS 1.目标 Goals 2. 操作 Operators 目标就是用户执行任务最终想要得到的结果,它可以在不同的层次中进行定义。 eg:“编辑一篇文章”-“编辑文章”(高层); “删除字符”(低层) 2. 操作 Operators 操作是任务分析到最低层时的行为,是用户为了完成任务所必须执行的基本动作。 操作不能被分解,在GOMS模型中是原子动作。 山东大学计算机学院
GOMS 3. 方法 Methods 方法是描述如何完成目标的过程。一个方法本质上来说是内部的算法,用来确定子目标序列及完成目标所需要的操作。 关闭(最小化)窗口 GOAL: ICONSIZE-WINDOW [select GOAL: USE-CLOSE-METHOD MOVE-MOUSE-TO-WINDOW-HEADER POP-UP-MENU CLICK-OVER-CLOSE-OPTION GOAL: USE-L7-METHOD PRESS-L7-KEY] 山东大学计算机学院
GOMS 4.选择 Selection 选择是用户要遵守的判定规则,以确定在特定环境下所要使用的方法。 用户Sam: Rule 1: Use the CLOSE-METHOD unless another rule applies Rule 2: If the application is GAME, use L7-METHOD 山东大学计算机学院
任务Editing的GOMS描述实例 Task:Editing GOAL:EDIT-MANUSCRIPT GOAL:EDIT-UNIT-Task repeat until no more unit tasks GOAL:ACQUIRE-UNIT-TASK GET-NEXT-PAGE if at end of manuscript GET-NEXT-TASK GOAL:EXECUTE-UNIT-TASK GOAL:LOCATE-LINE [select:USE-QS-METHED USE-LF-METHOD] GOAL:MODIFY-TEXT [select:USE-S-METHOD USE-M-METHOD] VERIFY-EDIT 子目标间关系: 顺序关系,选择关系 山东大学计算机学院
GOMS应用 GOMS是一种人机交互界面表示的理论模型,被称为最成熟的工程典范,该模型在计算机系统的评估方面也有广泛的应用。 GOMS can save money! 美国电话公司NYNEX利用GOMS分析一套即将被采用的新的计算机系统的应用效果,结果发现效果不理想,放弃了使用新系统,为公司节约了数百万的资金。 山东大学计算机学院
GOMS的局限性 GOMS没有清楚的描述错误处理的过程,假设用户完全按一种正确的方式进行人机交互,因此只针对那些不犯任何错误的专家用户。 GOMS对于任务之间的关系描述过于简单,只有顺序和选择.事实上任务之间的关系还有很多种(具体参见6.1.2节中LOTOS的介绍),另外选择关系通过非形式化的附加规则描述,实现起来也比较困难。 GOMS把所有的任务都看作是面向操作目标的,而忽略了一些任务所要解决的问题本质以及用户间的个体差异,它的建立不是基于现有的认知心理学,无法代表真正的认知过程。 山东大学计算机学院
LOTOS简介 LOTOS -Language Of Temporal Ordering Specification, T.Bolognesi, H.Brinskma, "Introduction to the ISO Specification Language LOTOS”, 1987. 国际标准形式描述语言,无二义性,适于描述具有并发、交互、反馈和不确定性等特点的并发(concurrent)系统中的行为。 开始作为一种描述网络协议的语言,由于交互系统、特别是多通道交互系统有并发系统的特点,因此成为用来描述交互系统的行为模型。 山东大学计算机学院
LOTOS基本思想 系统的外部可见行为可以看作是由一个有时序关系的交互序列组成。 系统由一系列进程组成,进程同环境之间通过称为“关口”(gates)的交互点进行交互。 两个以上的进程在执行同一个外部可见的行为时会发生交互操作,进行数据交换、信息传递、协调同步等操作。 进程行为用“行为表达式”来描述,复杂的行为由简单的行为表达式通过表示时序关系的LOTOS算符组合而成。 在将LOTOS思想用于人机交互的行为模型时,用进程之间的约束关系来描述交互子任务之间的关系。 山东大学计算机学院
LOTOS算符 LOTOS算符主要有以下几种: T1 ||| T2(交替Interleaving) T1 [] T2(选择Choice) T1 | [a1,...,an] | T2(同步Synchronization) T1 [> T2 (禁止Deactivation) T1 >> T2(允许Enabling) 山东大学计算机学院
LOTOS实例 山东大学计算机学院
中国象棋的LOTOS任务分解实例 山东大学计算机学院
LOTOS与GOMS的结合 LOTOS模型很好的描述了任务之间的时序约束关系,这些时序约束关系能更好的描述GOMS中子目标之间的关系。 山东大学计算机学院
结合GOMS和LOTOS的中国象棋程序的行为描述 GOAL:中国象棋 [>: GOAL:运行 |||: *GOAL:走棋 ACTION:自动记录棋谱 >>: GOAL:当前方走 OPRATOR:拾取棋子 OPRATOR:放置棋子 GOAL:对弈方走 >> OPRATOR:拾取棋子 OPRATOR:放置棋子 *GOAL:打谱 []: OPRATOR:加速 OPRATOR:减速 OPRATOR:暂停 OPRATOR:恢复 GOAL:退出 山东大学计算机学院
总结 LOTOS与GOMS结合,可以清楚地了解整个目标层次及各目标之间的约束关系。但与GOMS同样存在无法描述目标异常结束的缺陷,同时当任务进行选择时用什么规则进行选择并未涉及。 LOTOS最大的优越性在于可以构造一套现成的自动化工具,利用这些工具,可自动进行错误检测,但它过于形式化的记法比较晦涩难懂。 GOMS和LOTOS的结合可以很好地描述人机交互的较高级的任务,对于原子任务的形式化描述,上述模型并没有给出一个比较清晰的描述,下面讨论的UAN模型主要用于原子目标的描述。 山东大学计算机学院
UAN模型 UAN---User Action Notation, Hartson et al 1990. 山东大学计算机学院
UAN模型的基本思想 预定义一些标志符: 用户动作标志符 条件标志符 采用一种表格结构来表示任务 界面被分解成一些类似层次结构的异步任务,每个任务的实现都用表格来描述,用户动作的关联性和时序关系由表格的行列对齐关系和从上到下、从左到右的阅读顺序来确定。 任务(task):任务名称(the name of task) 用户行为 界面反馈 界面状态 山东大学计算机学院
UAN预定义的动作标志符(部分) 用户动作标志符: 用户动作标志符: move_mouse(x,y) 移动鼠标至(x,y) release_button(x,y)在(x,y)位置释放鼠标按钮; highlight(icon) 使icon高亮显示; de_highlight(icon) 取消icon的高亮显示。 用户动作标志符: ~[X],在某个图形对象上移动鼠标; £, 按下鼠标; ¢,释放鼠标; !, 使对象高亮显示; -!, 取消对象的高亮显示 Display,显示图形对象; Erase, 取消显示对象。 山东大学计算机学院
UAN预定义的条件标志符(部分) while(condition) TASK if(condition) then TASK iteration A* or A+ 表示迭代操作; waiting 表示等待,可以等待一个条件满足,也可以等待任务中的一个操作执行。 山东大学计算机学院
UAN实例-单通道交互 任务:把文件拖入垃圾箱 用户行为 界面反馈 界面状态 mouse_down(x,y) drag_icon(x,y) drag_icon(x,y) mouse_up(x,y) then highlight(icon) show_outline(icon) then highlight(bin) then hide(icon) show_bin_full() if intersect(icon,x,y) icon=selected if intersect(bin,x,y) 山东大学计算机学院
UAN实例-多通道 界面反馈 界面状态 2D鼠标 语音 任务:drag and drop a file to the recycle bin 用户行为 界面反馈 界面状态 2D鼠标 语音 then highlight(icon) show_outline(icon) then highlight(bin) then hide(icon) show_bin_full() if intersect(icon, x,y) icon=selected if intersect(bin,x,y) if intersect(bin,x2,y2) mouse_down(x,y) drag_icon(x,y) mouse_up(x,y) Pronounce Move_to+recycle_bin 山东大学计算机学院
UAN总结 UAN模型更接近于实现,界面状态和界面反馈用一般的程序语言描述,实现起来比较方便,当然这种描述由于接近于程序语言,因此设计时需要一定的编程基础 UAN模型在精确刻画各成分之间的各种平行和串行的时序关系方面尚显不足,任务之间的时序关系没有明确表示出来,当所描述的界面使用多种输入设备和有若干可选交互路径时,比较繁琐。 山东大学计算机学院
层次化的界面描述方法 山东大学计算机学院
G-U-L模型 可以考虑将GOMS、UAN、LOTOS中模型结合为一个预测行为模型:G-U-L模型。 山东大学计算机学院
练习 写出下面描述对应的LOTOS模型 |||: *GOAL:荷裁定义 *GOAL:节点荷裁定义 Operator:输入节点荷载参数 >>: *GOAL:施加荷栽 *GOAL:施加节点荷载 Operator:选择自定义节点荷载 Operator:自动捕捉节点并施加荷载 *GOAL:施加单元荷载 Operator:选择自定义单元荷载 Operator:自动捕捉单元并单元施加荷裁 *GOAL:施加支座条件 Action:自动捕捉节点 Operator:选择支座并施加支座 *GOAL:输入分析参数 Operator:填写分析的参数 GOAL:对输入的数据进行分析 Operator:按下分析按钮进行数据分析 G0AL:保存文件 Operator:按下保存按钮,输入文件名并保存 GOAL:退出 写出下面描述对应的LOTOS模型 Task:采用Dynade软件分析建筑结构 GOAL:建筑结构动力设计与分析 [>: GOA L:运行 |||: GOAL:轴线网格生成 Operator:添加开间网格 Operator:添加进深网格 Action:自动生成节点 *GOAL:材料定义 Operator:选择材料种类和属性 Operator:填写材料名称和参数 >>: *GOAL:单元定义 Operator:选择单元种类和所用材料 Operator:填写单元名称、面积和参数 *GOAL:单元布置 Operator:选择自定义单元属性 Operator:自动捕捉单元并施加单元属性
练习 写出用鼠标将文件夹A拖入文件夹B的UAN模型 界面反馈 界面状态 2D鼠标 语音 任务:在桌面上把文件A拖入文件B 用户行为 then highlight(iconA) show_outline(iconA) then highlight(folderB) then hide(iconA) if intersect(iconA, x,y) iconA=selected if intersect(folderB,x,y) if intersect(folderB,x2,y2) mouse_down(x,y) drag_icon(x,y) mouse_up(x,y) Pronounce Move_to+B
人机交互界面表示模型—— 结构模型
界面表示的行为模型和结构模型 行为模型 结构模型 从用户角度看,行为模型强调做什么,结构模型强调怎么做 行为模型是从用户任务和完成目标角度描述界面模型 描述任务或目标 为了完成任务或达到目标所进行的行为序列 结构模型 结构模型从系统组成角度,描述如何通过交互序列完成交互任务。着重描述系统的反应和行为。 从用户角度看,行为模型强调做什么,结构模型强调怎么做
结构模型 产生式规则-Production Rule 状态转换网络-State Transition Network
产生式规则 又称为上下文无关文法,将人机交互对话看作是一种语言,运用基于语法的方法来描述交互对话。 产生式集合定义了用户与计算机交互所运用的语言。 产生式规则的一般形式是: if condition then action 这些规则可以表示为不同的形式,如 condition → action condition:action
产生式规则 系统不断用产生式规则来检测用户的输入是否与这些条件相匹配。若匹配则激活相应的动作,这些动作可以是执行应用程序的一个过程,也可以是直接改变某些系统状态的值。 一般来说,组成界面描述的产生式规则很多,所有的规则都是有效的,规则定义的顺序并不重要,只要与规则中的条件相匹配,就可以激活相应的动作。 产生式规则系统可以是 事件引导; 状态引导; 混合引导
事件引导的系统 用户在屏幕上绘制直线 Sel-line → start-line <highlight 'line'> C-point start-line→ rest-line <rubber band on> C-point rest- line→ <draw line> <rubber band off>
事件引导的系统 产生式规则的条件和动作部分都以事件的方式进行表示。事件主要有三种类型: 用户事件(user event),Sel-line表示从菜单中选择line命令,C-point 和D-point表示用户在绘图平面上单击和双击鼠标。 内部事件,用于保持对话状态,如start-line 表示开始画线后的状态,rest- line表示选择了第一个点之后的状态。 系统响应事件,以尖括号表示可见或可听的系统响应,如<highlight 'line'>,把菜单项'line'高亮度显示,<draw line>表示在屏幕上显示直线,<rubber band on> 表示橡皮筋绘制方式打开,<rubber band off>表示橡皮筋绘制方式关闭。
事件引导实现方法 保存内部事件序列 构造一个对话控制器,主要负责事件的产生和规则的匹配 规则的匹配算法影响系统的性能
状态引导的系统 事件引导的系统中的内部事件,是事件还是状态? 在系统内存保存的不再是动态的随时进出的事件,而是一些表示系统的当前状态的属性,这些属性在不同的时刻有不同的值。
状态定义 Mouse:﹛mouse-null, select-line, click-point, double-click﹜ Line-state:﹛menu, start-line, rest-line﹜ Rubber-band:﹛rubber-band-on, rubber-band-off﹜ Menu:﹛highlight-null, highlight-line, highlight-circle﹜ Draw:﹛draw-nothing, draw-line﹜
产生式规则 Select-line→mouse-null start-line highlight-line Click-point start-line→mouse-null rest-line rubber-band-on Click-point rest- line→mouse-null draw-line rubber-band-off
混合引导的系统 可以将两者结合起来,采用下面的形式: 来描述一个产生式规则。 event: condition → action 来描述一个产生式规则。 事件用来激活产生式规则,如果条件不满足,即当前系统内存中的状态和产生式的规则不匹配,则无法激活规则。 当状态改变时,产生式规则中的action本身也可以产生新的事件,从而可以激活另一条规则。
混合引导的系统 系统有三个属性: Bold: ﹛off, on﹜ Italic: ﹛off, on﹜ Underline: ﹛off, on﹜
混合引导系统的产生式 select- bold:Bold = off → Bold = on select- bold:Bold = on → Bold = off select-italic: Italic = off → Italic = on select-italic: Italic = on → Italic = off select-under:Underline = off → Underline = on select-under:Underline = on → Underline = off
产生式规则总结 描述操作时序能力强,并发顺序均可 无法描述误操作 界面复杂时,状态、事件复杂,产生式过多,要求产生式匹配算法性能高
状态转换网络 状态转换网络(STN)的基本思想是定义一个具有一定数量状态的转换机,称之为有限状态机-Finite State Machine(FSM)。 FSM从外部世界中接收到事件,并能使FSM从一个状态转换到另一个状态。 这里介绍两种最基本的状态转换网络,状态转换网络(State Diagrams)和扩展状态转换网络(State Charts),后者是前者的一个扩展。
传统的状态转换网络 当发生一个外部或内部事件时,系统就会从一个状态转换到另外一个状态,这称为状态转换。 一个状态转换与一对状态相关联。 外部事件主要由用户操作外部输入设备来产生。 内部事件可以是系统产生的事件,如时钟事件,也可以是为了改变系统的状态和行为而产生的事件,如当一个任务完成后可以激活另一个任务等。 一个状态转换与一对状态相关联。 一般的系统具有很多个状态,假设系统由n个状态组成,状态之间的转换最多可能有n*(n-1)个。
简单的三状态FSM 最多可能有6个状态转换
带条件和动作的状态转换 选项条件(conditions),表示导致状态的改变的条件; 选项动作(actions),表示系统在改变状态时将执行什么动作。
带条件的状态转换实例
带条件的状态转换实例 基于鼠标的画图工具 draw circle 单击在圆周上 rubber band 单击在中心点 highlight ‘circle’ 选择 ‘circle’ Circle1 Menu Finish Circle2 draw line 双击 单击在第一点 highlight ‘line’ 选择 ‘line’ Line1 Line2
传统状态转换模型的优缺点 状态转换网络的优点 存在着一定的局限性 比相应的文本解决方案更易于设计、理解、修改和文档化 它给出了对行为的精确的、甚至是格式化的定义。 存在着一定的局限性 最大的缺陷是需要定义出系统的所有状态,这对于小型的系统是没有问题的,但是在一个较大的系统中,系统会很快崩溃 状态的数目是呈指数级增长的,同时状态的增长直接导致了状态转换网络过于复杂、无法实际应用。
扩展状态转换网络 graphics 子菜单 选择 ‘graphics’ 弹出 graphics子菜单 text 子菜单 选择 ‘text’ 主菜单 graphics 子菜单 弹出text 子菜单 选择 ‘text’ text 子菜单 弹出 paint 子菜单 选择 ‘paint paint 子菜单
带有取消功能的状态转换图 ESC 正常完成 ESC 正常完成 ESC 正常完成 graphics 子菜单 选择 ‘graphics’ 选择 ‘text’ text 子菜单 ESC 主菜单 弹出text 子菜单 正常完成 paint 子菜单 选择 ‘paint ESC 弹出 paint 子菜单 正常完成 山东大学计算机学院
带有帮助功能的状态转换 Finish 从菜单出发 rubber band draw circle 按下HELP按钮 按下HELP按钮 单击在中心点 单击在圆周上 Circle1 Circle2 Finish 从菜单出发 rubber band draw circle 按下HELP按钮 按下HELP按钮 帮助子系统 帮助子系统 山东大学计算机学院
状态转换模型的优缺点 优点 缺点 具有良好的描述串行和顺序行为的能力 比相应的文本解决方案更易于设计、理解、修改和文档化 它给出了对行为的精确的、甚至是格式化的定义 缺点 状态的爆发式增长问题 并发及其他行为的描述能力差 虽然是一个结构模型,但难以实现
行为模型和结构模型的转换 转换算法 行为模型(G-U-L) 结构模型 State Charts GOMS UAN LOTOS约束规则 用户 Domain Expert Designer 模型转换整体框架
模型转换整体框架 整个框架分为三个部分: 行为模型使用G-U-L模型,在这一层将产生一个基本的预测性的行为模型。 结构模型采用层次状态转换网络,它涉及到的元素有状态、转换、事件、层次结构。不考虑状态转换网络在转换中条件和同步,可以简化转换工作。 用户包含两种用户,领域专家和设计者。G-U-L模型的创建主要是由领域专家和设计者合作来完成的,然后通过模型转换算法转换成为结构模型,最后提供给设计者使用。 山东大学计算机学院
6.4.2 转换算法 1.基本思想 2.基本步骤 3.实例应用 山东大学计算机学院
1.基本思想 采用G-U-L以层次化结构对任务进行建模,包括目标(包括循环属性)、行为、关系。 状态转换网络表示的是状态之间的转换,也采用层次化表示,涉及到的主要是状态、转换、事件、行为。 在G-U-L中体现的层次关系转换到状态转换网络中也体现出层次的关系,G-U-L中的每个目标都对应一个状态转换网络。 如果一个目标下层有子目标,对子目标来说,它所对应的状态网络应该嵌套在上层目标对应的状态网络中。 山东大学计算机学院
1.基本思想 在产生的状态转换网络中,有两类事件起作用: 一类是外部由用户激活的事件,如“按下鼠标” 事件、“点击键盘” 事件等; 另一类是内部由目标产生的内部事件,这里只定义了“目标正常结束”,表示目标正常结束时产生的事件。 在进行从G-U-L到状态的转换时,这些事件只是形式上的一个定义,没有具体的实现过程,如要在某一层出现的第i个外部事件用“外部事件i”来代替,而由某个目标Ti执行时产生的内部事件也仅仅用类似于“Ti正常结束事件”来表示, 而具体的事件还需要由状态网络进行,系统实现时通过专门的事件管理器来定义和管理。 对G-U-L中的行为在转换后就成为对应的状态转换网络中的一个行为。 山东大学计算机学院
图 中描述了一个目标层次中产生事件的过程。 事件产生过程 G 产生“G正常结束”事件 S0 …… F 山东大学计算机学院
2.基本步骤 对转换后的数据,存储的是状态转换网络中表示转换的弧,如下图所示: 其中的触发事件就是触发从出发状态到目的状态转换的事件; 状态转换网络中弧的表示结构 其中的触发事件就是触发从出发状态到目的状态转换的事件; 父状态表示的是当前弧所在状态网络的上层状态,可以是一个抽象出来的状态名; 出发状态 目的状态 触发事件 父状态 行为 山东大学计算机学院
2.基本步骤 转换基本步骤 (1)读取存储G-U-L模型的数据文件,进行解析,定义一个数组stn用于存储状态网络中的弧。获取G-U-L模型中的最高目标,设为G0,然后调用(2)中的Translate函数,在Translate执行完毕后,stn中便存储了转换后的状态网络的数据。函数示意如下: main() { 定义一个存储弧的数组stn[] 读取G-U-L文件 GOAL G0<-GetSubGoal(null) ; //获取目标 Translate(G0,&stn); //调用转换函数 } 山东大学计算机学院
(2)对当前的目标进行处理,如果是原子目标,参考原子目标的UAN模型,创建其状态转换网络。否则,获得目标层次下的数据,包括行为、关系算符及子目标名。通过关系符号来调用(3)中相应的关系转换函数,对所有的子目标进行递归调用。 函数示意假如下: Translate(目标 G, 存储数组 stn[] ){ 获得目标G的子目标subG[] switch(关系) { case “[]”: 选择关系处理 case “>>”: 允许关系处理 case “|||”: 交替关系处理 case “[>”: 禁止关系处理 } //对所有的子目标进行递归调用 for(int I;I<subG.length;I++) Translate(subG[I],stn); 山东大学计算机学院
(3)定义了G-U-L的各种关系向状态网络转换的具体的实现函数,实际上就是生成状态网络中的弧,并进行存储。在各状态网络中都会有一个初始状态S。在每个处理函数中,需要考虑目标具有循环属性的情况,这在状态转换网络中的体现是某个状态通过一个事件激活以后能仍然返回到该状态。如果要转换到其他状态,还需要一个外部事件的作用。如对*G,如图6-20所示。 图6-20 带有循环属性的目标对应的状态转换图 G正常结束事件 外部事件 S U 山东大学计算机学院
G-U-L中各种约束关系对应的状态转换网络 [] (选择 choice): 设目标G下的子目标关系为[](G0,G1),表示共有两条路径可以完成目标G。 从初始状态S0出发,有两条弧需要记录,经过“外部事件0”到S1的转换及经过“外部事件1”到S2的转换,记录格式如下: 出发状态 目的状态 触发事件 父状态 行为 S0 S1 外部事件0 G Null S2 外部事件1 山东大学计算机学院
“选择”关系状态网络 图6-21a “选择”关系状态网络 G1正常结束事件 G0正常结束事件 外部事件1 外部事件0 S1 S2 S0 山东大学计算机学院
选择关系允许在一个层次下有多个目标同时存在,如[](G0,G1,……,Gn)。 在状态S1下,等待“G0正常结束事件”发生后被激活转到S0,或在S2下,等待“G1正常结束事件”发生后被激活也转回到S0状态,这两条弧在返回S0后都将执行动作“产生G正常结束事件”,并记录下这两条转换的弧。每次重新回到S0都认为完成了目标G的一次执行。 在图6-21b中考虑了存在目标循环的情况,即[](*G0,G1),需要记录的弧也在图中进行了反映,在后面介绍的关系中所涉及到的循环情况与此类似。 选择关系允许在一个层次下有多个目标同时存在,如[](G0,G1,……,Gn)。 山东大学计算机学院
“选择”关系状态网络-考虑了存在目标循环的情况 图6-21b 带循环的“选择”关系状态图 产生G正常结束事件 G0正常结束事件 S0 外部事件1 外部事件0 G1正常结束事件 S2 S1 外部事件2 山东大学计算机学院
图6-21b 带循环的“选择”关系状态图 产生G正常结束事件 G0正常结束事件 S0 外部事件2 外部事件0 G2正常结束事件 S3 S1 G\G1正常结束事件 外部事件1 S2
“允许”关系状态网络 设目标G下的子目标关系为>>(G0,G1),在这种关系中完成目标G的路径只有一条,当G0成功结束后才允许G1执行,这是一个顺序执行的过程。 在转换成状态转换网络后如图6-22所示。 G1正常结束事件 G0正常结束事件 外部事件 S1 S2 S0 产生G正常结束事件 图6-22 允许”关系状态网络 山东大学计算机学院
S0 产生G正常结束事件 外部事件1 外部事件2 G0正常结束事件 G1正常结束事件 S1 S2 S3 G2正常结束事件
从状态S0在外部事件激发转换至S1,在S1状态等待“G0正常结束事件”发生后转换至S2;然后在S2处等待“G1正常结束事件”转换至S0,这样表示目标G执行完毕,同时发生动作“产生G正常结束事件”,处理转换过程中存储所有的弧。这种约束关系允许同一层次下有多个目标存在,如>>(G0,G1,……,Gn),这些目标都是顺序执行。 山东大学计算机学院
“交替” 关系状态网络 设目标G下的子目标关系为|||(G0,G1),表示两个目标之间一种任意的组合来执行完成。在转换到状态网络后,如图6-23所示,有S0->S1->S4->S0和S0->S2->S3->S0两条途径可以完成目标G的一次执行。 图6-23 “交替”关系状态网络 G0正常结束事件 S2 G1正常结束事件 外部事件0 S0 S3 S4 S1 产生G正常结束事件 G1常结束事件 外部事件1 山东大学计算机学院
从S0状态,如果产生“外部事件0”,依次等待“G0正常结束事件”、“G1正常结束事件”并最终回到S0状态,同理,若产生“外部事件1”,则会沿着另一条路径回到S0。记录下所有状态转换的弧。在有交替关系的层次中最多只允许有两个状态存在。 山东大学计算机学院
“禁止” 关系状态网络 设目标G下的子目标关系为[>(G0,G1),一旦G1任务被执行,G0便无效(不活动)。这个关系在转换到状态网络以后与前面不同的是,在状态S2被“G1正常结束事件”激活以后,不会再回到S0,而是转到了一个新的状态F。在有禁止关系的层次中最多只允许有两个目标状态存在。一个典型的例子是G0=”运行”,G1=”退出”。在执行退出以后整个程序结束,也就无法再回到运行状态了。 G0正常结束事件 产生G正常结束事件 G1正常结束事件 外部事件0 外部事件1 S2 S0 F 图6-24 “禁止”关系状态网络 S1 山东大学计算机学院
3.实例应用 根据上面的转换算法,在图6-24a-c中给出了中国象棋的最高层目标、运行、走棋三个目标的状态转换网络,它们之间通过事件的产生和激活完成其层次间的通信。其他目标的状态网络表示与这三个图类似,在这里没有列出。 山东大学计算机学院
最高层目标 运行正常结束事件 外部事件1 外部事件0 退出正常结束事件 S0 S1 S2 F 图6-24a 最高层目标状态转换网络 山东大学计算机学院
运行 产生运行正常结束事件 走棋正常结束事件 打谱正常结束事件 S02 外部事件1 外部事件0 S00 S03 S04 S01 图6-24b “运行”目标状态转换网络 山东大学计算机学院
走棋 图6-24c “走棋”目标状态转换网络 走棋 对弈方走正常结束事件 产生走棋正常结束事件 当前方走正常结束事件 外部事件 S001 山东大学计算机学院
思考题 1.设计一个“在图书馆借阅图书”任务的GOMS模型。要求:结合任务设计的背景知识,熟练运用GOMS原理,从GOMS的四个方面完成任务模型的创建。 2、对上题中的GOMS模型中的原子目标,创建UAN模型,从而进一步了解UAN模型的在行为模型中的地位和作用。结合LOTOS算符,用G-U-L进一步完善任务的描述。 3、用GOMS模型给出一个拼图游戏的任务描述,要求用户能从给定的几种图形随机产生的需要拼接的图案,用状态转换图进行描述。 4、设计一个“用户使用自动取款机”、“图案编辑”任务的LOTOS模型,并转换为状态转换网络。 山东大学计算机学院
3 答案 Task: jigsaw GOAL: jigsaw GOAL: Select-graph-Task repeat until jigsaw task is finished GOAL: SELECT-GRAPH select:USE-click-METHED Select a graph from the graphs GOAL: CHECK-JIGSAW Check if the selected graph is fit If the graph is not fit, SELECT-NEXT-GRAPH GOAL: JIGSAW Patch up the selected graph SELECT-NEXT-GRAPH
使用取款机 4、答案 开始使用 [> 结束使用 ||| 现金业务 *查询信息 取款 [ ] 存款 选择取款功能 >> 显示可取金额 >> *选择取款金额 >> 出钞
游戏循环的基本步骤 1. 初始化 2. 进入游戏循环 3. 查询用户输入状态 4. 执行游戏逻辑和AI判断 5. 绘制图像 6. 循环 1. 初始化 2. 进入游戏循环 3. 查询用户输入状态 4. 执行游戏逻辑和AI判断 5. 绘制图像 6. 循环 7. 退出 [Martin]: While reading No.1 “Initialization”, the picture of the Game Loop architecture with the “Initialization” box colored. While reading No.2 “Enter Game Loop”, the picture of the Game Loop architecture with the “Enter Game Loop” box Colored. Similarly, show those eight picture of the Game Loop architecture with different box colored according to the reading timing.
Game Run Game Init Game Menu Game Restart Game Exit Game Starting
#define GAME_INIT 1 // the game is initializing // defines for game loop states #define GAME_INIT 1 // the game is initializing #define GAME_MENU 2 // the game is in the menu #define GAME_STARTING 3 // the game is about to run #define GAME_RUN 4 // the game is now running #define GAME_RESTART 5 // the game is going to restart #define GAME_EXIT 6 // the game is exiting // game globals int game_state = GAME_INIT; // start off in this state Int error = 0; // used to send errors back to OS // main begins here Void main( ) { // implementation of main game loop [Wen]: First of all, define the state numbers. Then, create a variable to record which state the game is in and initial it to be GAME_INIT
While (game_state != GAME_EXIT) { // implementation of main game loop switch(game_state) { case GAME_INIT: // the game is initializing { // allocate all memory and resources Init( ); game_state = GAME_MENU; } break; [Wen]: Then, implement the main game loop. After the game initialization, the game state go into GAME MENU state.
case GAME_MENU: // the game is in the menu { // call the main menu function and let it switch states game_state = Menu( ); // note: we could force a RUN state here } break; case GAME_STARTING: // the game is about to run { // this state is optional, but usually used to set things up right // before the game is run you might do a little more housekeeping Setup_For_Run( ); // switch to run state game_state = GAME_RUN; [Wen]: After getting into GAME MENU state, let the player choose run the game or exit. After getting into GAME RUN state, you are right in the Game Loop
case GAME_RUN: // the game is now running { // this section contains the entire game logic loop Clear( ); // clear the display Get_Input( ); // get the input Do_Logic( ); // perform logic and AI Render_Frame( ); // display the next frame of animation Wait( ); // synchronize the display // the only way that state can be changed is thru user interaction // in the input section or by maybe losing the game. } break; [Wen]: After getting into GAME RUN state, you are right in the Game Loop – get the input, perform logic and AI, display the next frame and synchronize the display etc…
case GAME_RESTART: // the game is restarting { // this section is a cleanup state used to fix up any loose ends // before running again Fixup( ); // switch states back to the menu game_state = GAME_MENU; } break; [Wen]: If getting into GAME Restart state, this section is a cleanup state used to fix up any loose ends before running again
return(error); // return error code to operating system } // end main case GAME_EXIT: // the game is exiting { // if the game is in this state then it’s time to bail, kill everything // and cross your fingers Release_And_Cleanup( ); error =0; // set the error word to whatever // note: we do not have to switch states since we are already in this state // on the next loop iteration the code will fall out of the main while and // exit back to the OS } break; default: break; } // end switch return(error); // return error code to operating system } // end main [Wen]: If getting into GAME EXIT state, it is time to kill everything. On the next loop iteration, the code will fall out of the main while and exit back to the OS.