J2ME设计论文--益智拼图游戏.doc_第1页
J2ME设计论文--益智拼图游戏.doc_第2页
J2ME设计论文--益智拼图游戏.doc_第3页
J2ME设计论文--益智拼图游戏.doc_第4页
J2ME设计论文--益智拼图游戏.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计II -J2ME课程设计论文题 目:益智拼图游戏学 院:计算机与信息工程学院专 业:计算机科学与技术班 级:计算机06-7班姓 名:梁淑媛学 号:26起止时间:2008.12.21-2008.12.31 成绩: 课程设计成绩评定表质量评价指标(在相应栏目打)评 价 项 目评 价 质 量优秀良好一般及格不及格工作量和态度实验、计算可靠性文字和图表质量程序完成情况总体评价评定成绩评定人员签名2008年12月31日IV课程设计任务书一、设计题目:益智拼图游戏二、设计内容:要实现的是一个简单的拼图游戏。这个拼图游戏是一个33的拼图,由9个分割的小图片构成。这样,在手机上,可以用按键1-9对应每个图片。需要移动某个图片时,只需按下对应的数字键即可,在拼图的过程中,按下0键时,可以显示整个原始图片。三、设计要求:1本游戏采用MVC(Model-View-Controller)模式来编写,这样可以使得整个应用程序的不同功能部分被分离开来,从而降低开发难度。在MIDP程序中,MIDlet起着Controller的作用,每个Screen或者Canvas就是一个View,而Model可以用一个单独的类来表示,用于存储程序运行中的数据。2本文就是要制作图片拼图板益智游戏,这个游戏提供了两个图片拼图。在这个拼图板益智游戏中,玩家通过数字键来移动相应的方格,当拼成一幅完整的图片时则会发出通过的提示音,并在游戏画面中显示出本次拼图玩家所花费的移动步数。在游戏名称方面,由于这个游戏是以图片作为拼图板进行游戏的,因此就取名叫做picPuzzle。四、工作计划:时间完成内容提交文档备注第1天查找资料,确定题目,选择方案课程设计任务书设计准备阶段第2天第3天题目分析,设计算法算法描述设计阶段第4天功能模块的划分和设计结构流程图等第5天第6天实现具体数据结构和模块无第7天程序设计与调试无运行并验证程序功能第8天第9天检查程序第10天整理材料,撰写论文课程设计论文指导教师: 王艳涛 陈伟 高辉 教研室主任: 2008 年 12月31 日II 本科课程设计论文摘 要介绍了一个基于J2ME的手机趣味拼图游戏开发的全过程,MIDP规范的出现使得我们在手机上开发Java游戏成为可能。今天我们要实现的是一个简单的拼图游戏。这个拼图游戏是一个3x3的拼图,由9个分割的小图片构成。这样,在手机上,可以用按键1-9对应每个图片。需要移动某个图片时,只需按下对应的数字键即可。从游戏前的准备到主要类和接口的实现,最后运行、调试和打包。关键词:J2ME ,拼图游戏,API10目 录课程设计成绩评定表II课程设计任务书III摘 要II目 录III1 设计内容12 设计过程12.1设计方案的论证12.2概要设计12.3界面设计图22.4代码实现43 设计总结9参考文献10附录:程序源代码101 设计内容要实现的是一个简单的拼图游戏。这个拼图游戏是一个33的拼图,由9个分割的小图片构成。这样,在手机上,可以用按键1-9对应每个图片。需要移动某个图片时,只需按下对应的数字键即可,非常方便(当然,对于键盘不规则的手机,就只能委屈了),在拼图的过程中,按下0键时,可以显示整个原始图片。2 设计过程2.1设计方案的论证随着支持Java的手机迅速普及,手机软件的需求量日益暴涨。据最新职位调查,手机软件开发人员已成为急缺人才。J2ME由于开发速度快、周期短、支持手机多及开发资源丰富等优点成为当今最受欢迎的手机软件开发平台。然而很多人对手机软件开发不甚了解,甚至觉得神秘莫测。为此写了基于J2ME的手机趣味拼图游戏。要制作出像图1这样的图片拼图板益智游戏,这个游戏提供了两个图片拼图,当然,也可添加自己喜欢的图片来作为拼图图片。在这个拼图板益智游戏中,玩家通过数字键来移动相应的方格,当拼成一幅完整的图片时则会发出通过的提示音,并在游戏画面中显示出本次拼图玩家所花费的移动步数。在游戏名称方面,由于这个游戏是以图片作为拼图板进行游戏的。2.2概要设计本程序共有7个java源文件:DrawPanel : 控制整个游戏的生命周期。 DrawCanva: 绘制游戏的主窗口。 Document: 存储游戏运行中的数据。 SelectTileModel: 选择游戏拼图清单。BackDropTiledLayer:控制图片移动CharacterSprite:图片角色控制RightPanel:实现画布的监听2.3界面设计图经过进一步的分析设计,得到系统的框图如下所示。(1)初始化启动界面(如图所示)进入初始化启动主程序界面,我们将看到一个包含函数DRAWPANEL和一个启动按钮的界面,它通过调用主函数得到。在MIDP程序中,MIDlet起着Controller的作用,每个Screen或者Canvas就是一个View,而Model可以用一个单独的类来表示,用于存储程序运行中的数据。(2)拼图界面(如图所示)进入初始化启动界面后按启动按钮,进入拼图的主界面。按上下左右按钮就可以进行拼图游戏了,这是程序主界面。当按下推出按钮时回到启动界面。户通过MainCanvas输入命令后(例如,按下某个键),将可能引起Document数据的更新,如果需要更新屏幕,则Document应通知View更新显示,这是一个Observer模式的应用。重绘游戏画面绘制游戏的主窗口存储游戏中的数据选择游戏拼图清单游戏拼图进行交换控制整个游戏的生命周期图 1系统结构框图 2.4代码实现设计Document类Document类需要保存游戏运行中所有的状态数据,对于这个拼图游戏来说,我们设计以下成员变量: Updatable updatable; int state; Image images = new Image9; int current = new int33; int hiddenX, hiddenY; int steps; / 移动的步数DrawCanvas需要实现Updatable接口,因此,Document保存了一个View的引用,在恰当的时候,Document可以调用updatable.update()方法通知View需要重绘。这样,DrawCanva和Document就实现了Observer模式。游戏中,state用于存储游戏状态,一共有3种状态:PUZZLE_STATE:表示正在拼图;IMAGE_STATE:表示正在查看原始图片;FINISH_STATE:表示拼图完成。images数组按次序存储原始图片,我们把这个90x90大小的原始图片切割成9个30x30的小图片,并依次编号0-8:current33是一个二维数组,存储Image在images数组中的索引号,这样就可以从current中获得对应的Image对象。hiddenX和hiddenY用来标识空白方格的位置。仅当位于(hiddenX, hiddenY)上下左右的方格可以移动。初始化current为了打乱一个拼好的方格,我们需要一个算法来随机打乱9个方格。在我们想出这个算法前,最简单的方法便是用一个可拼好的数据来写死current,使得我们能集中精力先把游戏的框架搭起来:current = new int 2, 7, 5, 1, 0, 6, 4, 3, 8然后设定hiddenX=2, hiddenY=2,使得右下角current22的方格被隐藏。要取得某个方格对应的Image对象,我们用 public Image getCurrentImage(int x, int y) if( (x=hiddenX) & (y=hiddenY) ) return null; return imagescurrentxy; 对于位于(hiddenX, hiddenY)位置的方格,返回null表示不显示该方格。如何判断拼图是否完成。当current数组的内容按照0, 1, 2, 3, 4, 5, 6, 7, 8排列时,表示该拼图已经拼好,因此,判断代码非常简单: public boolean isFinish() for(int i=0; i3; i+) for(int j=0; j3; j+) if(currentij!=(i*3+j) return false; return true; 当用户移动某个方格时,Document接收方格位置(x, y)并负责判断能否移动,如果能,更新current的数据和hiddenX, hiddenY,并返回true表示数据已更新,否则返回false表示不可移动。 public boolean move(int x, int y) / 如果用户试图移动隐藏方格,直接返回false: if(hiddenX=x & hiddenY=y) return false; / 如果方格位于(hiddexX, hiddenY)的相邻位置, / 交换该方格(x, y)和(hiddenX, hiddenY)的相关数据: boolean moved = false; if( (x-1)=hiddenX) & (y=hiddenY) ) sweep(x, y); moved = true; if( (x+1)=hiddenX) & (y=hiddenY) ) sweep(x, y); moved = true; if( (x=hiddenX) & (y-1)=hiddenY) ) sweep(x, y); moved = true; if( (x=hiddenX) & (y+1)=hiddenY) ) sweep(x, y); moved = true; if(moved) steps+; if(isFinish() / TODO. updatable.update(); private void sweep(int x, int y) int temp = currentxy; currentxy = currenthiddenXhiddenY; currenthiddenXhiddenY = temp; hiddenX = x; hiddenY = y; 至此,Document类基本完成。Document不涉及任何显示功能,仅仅存储和更新数据,并在恰当的时候通知View更新显示。实现View在MIDP中,View就是Screen或者Canvas,在这个游戏中,我们应该使用Canvas,定义: public class DrawCanva extends Canvas implements CommandListener, Updatable . 在构造方法中,初始化Document: public DrawCanva(String imageName) / 读图像: Image images = new Image9; for(int i=0; i9; i+) try imagesi = Image.createImage(/image/ + i + .png); catch(IOException ioe) document = new Document(this, images, 2, 2); 在paint()方法中,DrawCanva从Document中获得数据,然后更新画面: protected void paint(Graphics g) g.fillRect(0,0,getWidth(),getHeight(); / 获得当前状态: int state = document.getState(); if(state=Document.PUZZLE_STATE) for(int x=0; x3; x+) for(int y=0; y3; y+) Image image = document.getImage(x, y); if(image!=null) g.drawImage(image, y*IMAGE_WIDTH, x*IMAGE_WIDTH, Graphics.LEFT|Graphics.TOP); else g.setColor(0x000000); g.fillRect(y*IMAGE_WIDTH, x*IMAGE_WIDTH, IMAGE_WIDTH, IMAGE_WIDTH); / draw line: g.setColor(0xffffff); for(int i=0; i=3; i+) g.drawLine(0, i*IMAGE_WIDTH, 3*IMAGE_WIDTH, i*IMAGE_WIDTH); g.drawLine(i*IMAGE_WIDTH, 0, i*IMAGE_WIDTH, 3*IMAGE_WIDTH); else / TODO. 当用户按下某个键时,DrawCanva的keyPressed()方法被执行,然后将用户输入数据传递给Document: protected void keyPressed(int keyCode) switch(keyCode) case KEY_NUM1: document.move(0,0); break; case KEY_NUM2: document.move(0,1); break; case KEY_NUM3: document.move(0,2); break; / case KEY_NUM4, 5, 6. 然后,Document可能更新自身内部状态,如果需要重绘画面,Document将调用update()回调方法来通知View更新画面。因此,DrawCanva必须实现Updatable接口的update()回调方法: public void update() repaint(); 至此,View已基本实现,我们再添加一个用作启动的MIDlet,即可实现整个游戏的基本框架。经过前面的工作,最后在集成编辑环境中,编写的程序代码见附录程序所示。3 设计总结本次简单的编程游戏成功完成,一个简单的拼图游戏,虽然很简单但是却可以学到很多东西,不仅是简单图片显示,还学会可整体的控制,还有游戏中,MIDlet起着Controller的作用,每个Screen或者Canvas就是一个View,而Model可以用一个单独的类来表示,用于存储程序运行中的数据。MVC有MVC1和MVC2两种模式,其不同之处在于Model能否主动通知View。在窗口程序中,Model可以主动通知View是否需要Update,因此应使用MVC1;在窗口程序中,View通常仅有一个,但Model可能有很多;而在Web程序中,Model通常被放在Session中,每个JSP页面都是一个View,因此View有很多。最后在调试的过程中,也遇到一些困难多亏了老师和同学们的帮助才能够顺利的编程工作才得以如期完成,我发现理论和实践之间还是存在一定的差距,要把理论知识灵活运用于实践才是最好的。在此次设计中我受益匪浅,我以后会好好学习的,让今天所学的深深印在脑海中,会更加的使自己更完善的理解知识,谢谢老师!参考文献 1 王珊、萨师煊面向对象系统概论. 北京.高等教育出版社.2006.2 张宏等. 面向对象程序设J2ME. 北京.科学出版社.1998.3 Inmon W H .面向对象库.北京.机械工业出版社,2000.4 Kimball R等.面向对象工具箱.北京. 电子工业出版社,2003.5 Imhoff C等.JAVA设计. 北京. 机械工业出版社,2004.6 Mattison R.Web Java工程与知识管理.北京.清华大学出版社,2003.附录:程序源代码package com.sunfruit.micro.framework;import javax.microedition.midlet.*;import javax.microedition.lcdui.Display;package com.sunfruit.micro.framework;import javax.microedition.lcdui.Form;import javax.microedition.lcdui.TextField;import javax.microedition.lcdui.StringItem;import javax.microedition.lcdui.Command;import javax.microedition.lcdui.CommandListener;import javax.microedition.lcdui.Displayable;import javax.microedition.lcdui.Font;public class DrawPanel extends MIDlet private Display display; private DrawCanva drawCanva; public DrawPanel() display=Display.getDisplay(this); drawCanva=new DrawCanva(false,this); (new Thread(drawCanva).start(); display.setCurrent(drawCanva); public Display getDisplay() return display; protected void destroyApp(boolean _boolean) throws MIDletStateChangeException protected void pauseApp() /* * startApp * * throws MIDletStateChangeException * todo Implement this javax.microedition.midlet.MIDlet method */ protected void startApp() throws MIDletStateChangeException public class BackDropTiledLayer extends TiledLayer private Vector selectVector = new Vector(); private int mapright=1,2,3,4,5,6,7,8,9,10,11,12; private MIDlet myMIDlet; public BackDropTiledLayer(int col, int row, Image image, int tileWidth, int tileHeight,MIDlet myMIDlet) super(col, row, image, tileWidth, tileHeight); this.myMIDlet=myMIDlet; init(); private void init() MicroRandom microRandom=new MicroRandom(12); int map=microRandom.createInts(); /int map=2,1,3,4,5,6,7,8,9,10,11,12; for (int i = 0; i =2) SelectTileModel selectTileModel1=(SelectTileModel)selectVector.elementAt(0); SelectTileModel selectTileModel2=(SelectTileModel)selectVector.elementAt(1); /第一个参数系 int col1=selectTileModel1.getSelectcol(); int row1=selectTileModel1.getSelectrow(); int tile1=selectTileModel1.getTileIndex(); /第二个参数系 int col2=selectTileModel2.getSelectcol(); int row2=selectTileModel2.getSelectrow(); int tile2=selectTileModel2.getTileIndex(); /交换 this.setCell(col1,row1,tile2); this.setCell(col2,row2,tile1); selectVector.removeAllElements(); g.setColor(255,255,255); g.fillRect(col1*32,row1*32,32,32); g.drawRect(col1*32,row1*32,32,32); g.fillRect(col2*32,row2*32,32,32); g.drawRect(col2*32,row2*32,32,32); checkRight(g); public SelectTileModel getSelectModel(int index) if(index=selectVector.size() return null; return (SelectTileModel)selectVector.elementAt(index); public void removeSelectModel(int index) selectVector.removeElementAt(index); public void paintSelectModel() for(int i=0;iselectVector.size();i+) SelectTileModel selectTileModel=(SelectTileModel)selectVector.elementAt(i); /System.out.println(RE:+selectTileModel.getSelectcol()+ +selectTileModel.getSelectrow(); setCell(selectTileModel.getSelectcol(), selectTileModel.getSelectrow(), selectTileModel.getTileIndex() + 6); public void paintSelectModel(Graphics g) for(int i=0;iselectVector.size();i+) SelectTileModel selectTileModel=(SelectTileModel)selectVector.elementAt(i); g.drawRect(getX()+selectTileModel.getSelectcol()*32,getY()+selectTileModel.getSelectrow()*32,32,32); private void checkRight(Graphics g) DynArrayInt dynArrayInt=new DynArrayInt(); for(int i=0;ithis.getRows();i+) for(int j=0;jthis.getColumns();j+) dynArrayInt.addInt(this.getCell(j,i); /开始比较 int maptemp=dynArrayInt.getAllInt(); boolean bool=true; for(int i=0;imaptemp.length;i+) if(maptempi!=maprighti) bool=false; break; if(bool) Display display=(DrawPanel)myMIDlet).getDisplay(); display.setCurrent(new RightPanel(myMIDlet); public class CharacterSprite extends Sprite public CharacterSprite(Image image) super(image); public CharacterSprite(Image image, int frameWidth, int frameHeight) super(image, frameWidth, frameHeight); public CharacterSprite(Sprite s) super(s); public class DrawCanva extends GameCanvas implements Runnable, CommandListener Graphics g = null; LayerManager layerManager = new LayerManager(); BackDropTiledLayer tiledLayer = null; int selectcol = 0; int selectrow = 0; private Command exitCommand; private MIDlet myMIDlet = null; public DrawCanva(MIDlet myMIDlet) this(true, myMIDlet); public DrawCanva(boolean suppressKeyEvents, MIDlet myMIDlet) super(suppressKeyEvents); g = getGraphics(); this.myMIDlet = myMIDlet; init(); initEvent(); private void initEvent() exitCommand = new Command(Exit, Command.EXIT, 1); this.setCommandListener(this); this.addCommand(exitCommand); private void init() try tiledLayer = new BackDropTiledLayer(4, 3, Image.createImage(getClass(). getResourceAsStream(/res/pic/101.png), 32, 32, myMIDlet); catch (IOException ex1) ex1.printStackTrace(); layerManager.append(tiledLayer); layerManager.setViewWindow(0, 0, getWidth(), getHeight(); layerManager.paint(g, 0, 0); flushGraphics(); public void keyPressed(int keyCode) System.out.println(keyCode); input(keyCode); layerManager.paint(g, 0, 0); tiledLayer.paintSelectModel(g); int keytype = this.getKeyStates(); System.out.println(keytype); input(keytype); flushGraphics(); public void run() try while (true) try Thread.sleep(800); catch (InterruptedException ex) /ex.printStackTrace(); layerManager.paint(g, 0, 0); tiledLayer.paintSelectModel(g); int keytype = this.getKeyStates(); System.out.println(keytype); input(keytype); flushGraphics(); if (keytype != 0) try Thread.sleep(700); catch (InterruptedException ex) /ex.printStackTrace(); catch (Exception e) e.printStackTrace(); private void input(int keytype) /清除上次选择的方块 int x = tiledLayer.getX(); int y = tiledLayer.getY(); g.setColor(255, 255, 255); g.drawRect(x + selectcol * 32, y + selectrow * 32, 32, 32); if (keytype = UP_PRESSED) if (selectrow = 2) selectrow = 0; else selectrow+; if (keytype = LEFT_PRESSED) if (selectcol = 3) selectcol = 0; else selectcol+; if (keytype = FIRE_PRESSED) int tile = tiledLayer.getCell(selectcol, selectrow); tiledLayer.addSelectModel(selectcol, selectrow, tile, g); /绘制选中的方块 g.setColor(0, 0, 0); g.drawRect(x + selectcol * 32, y + selectrow * 32, 32, 32); public void commandAction(Command command, Displayable displayable) if (command = exitCo

温馨提示

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

评论

0/150

提交评论