当前位置:文档之家› 课程设计报告-拼图游戏

课程设计报告-拼图游戏


2、系统功能描述
拼图游戏
添 加 组 件 并 初 始 化 各 种 资 源
加 载 图 像 并 将 图 像 分 成 小 部 分
创 建 屏 幕 并 添 加 按 钮
创 建 用 鼠 标 和 键 盘 控 制 图 像 的 移 动
3、打开主界面,如下获的游戏初始界面:
4、新游戏开始的界面:
5.游戏进行的界面:
6.游戏胜利时的界面:
3、 遇到的难点和解决方法 在程序中运行的过程中,遇到了安装 java 的软件的困难,不知道怎么使用总是出现错 误, 通过同学和老师的指导解决了这个问题。 编码中也出现了很多的问题, 如编码错误, 通过一次又一次的调试和修改,终于把程序给纠正,还有出现图像的时候,出现了错误 通过对源程序的修改,才能使图像可以移动。
2、 设计思想
1.主体功能 用户通过 java 标准环境下运行,实现通过小的图像块的移动实现大的图像的拼凑。 通过改变鼠标的位置选取小的图像块,通过移动鼠标或键盘实现小图像的移动,使小图 像块能够上下左右的移动从而完成大图像的拼凑的完成。 2.系统目标 · 系统界面的左上侧是“新游戏”的按钮。鼠标单击“新游戏”按钮时,会开始新的游 戏,大图像会分成 16 个错综复杂的小图像块。通过移动小图像块来实现拼凑大的图像。 · 界面的右上侧是“继续游戏”的按钮 ,鼠标单击“继续游戏”按钮时,会继续游戏, 但是是出现新的小图像块的分布。 ·界面的下面的部分是一副大的图像,通过使用鼠标或键盘选取小图像块,通过移动鼠 标和键盘来移动小图像块的位置,以实现大图像块的拼凑,使游戏能过胜利。 3.模块设计 PPuzzle 模块是主类,负责很多的变量的赋值; init 添加组件并初始化各种资源; prepareImage 模块负责加载图像,创建缓冲区并获取缓冲区的 Graphics 对象; initMap 模块负责初始化 scree,创建 screen 对象并覆盖 paint()方法,注册时间监 听接口; initButtons 模块负责创建按钮并做事件处理; drawscreen 模块负责绘制图画,将全部图像绘制在 screen 中; drawSegment 模块负责将第 seg 个图像块绘制在(x,y)位置处。
三、实现的主要功能和系统结构
1、 创建主类PPuzzle控制整个程序的调控与连接, 该类负责整个程序的变量和方法的调用, 程序从该类开始执行。并创建init、prepareImage、initMap、nitButtons、drawscreen、 drawSegment三个类分别负责添加组件并初始化各种资源、加载图像并创建缓冲区、初始化 scree并创建screen对象、创建按钮并做事件处理、绘制图画并将全部图像绘制在screen中、 将第seg个图像块绘制在(x,y)位置。
二、采用的主要技术、遇到的难点和解决方法
1、 采用的主要技术 (1)该游戏的设计:用户界面包括游戏所用的图片使用 prepareImaga 来加载图像,和 initMap 来创建 screen 对象并覆盖 pain 方法,注册时间监听接口和 initButton 来 创建两个按钮。
(2) 界面还有 Boolean running=false 为标识游戏进行状态的变量, 若 running 为真, 则表明游戏正在进行中。 Button bStart=new Button(“新游戏”)为新游戏按钮, 若 点击此按钮,则开始游戏。Button bSee=new Button(“显示正确的图像”)为此按钮 具有“显示正确的图像”与“继续游戏”两种功能。 (3) 程序设计中,使用了获得被点击的图像块编号及位置,例把第五个图像块移到第十五 个图像块的位置: public void mousePressed(MouseEvent me){ if(!running)return; int(x=me.getX()/sx,y=me.getY()sy; if(Math.abs(fx-x)+Mach.abs(fy-y)>=2)return; if(map[x][y]==15)return; map[fx][fy]=map[x][y]; map[x][y]=15; fifteen.setLocation(x,y); drawScreen(); }
四、核心算法描述和相关技术说明
主类的算法: 类名:PPuzzle 作用:主类 (1) Puzzle 类的变量 Image imgPuzzle,buff 为 Puzzle 图像及 buff 变量。 Point fifteen=new point(3,3)为第 15 个图像块的位置(3,3) 。 int[][] 数组。 int sx, sy 为保存图像块宽度和高度的变量。 map={{0,4,8,12}, {1,5,9,13}, {2,6,10,14},{3,7,11,15}}为保存图像块位置的
buff=createImage(imgPuzzle.getWidth(this),imgPuzzle.getHeight(this)); gb=buff.getGraphics(); } 初始化 map 并使用 Rondom 混排图像块算法: void initMap(){ java.util.Random rnd=new java.util.Random(); int temp,x1,y1,x2,y2; for(int i=0;i<100;i++){ x1=rnd.nextInt(4); x2=rnd.nextInt(4); y1=rnd.nextInt(4); y2=rnd.nextInt(4); temp=map[x1][y1]; map[x1][y1]=map[x2][y2]; map[x2][y2]=temp; } outer:for(int j=0;j<4;j++) for(int i=0;i<4;i++)
if(map[i][j]==15){ fifteen.setLocation(i,j); break outer; } 初始化 scree,创建 screen 对象并覆盖 paint()方法,注册时间监听接口算法:
void initScreen(){ screen=new Canvas(){ public void paint(Graphics g){ if(gs==null) gs=getGraphics(); if(running) drawScreen(); else g.drawImage(imgPuzzle,0,0,this); } }; screen.setSize(imgPuzzle.getWidth(this),imgPuzzle.getHeight(this)); screen.addMouseListener(new MouseAdapter(){ public void mousePressed(MouseEvent me){ if(!running) return; int x=me.getX()/sx, y=me.getY()/sy; int fx=(int)fifteen.getX(), fy=(int)fifteen.getY(); if(Math.abs(fx-x)+Math.abs(fy-y)>=2) return; if(map[x][y]==15) return; map[fx][fy]=map[x][y]; map[x][y]=15; fifteen.setLocation(x,y); drawScreen(); } }); }
void drawScreen(){ gb.clearRect(0,0,sx*4,sy*4); // for(int j=0;j<4;j++) for(int i=0;i<4;i++) if(map[i][j]!=15)drawSegment(map[i][j],i,j);
// gs.drawImage(buff,0,0,screen); } 将第 seg 个图像块绘制在(x,y)位置处算法:
initScreen(); initButtons(); add(screen); add(bStart); add(bSee); } 加载图像,创建缓冲区并获取缓冲区的 Graphics 对象算法:
void prepareImage(){ imgPuzzle=getImage(getCodeBase(),"images/baby.gif"); MediaTracker mt=new MediaTracker(this); mt.addImage(imgPuzzle,0); try{ mt.waitForAll(); } catch(Exception e){}
创建按钮并做事件处理算法: void initButtons(){ bStart.addActionListener(new ActionListtener(){ public void actionPerformed(ActionEvent ae){ initMap(); drawScreen(); running=true; bSee.setLabel("显示正确图像"); } }); bSee.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ //bSee 按钮标题为“继续游戏” if(bSee.getLabel().equals("继续游戏")){ drawScreen(); bSee.setLabel("显示正确图像"); } else{ //bSee gs.draxImage(imgPuzzle,0,0,screen); bSee.setLabel("继续游戏"); } } 绘制图画,将全部图像绘制在 screen 中算法:
void draxSegment(int seg,int x,int y){ int dx=seg%4*sx, dy=seg/4*sy;
相关主题