贪吃蛇课程设计报告_第1页
贪吃蛇课程设计报告_第2页
贪吃蛇课程设计报告_第3页
贪吃蛇课程设计报告_第4页
贪吃蛇课程设计报告_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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文件,我机器虚拟机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的数字。三

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论