1homebackfirstprevnextlast本节目标•本节课即将学习–贪食蛇游戏实现原理–MVC设计模式2homebackfirstprevnextlast贪食蛇游戏•游戏规则–方向键控制黑色小蛇前进–碰到四周的墙壁、自己的身体游戏结束–只能前进、左转、右转,向回走会碰到自己,立即“死亡”–蛇头经过红色的食物,会吃掉食物;每次吃掉食物,得一分,蛇的长度会增加一节3homebackfirstprevnextlast贪食蛇游戏•游戏原理–Snake角色,是黑色的一个小方块,代表蛇身体的一节,蛇身是由多节组成的;通过Snake角色的“图章”功能来绘制蛇身–Eraser角色,是白色的一个小方块,大小和Snake角色相同;其颜色和背景色相同,利用Eraser角色的“图章”功能可擦除蛇身–food角色,是红色的一个小方块,代表食物,大小和Snake角色相同4homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–蛇是本游戏的主角,其实现方式是游戏设计的核心–其设计可分为模型和视图两部分模型负责蛇的内部数据表示视图负责蛇的界面显示5homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–蛇的模型蛇身由多节组成,每节在屏幕上都有一个坐标(x,y)用链表listX,listY代表蛇身体每节的坐标位置,listX存放横坐标x,listY存放纵坐标y,两个链表长度相等如果蛇身长4节,则listX,listY的长度都是4蛇身长度增加一节,通过在listX,listY中各增加一个数据来实现蛇身前进一步:根据前进方向,确定蛇头要进入的位置的坐标,假如是(x1,y1),那么将x1插入到listX的第一项,将y1插入到listY的第一项,然后删除listX,listY的最后一项就可以了6homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–蛇的视图通过将snake角色移到链表listX,listY中每个元素对应的位置绘制图章,就可以逐节绘制蛇身右边代码就完成上述功能7homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–为了提高效率,并不需要每次都要绘制整个蛇身–程序开始时绘制完整的蛇身–以后每次前进,只有蛇头和蛇尾发生变化,因此只要绘制新的蛇头,擦除原来的蛇尾就可以了–右边代码实现绘制蛇头,变量headX和headY代表蛇头的横坐标和纵坐标8homebackfirstprevnextlast贪食蛇游戏•eraser角色代码,实现擦除蛇尾–程序开始时,角色隐藏–链表listX,listY代表蛇身体每节的坐标位置–收到“清除尾格”消息后,将链表listX,listY最后元素取出,得到蛇尾即蛇身体最后一节的坐标,将角色移动到蛇尾位置,利用图章功能,将蛇尾一节绘制为背景色,实现视图中蛇尾被擦除一节的效果。删除链表listX,listY最后元素,从模型中删除蛇尾–变量i是局部变量,可以避免使用全局变量可能导致的和其他角色脚本的冲突9homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–变量direct代表蛇前进的方向:0-向上;1-向右;2-向下;3-向左–右边代码实现通过上下左右方向键来改变蛇前进的方向10homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–主控程序1、绘制游戏区域边框2、得分清0,建立snake链表模型listX,listY,绘制蛇完整身体3、将游戏开始标志变量running设置为111homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–主控程序4、重复执行,进入游戏1)前进一步,根据前进方向修改蛇头坐标headX,headY,如果蛇头碰到边框或蛇身,将变量running设为02)如果running为0显示游戏结束,程序停止3)否则,将新的蛇头坐标插入链表listX,listY第一项12homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–主控程序4、重复执行,进入游戏4)绘制蛇头5)如果蛇头和食物位置相同,广播吃掉食物消息,使食物food角色改变到新位置出现。这样因为蛇头增长,蛇身变长一节6)否则,广播清除尾格消息,擦除蛇尾,抵消蛇头增长的一节,使蛇身长度不变,但前进一步13homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–绘制边框消息处理程序绘制边长为60的绿色正方形,正方形中心在(0,0)14homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–游戏准备消息处理程序得分清0链表listX,listY清空方向向上插入10个坐标到listX,listY,代表初始长度为10节的蛇身,(0,9)(0,8)(0,7)…(0,0)绘制完整蛇身15homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–前进一步消息处理程序1)根据前进方向修改蛇头坐标2)如果蛇头碰到边框,即坐标绝对值等于30,将变量running设为0,代表游戏结束16homebackfirstprevnextlast贪食蛇游戏•Snake角色代码–前进一步消息处理程序3)检查蛇头位置是否与某一节蛇身位置重合,如果是,则将变量running设为0,代表游戏结束17homebackfirstprevnextlast贪食蛇游戏•food角色代码–变量foodX,foodY代表角色的坐标–程序开始时,将食物显示在(-5,3)这个位置–收到“吃掉食物”消息后,将食物隐藏,得分加1,0.5秒后,在游戏屏幕范围内随机选择一个位置,将食物重新显示出来18homebackfirstprevnextlast设计模式•设计模式(Designpattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结•使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性等•学习设计模式可以快速提高自己的程序设计能力和水平19homebackfirstprevnextlastMVC设计模式•使用MVC设计模式的应用程序被分成三个核心部件:模型、视图、控制器–M(Model)是指数据模型、数据结构代表问题在计算机内部的描述方式–V(View)是指视图、用户界面代表问题展现给用户的方式–C(Controller)是指控制器代表视图和模型之间交互、互动的方式20homebackfirstprevnextlastMVC设计模式•视图–视图是用户看到并与之交互的界面–在视图中其实没有真正的处理发生,视图只是作为一种输出数据、并允许用户操纵程序的方式–MVC一个大的好处是它能为你的应用程序处理很多不同的视图;例如网络游戏,不同玩家面对自己机器的视图可能不同,但能协同一致进行游戏,关键在于模型是相同的21homebackfirstprevnextlastMVC设计模式•模型–模型表示数据和业务规则–一个模型能为多个视图提供数据–在MVC的三个部件中,模型拥有最多的处理任务22homebackfirstprevnextlastMVC设计模式•控制器–控制器接受用户的输入并调用模型和视图去完成用户的需求–当用户通过人机界面作出操作时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据23homebackfirstprevnextlastMVC设计模式•MVC设计模式的优点–M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如一批统计数据你可以分别用柱状图、饼图来表示–C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新视图控制器模型交互交互用户操作模型模型修改刷新显示24homebackfirstprevnextlastMVC设计模式的启示•设计一个程序要考虑如下几方面的问题–模型怎样设计?内部用何种数据结构表示和描述问题–界面如何展现?怎样将模型数据直观的展现或绘制出来–怎样保持模型和界面的一致?如何根据用户的操作或程序运行的进展修改模型,模型改变后怎样通知界面刷新显示25homebackfirstprevnextlastMVC设计模式的启示•模拟时钟程序设计–模型怎样设计?内部用shi、fen、miao三个变量描述时间–界面如何展现?根据shi、fen、miao变量确定时针、分针和秒针的旋转角度–怎样保持模型和界面的一致?定时修改模型,每隔1秒miao加1,每隔1分钟fen加1,每隔1小时shi加1;分、秒采用60进位,到59后下一次归0,小时到11后,下一次归026homebackfirstprevnextlastMVC设计模式的启示•迷宫地图绘制部分程序设计–模型怎样设计?内部用链表map描述地图–界面如何展现?根据链表map绘制地图,数据为1绘制绿色通道,数据为0显示白色障碍–怎样保持模型和界面的一致?用户点击屏幕,同时修改链表map和界面显示27homebackfirstprevnextlast总结•本节课即学习了–贪食蛇游戏实现原理–MVC设计模式