贪吃蛇课程设计报告.doc

上传人:小小飞 文档编号:3293116 上传时间:2019-08-08 格式:DOC 页数:15 大小:114.01KB
返回 下载 相关 举报
贪吃蛇课程设计报告.doc_第1页
第1页 / 共15页
贪吃蛇课程设计报告.doc_第2页
第2页 / 共15页
贪吃蛇课程设计报告.doc_第3页
第3页 / 共15页
贪吃蛇课程设计报告.doc_第4页
第4页 / 共15页
贪吃蛇课程设计报告.doc_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《贪吃蛇课程设计报告.doc》由会员分享,可在线阅读,更多相关《贪吃蛇课程设计报告.doc(15页珍藏版)》请在三一文库上搜索。

1、本 科 课 程 设 计贪吃蛇游戏设计摘要2Abstract3一详细设计31.属性解释32.初始化坐标:33.调用线程44.具体功能实现:44.1.移动功能的实现:44.2.吃食物功能实现:54.3.判断游戏是否结束的功能实现:74.4.画图方法的实现84.5.监听键盘动作:95.界面的设计:105.1进入程序界面设计105.2第2个界面的设计:105.3第3个界面设计:116.把程序植入手机中12二字符设备驱动程序实现12三总结:13四参考文献:13五 致谢14摘要程序核心思想:运行程序首界面(进入游戏,退出游戏)进入游戏后选择难度(简单,普通,高难)根据不同的难度设置相应的属性。进入游戏界面

2、。首先初始化蛇的坐标,食物的坐标,和障碍物的坐标。然后获取当前屏幕的大小为将来的边界判断做准备。然后创建并执行线程。线程基本流程:判断是否是暂停阶段,如果没有暂停就执行:eatFood();move(direction); repaint();如果游戏结束了就重新游戏或者退出。 AbstractCore of the process: first running the program interface (into the game, withdraw from the game) into the game after the difficult choice of (simple, or

3、dinary, highly difficult) depending on the difficulty of setting the corresponding attribute. Into the game interface. First initialize the coordinates of the snake, coordinates food, and the coordinates of obstructions. And access to the size of the current screen for the future of the border to pr

4、epare for judgement. And then create and execution threads. Thread the basic process: determine whether the stage is suspended, if not the moratorium on the implementation of: eatFood (); move (direction); repaint (); game to an end if the game or out on the re.一详细设计1.属性解释用1个2维数组snake2002存放蛇身坐标,第2维是

5、0的时候代表横坐标,为1的时候为纵坐标。第1维数字代表蛇身方块的数字,例如snake00 就代表蛇头的横坐标snake11就代表第2个方块的总坐标。snakeNum为蛇的长度(以方格为单位)。SNAKEWIDTH为方格大小。direction;为移动方向,zhangai0x,zhangai1x,zhangai2x,zhangai3x,zhangai0y,zhangai1y,zhangai2y,zhangai3y,为障碍物的坐标。foodx,foody为食物的坐标。isPaused为判定是否是暂停状态,true为暂停false为非暂停。A为难度系数,a可以为1,2,3。1的时候最难,3的时候最简

6、单。SLEEP_TIME为系统沉睡时间,其值越小速度越快。2.初始化坐标: isPaused = true; / 设置游戏开始为暂停状态 snakeNum = 7; /设置蛇身长度7个方格/ 循环依次初始化蛇身没个方格的坐标,蛇头的坐标为(100,40) for(int i = 0;i 0;i-) snakei0 = snakei - 10; snakei1 = snakei - 11; /蛇头坐标的移动 switch(direction) case DIRECTION_UP: snake01 = snake01 - SNAKEWIDTH; break; case DIRECTION_DOWN

7、: snake01 = snake01 + SNAKEWIDTH; break; case DIRECTION_LEFT: snake00 = snake00 - SNAKEWIDTH; break; case DIRECTION_RIGHT: snake00 = snake00 + SNAKEWIDTH; break; 坐标移动的总体思想:1. 蛇身的移动:移动的时候,后面的方格要到前面方格的位置,也就是要让后面的方格的坐标变成前面方格的坐标。即把前面方格的坐标赋值给后面的方格坐标。就是让最后方格的坐标变成倒数第2个方格的坐标,倒数第2个方格坐标变成倒数第3个方格坐标,依次类推直到第2个方格

8、变成第1个方格的坐标。这样我们循环都最后还没有第1个方格的坐标,所以我们另将蛇头的坐标赋值。2. 蛇头的移动:这和蛇当前移动的方向有关,以向上移动为例,那蛇头的坐标应该横坐标不变,纵坐标减去方格的长度,因为在屏幕上左上点为(0,0)越往左横坐标越大,越往下纵坐标越大。所以向上移动纵坐标要减小。其他方向的坐标运算如上述代码,也不难解释。注意:关于蛇身移动的循环for(int i = snakeNum - 1;i 0;i-) 他是先给后面的值赋值最后循环到正数第2个方格。开始我想反过来,从第2个开始赋值再循环都最后,实验的时候却和以前的方式运行结果不一样。移动的时候蛇不管有多长就只能看到2个方格在

9、移动。后来发现,我这样改是不对的,按照我的思路a10=a00;a20=a10;.仔细看后就发现我把a00的值赋给a10又把a10的值赋给a20,我样有值的覆盖,也就是我让蛇身的所有方格的值全是a00的,再家上蛇头移动后蛇头的新坐标,屏幕上就只有2个方格了。4.2.吃食物功能实现:private void eatFood() /判别蛇头是否和食物重叠 if(snake00 = foodX & snake01 = foodY) snakeNum+; generateFood(); /* * 产生食物 * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合 */ private void genera

10、teFood() while(true) foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1) / SNAKEWIDTH * SNAKEWIDTH; foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1) / SNAKEWIDTH * SNAKEWIDTH; zhangai0x=foodX+4*a; zhangai0y=foodY+4*a; zhangai1x=foodX+4*a; zhangai1y=foodY-4*a; zhangai2x=foodX-4*

11、a; zhangai2y=foodY+4*a; zhangai3x=foodX-4*a; zhangai3y=foodY-4*a; boolean b = true; for(int i = 0;i snakeNum;i+) if(foodX = snakei0 & snakei1 = foodY) b = false; break; if(b) break; 该功能的总体思路:如果蛇头的坐标和食物的坐标一样,也就是吃到了食物,蛇的长度+1并且产生新的食物。生成食物的方法:随机生成新的坐标赋值给食物坐标。并要保证随机生成的坐标在屏幕内而且随机生成的食物坐标不能和蛇身重合。生成新的食物后,在食物

12、周围生成新的障碍物坐标。随机产生食物坐标的方法:foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1) / SNAKEWIDTH * SNAKEWIDTH;说来惭愧直到现在我还是不明白为什么经过这样的运算后得到的坐标就一定在屏幕内。但我至少知道这样的运算可以得到必在屏幕内的坐标。4.3.判断游戏是否结束的功能实现: public boolean isGameOver() /边界判别 if(snake00 (width - SNAKEWIDTH) | snake01 (height - SNAKEWIDTH) return tru

13、e; /碰到自身 for(int i = 4;i (width - SNAKEWIDTH)呢?因为其坐标是方格左上顶点的坐标,当蛇头的左上顶点与屏幕右面相隔方格边长的时候,其实蛇头已经碰到屏幕的右边。4.4.画图方法的实现protected void paint(Graphics g) /清屏 g.setColor(0xffffff); /画笔设置成白色 g.fillRect(0,0,width,height); /把整个屏幕都绘制成白色 g.setColor(0); /把画笔再设置成黑色 /绘制蛇身 for(int i = 0;i snakeNum;i+) g.fillRect(snakei

14、0,snakei1,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai0x,zhangai0y,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai1x,zhangai1y,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai2x,zhangai2y,SNAKEWIDTH,SNAKEWIDTH); g.fillRect(zhangai3x,zhangai3y,SNAKEWIDTH,SNAKEWIDTH); /绘制食物 if(b) g.fillRect(foodX,foodY,SNAKEWIDTH,

15、SNAKEWIDTH); if(isGameOver() g.drawString(Game Over, 60, 60, Graphics.TOP | Graphics.LEFT); 总体思路:首先清空屏幕内的内容,然后画出当前的蛇,食物,障碍物,因为该方法是在线程中被循环调用的。每隔SLEEP_TIME就被执行1次,在循环中以为其他方法的调用,蛇,食物,障碍物的坐标是在变化的,这样在不停的绘画新坐标的过程中,就形成了动画效果。1.清空屏幕内容的方法:因为我们想画的蛇的颜色是黑色,我们先把画笔设置成白色,然后把整个屏幕都绘制成白色,因为没画东西的时候屏幕也是百的,这样我们看到屏幕中就什么也没有

16、了。然后我们再把画笔设置成黑色,画将要画的内容。2.绘制方格的方法:利用fillRect(a,b,c,d)方法进行绘制。a,b为方格的左上顶点坐标,c为以(a,b)为顶点的长度,d为高度,画完的结果就是以(a,b)为左上顶点,c为长度d为高度的矩形被画笔添满颜色,因为我们设置的画笔颜色为黑色,所以我们看到的是全黑的方格。3.在屏幕中显示字体的方法:drawString(Game Over, 60, 60, Graphics.TOP | Graphics.LEFT)第1个参数为要写字的内容,第2,3个参数是显示的坐标位置,第4个参数是用来确定原点,这我也是从网上查到的。在Graphics类里pu

17、blic static final int LEFT=4; public static final int TOP=16;还有其他类似的值都是2的N次方。这样做的目的就在于,当两个或多个锚点定位方式通过位与的方法计算后,根据这个计算得到的和可以还原回参与位与计算的各个数值,从而得到有几种锚点定位方式,然后J2ME根据还原回的值来设置锚点的位置。4.食物闪现:在绘画食物的时候if(b) g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH); 只有b是真值的时候才画方格,也就是b是假值的时候是不画的。这样做是因为在线程中每循环1次就执行1次b=!b;这样b的值

18、在真与假之间来回变化,食物也在屏幕中出现,不出现,出现,不出现,这样就形成了食物闪烁的效果。与障碍形成对比,使用户看的更方便。4.5.监听键盘动作:public void keyPressed(int keyCode) int action = this.getGameAction(keyCode); /改变方向 switch(action) case UP: if(direction != DIRECTION_DOWN) direction = DIRECTION_UP; break; case DOWN: if(direction != DIRECTION_UP) direction =

19、DIRECTION_DOWN; break; case LEFT: if(direction != DIRECTION_RIGHT) direction = DIRECTION_LEFT; break; case RIGHT: if(direction != DIRECTION_LEFT) direction = DIRECTION_RIGHT; break; case FIRE: /暂停和继续 isPaused = !isPaused; break; 用getGameAction(keyCode)方法获取当前对键盘的操作,以上为例case UP: if(direction != DIRECT

20、ION_DOWN) direction = DIRECTION_UP; break;首先想要蛇移动的方向变成上,要判断当前蛇的移动方向是否是向下,因为当蛇是向下移动的时候,不能让蛇变成向下移动,所以要想蛇想上移动,要先判断蛇当前移动的方向不是向下。5.界面的设计:5.1进入程序界面设计执行程序首先进入的界面进入游戏和退出游戏的选择。如果进入进入第2个界面,如果退出就退出程序。private TextBox textbox; /定义匡private Command enter; /定义按狃private Command exit;enter=new Command(Enter,Command.O

21、K,1); /设置按狃信息exit=new Command(Exit,Command.OK,1);textbox=new TextBox(SnakeGame,40,0); /设置文本匡textbox.addCommand(enter); /添加按钮到匡里textbox.addCommand(exit);textbox.setCommandListener(this); /监听public void commandAction(Command arg0,Displayable arg1) if(arg0=enter) display.setCurrent(textbox2); if(arg0=e

22、xit) destroyApp(false); notifyDestroyed(); 5.2第2个界面的设计:选择难度(简单,普通,高难)然后进入相应的难度游戏TextBox textbox2;Command jiandan;Command putong;Command gaonan;jiandan=new Command(jiandan,Command.OK,1);putong=new Command(putong,Command.OK,1);gaonan=new Command(gaonan,Command.OK,1);textbox2=new TextBox(nanduxuanze,40

23、,0);textbox2.addCommand(jiandan);textbox2.addCommand(putong);textbox2.addCommand(gaonan);textbox2.addCommand(exit);textbox2.setCommandListener(this);if(arg0=gaonan) displayable.setA(1); display.setCurrent(displayable); if(arg0=putong) displayable.setA(2); display.setCurrent(displayable); if(arg0=jia

24、ndan) displayable.setA(3); display.setCurrent(displayable);5.3第3个界面设计:在游戏中可以修改游戏难度,游戏结束的时候可以重新游戏,可以 随时推出游戏。private Command restart;restart=new Command(Restart,Command.OK,1);displayable.addCommand(gaonan); / displayable是执行游戏类的对象displayable.addCommand(putong);displayable.addCommand(jiandan); displayab

25、le.addCommand(restart);displayable.addCommand(exit2);displayable.setCommandListener(this);/想要重新游戏,就想设置当前游戏结束,重新初始化数据即restart()方法,然后在开始游戏if(arg0=restart) displayable.setGameOver(); displayable.restart(); display.setCurrent(displayable);其中display=Display.getDisplay(this);然后对display对象使用display对象是获取当前Di

26、splay的信息,我们可以理解成display对象现在盛放的是1个像框SnakeCanvas displayable = new SnakeCanvas(); SnakeCanvas类中是相关于游戏本身的程序Displayable对象现在可以理解成盛放的是相片内容display.setCurrent(displayable); 这样我们就可以理解成把相片里的内容放进像框里。6.把程序植入手机中如何把程序传进手机使起运行:由于实验是前几天做的,现在有些细节忘记了,只能凭印象写了。1. 打开WTK2.5.2。2. 创建1个package,包的名字可随意起但下面的要起成继承MIDlet的类名。3.

27、点击创建右面的名字忘记了,设置第1个菜单为custerm下面什么忘记了选2.0然后OK。4. 然后把程序的workspace中的src文件下的代码复制到WTK中的src下。具体位置在C盘,什么什么SET。具体名字忘了,然后选J2ME。,然后apps,然后好象就能看到src目录了。5. 然后build一下,然后在上面有个按钮名字忘了,点完之后有个创建package。6. 在WTK下的bin文件下就能找到转化好的jar文件,把他拷贝到手机就可以运行了。二字符设备驱动程序实现实验题目:字符设备驱动程序实验目的:实现嵌入式Linux系统下的字符设备驱动程序,要求动态生成设备号,并在测试程序中,通过超级

28、终端分行显示数039,可参考demo驱动程序实验过程。上述过程需在板子端进行,执行动态加载驱动,并通过超级终端监视测试程序运行结果。实验过程:1. 打开虚拟机,新建终端,找到demo文件Up-techpxa270-exp-drives-01.-找到demo 文件2. 输入以下命令vi demo.c vi demotest.c,可以查看目录,修改输入数字的个数和方式,里面有个错误,就是主设备号那没有返回值,需要修改。修改方法只需要把上面那的返回代码,一样的写1遍。3. 输入命令make 生成.o文件。4. 连接好扳子,打开超级终端。5. 挂载虚拟机那边的 up-techpxa270文件,我机器虚

29、拟机IP为192.168.0.123挂载到mnt目录下。 具体命令:mount o nolock 192.168.0.123:/up-techpxa270/ /mnt6. mnt-exp-drives-01.-找到demo.o文件7. 创建目录 mkdir /dev/demo8. 创建节点 mknod /dev/demo c 254 09. 加载驱动 insmod demo.ko10. 执行程序 . / demotest即可完成实验要求,显示出0到39的数字。三总结:我想要写出好的程序,需要我们有扎实的基础,这样遇到一些基本算法的时候可能就会游刃有余了。在编程是我们要有丰富的想象力。不要拘泥于

30、固定的思维方式,遇到问题的时候要多想几种解决问题的方案,试试别人从没想过的方法。丰富的想象力是建立在丰富的知识的基础上,所以我们要通过多的途径来帮助自己建立较丰富的知识结构。 在编程是我们碰到了很多的困难,这就需要我们多与别人交流。三人行必有我师,也许在一次和别人不经意的谈话中,就可以迸出灵感的火花。在编程的过程中我们也看到了有良好的编程风格是十分重要的,至少在时间效率上就体现了这一点。养成良好的习惯,代码的缩进编排,变量的命名规则要始终保持一致,这些都是提高我们编程的注意点。 还有在变成中最能体现简单的原则。所以我们要思考讨论简单的程序,这样简单的方法更容易被人理解,更容易实现,也更容易维护

31、。遇到问题时要优先考虑最简单的方案,只有简单方案不能满足要求时再考虑复杂的方案。四参考文献:1.作者:袁然 郑自国 邹丰义 书名:Java案例开发集锦 出版地:北京市天竺颖华印刷厂 出版社:电子工业出版社 出版时间:2006年5月第2次印刷2. 作者:张怀庆书名:Java案例精粹150例出版社:冶金工业出版社出版时间:2005年3月第1版3. 作者:荣钦科技 编著书名:Java 2 游戏设计出版社: 清华大学出版社出版时间:2004年11月第1版 五 致谢首先要感谢交我们嵌入式课程的魏巍老师,正是他对我们平时的严格要求,我才能学到那么多的知识。刚开始接触这门课,我感觉学的很吃力,正是老师通俗,幽默的讲课方式帮我一步步的克服困难。老师平时非常的辛苦,每天备课都要做到很晚,平时讲课的时候又是那么的认真,争取要我们没个同学都能听明白,我们都深深的为止感动,为拥有这样的好老师感到骄傲。然后我还要感谢我们的班主任赵晶莹老师,她对我们班总是那么尽心尽力,经常给我们开班会,了解我们的情况,再给予指导。她讲授的课也是没个知识点老师都不厌其烦的讲很多遍。希望我们都能听明白。每次考试的时候,老师都是给我们复习考试的重点,提醒我们考试的细节。我还要感谢胡钰璋和禹睿枫同学在课程设计期间对我的帮助。他们也要做自己的课程设计,但我次有困难的时候,他们都马上给我帮助。我也为有这样的同学感到高兴。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 信息产业


经营许可证编号:宁ICP备18001539号-1