Download presentation
Presentation is loading. Please wait.
1
项目:贪吃蛇游戏设计 工作任务三:块类(Block)设计 工作任务四:蛇类(Snake)设计
常州工程职业技术学院 计算机技术系
2
工作任务三:Block类 块(Block)类分析
在贪吃蛇游戏中,块用来构成蛇,在蛇出现时,要把构成蛇的块一个个输出(显示),在蛇消失时,要把块消除掉,显示和消除哪一个块都要由位置决定,并且由于蛇是由多个块构成的,为了区分,每个块要有一个序号。 《C#程序设计》
3
块(Block)类 1)字段: private int number; private Point origin; 2)属性:
public int Number public Point Origin 3)方法: public void Display(Graphics g) public void UnDisplay(Graphics g) 《C#程序设计》
4
块(Block)类实现 1)字段和属性 字段origin和属性Origin的类别是Point结构;
字段number和属性Number都是整型数据。 2)方法 ⑴Display方法 ①功能:在显示器上画一个空心正方形(代表一个块) ②设计思路:直接在场地(窗体)上画一5*5的空心正方形。 ⑵UnDisplay方法 功能:把显示在显示器上的块(空心正方形)给消除掉。 实现:在原位置重新画块(空心正方形)。与上面不同的是,用背景颜色重新画,消除了原来的块。 《C#程序设计》
5
Pen类 定义用于绘制直线和曲线的笔对象。 构造函数之一为:public Pen(Color);
如:Pen redPen=new Pen(Color.Red); 《C#程序设计》
6
工作任务四:Snake类 蛇(Snake)类分析 蛇由多个块组成,所以要包含一个整型数据,保存蛇头的编号即蛇的长度;
要有一个Point对象,保存蛇头的位置; 要有一个ArrayList对象,用于存放组成蛇的所有块; 蛇在场地运动,要用一个整型数据标识它的运动方向; 蛇要在场地中不断移动,如果蛇吃了豆,它自身要增长一块; 蛇的运行过程,就是蛇的不断显示过程; 在蛇消失时,要把块消除掉; 蛇运行过程中要不断地改变方向; 如果蛇头碰到了它自身,蛇就要死亡即程序结束。 《C#程序设计》
7
工作任务四:Snake类 蛇类要包含下列成员: 1)字段: ArrayList blockList ;
private int headNumber; private Point headPoint; private int score; private int direction = 1;//默认是向右 《C#程序设计》
8
工作任务四:Snake类 2)属性 public int Score public int HeadNumber
public Point getHeadPoint public bool getHitSelf public int Direction 3)构造函数 public Snake() public Snake(Point vertex, int count)//建立开始的蛇 《C#程序设计》
9
工作任务四:Snake类 4)方法: Display(Graphics g) UnDisplay(Graphics g)
TurnDirection(int pDirection) Growth() Reset(Point vertex, int count) 《C#程序设计》
10
工作任务四:Snake类 蛇(Snake)类实现 ⒈构造函数 public Snake(Point vertex, int count)
1)功能 根据游戏开始时蛇运动的默认方向和给定的参数,确定组成蛇的各块的位置,然后把各块添加到blockList中去;并初始化蛇的长度(蛇头的序数)字段headNumber 和蛇头位置字段headPoint 《C#程序设计》
11
工作任务四:Snake类 2)设计思路 首先创建一个ArrayList对象blockList,并实例化为count个元素,然后根据游戏开始时蛇运动的默认方向和给定场地位置参数vertex,确定蛇的开始位置,最后通过一个转count圈的循环,依次找到组成蛇的各块,把它们存入blockList数组中,其他字段赋值即可。 创建ArrayList对象并实例化: blockList=new ArrayLis(count); 开始蛇的第一块位置: Point p = new Point(vertex.X + 25, vertex.Y + 25); 《C#程序设计》
12
工作任务四:Snake类 创建块并给属性赋值如下: Block bb=new Block(); bb.Origin=p;
bb.Number=i+1;//从蛇尾开始序号 把块添加到blockList中: blockList.Add(bb); 《C#程序设计》
13
工作任务四:Snake类 《C#程序设计》
14
工作任务四:Snake类 《C#程序设计》
15
工作任务四:Snake类 2.属性 在蛇类中,有4个字段,其中字段blockList、direction和headNumber只在蛇类内部使用,所以不必设置与它对应的属性。但为了判断蛇是否碰撞到它自身,增加了一个只读属性getHitSelf属性,故设置了二个属性。 1) getHeadPoint属性 在蛇类外只需要读取headPoint字段的值,把它的属性设计为只读属性 《C#程序设计》
16
工作任务四:Snake类 2) getHitSelf属性
设置此属性的目的是判断蛇在运行过程中是否碰撞到了它自身,如果蛇碰撞到了它自己,蛇就死亡,游戏结束。在这个属性中,只要读取结果,所以设计成只读属性。 ⑴设计思路 通过一个循环,遍历所有组成蛇的块,判断非蛇头块的位置是否与蛇头的位置相同,如果有相同的,就是蛇碰撞到它自身,否则,没有碰撞到它自身。因为要遍历整个blockList字段中保存的组成蛇的所有块,所以要用IEnumerator 接口。 《C#程序设计》
17
工作任务四:Snake类 知识点介绍:IEnumerator 接口 支持对非泛型集合的简单迭代。
命名空间:System.Collections 程序集:mscorlib(在 mscorlib.dll 中) 枚举数可用于读取集合中的数据,但不能用于修改基础集合。 最初,枚举数定位在集合中第一个元素前。Reset 方法还会将枚举数返回到此位置。在此位置,调用 Current 属性会引发异常。因此,在读取 Current 的值之前,必须调用 MoveNext 方法将枚举数提前到集合的第一个元素。 《C#程序设计》
18
工作任务四:Snake类 在调用 MoveNext 或 Reset 之前,Current 返回同一对象。MoveNext 将 Current 设置为下一个元素。 如果 MoveNext 越过集合的末尾,则枚举数将被放置在此集合中最后一个元素的后面,而且 MoveNext 返回 false。当枚举数位于此位置时,对 MoveNext 的后续调用也返回 false。如果最后一次调用 MoveNext 返回 false,则调用 Current 会引发异常。若要再次将 Current 设置为集合的第一个元素,可以调用 Reset,然后再调用 MoveNext。 《C#程序设计》
19
工作任务四:Snake类 判断组成蛇的其他块与蛇头的位置是否相同,可用Point.Equals(point headPoint)方法,如果结果为true,两块的位置相同,否则两块的位置不同。 定义一IEnumerator接口变量myEnumerator,并由blockList的GetEnumerator方法初始化它。 IEnumerator myEnumerator=blockList. GetEnumerator(); 读取myEnumerator的Current属性来获得当前元素: Block b = (Block)myEnumerator.Current; 《C#程序设计》
20
工作任务四:Snake类 说明: 本属性也可以定义成方法,基本原理相同。这里将它处理成属性,只是为了让大家了解属性不仅能完成对字段的存取处理,也可以完成其它功能。 《C#程序设计》
21
工作任务四:Snake类 3.方法 在蛇类中,相比较而言方法都比较复杂,所以这部分是蛇类的重点。 1)蛇显示方法(Display)
⑴功能:在蛇的运行过程中显示蛇。 ⑵设计思路:把显示在场地上蛇的最后一块消除掉,且把蛇原来的最后一个块从blockList中移出,然后遍历blockList中的所有块,把它们输出,当找到头块,根据当前的运动方向,在头块前增加一个新块,作为新的头块,并显示它,最后显示原头块。 《C#程序设计》
22
工作任务四:Snake类 BlockList是ArrayList对象,可以通过访问数组的方法来访问,把它的第一个元素读出并给块b。
b=(Block)blockList(0); 从blockList中移出(消除)第一个元素用它的RemoveAt(元素索引号)方法。 blockList.RemoveAt(0); 由于蛇尾块被消除了,blockList中各块的序数要依次改变为它原来的序数减1,所以在遍历其他块找蛇头时,要把每块的序数属性取出处理。本方法是显示蛇方法,不管是新块还是老块都要显示出来。 《C#程序设计》
23
工作任务四:Snake类 《C#程序设计》
24
工作任务四:Snake类 2)蛇消除方法(UnDisplay) 当蛇死亡即程序结束后,如果要重新开始,必须把死蛇给消除掉,就要用此方法。
⑴功能:消除场地上的死蛇。 ⑵设计思路:通过循环,遍历整个blockList,调用块的消除方法UnDisplay把场地上的死蛇消除掉。 《C#程序设计》
25
工作任务四:Snake类 《C#程序设计》
26
工作任务四:Snake类 3)转向方法(TurnDirection) ⑴功能:根据当前蛇的运行方向和传递来的参数来设置蛇的新运动方向。
⑵设计思路 根据蛇原来的运动方向(direction),结合键盘的上、下、左、右键的按键操作,利用多分支语句(switch),分别判断蛇的最终运动方向。 《C#程序设计》
27
工作任务四:Snake类 4)蛇生长方法(Growth) ⑴功能:当蛇吃到一粒豆后,蛇就要在它的当前头前增加一块即蛇增长。 ⑵设计思路
找到蛇头,根据蛇的运行方向,在蛇头前面增加一个块。即通过一个循环,遍历blockList中的各块,找到蛇头,然后在它前面增加一块。遍历blockList中各块的方法与上面getHitSelf属性中相同;在蛇头前增加一块的位置由原来的蛇头块位置和蛇的运动方向决定。 《C#程序设计》
28
工作任务四:Snake类 《C#程序设计》
Similar presentations