华北科技学院计算机学院综合性实验实验报告课程名称JAVA程序设计实验学期2014至2015学年第1学期学生所在院部计算机学院年级专业班级学生姓名学号任课教师实验成绩计算机学院制华北科技学院计算机系综合性实验报告第1页《Java程序设计》课程综合性实验报告开课实验室:基础四2016年11月28日实验题目基于java的拼图游戏一、实验目的程序使用Eclipse集成开发环境完成,熟悉并掌握在Eclipse开发环境下编写Java程序。二、设备与环境硬件:多媒体计算机软件:Windows系列操作系统、JDK开发包、Eclipse开发环境三、实验内容及要求1.实验要求使用Javaswing编程实现拼图游戏。游戏功能是将一幅图片分割成5*5的规则小图片,游戏开始时将25个小图片随机摆放,玩家能够参考原图拼接出正确的图片。游戏规则:在25个小图片中有一个为空白图片,玩家可以单击和空白小图片相邻的任一个小图片(上、下、左、右均可),即可将单击的小图片与空白小图片交换位置。通过有限次的移动,即可将随机分布的小图片恢复成原图的样式。2.实验内容(1)各类及主要成员函数的功能:(2)具体代码及实现如下:①程序入口主方法://第一部分publicclassGreedSnake{//建立主类GreeSnakepublicstaticvoidmain(String[]args){SnakeModelmodel=newSnakeModel(20,30);//初始化蛇出现的位置SnakeControlcontrol=newSnakeControl(model);java源代码及其功能序号类名主要功能1GreedSnake该类为程序入口,含有main方法。2SnakeControl实现控制运行等总体要求,实现方向键控制蛇的方向,空格键控制游戏暂停或继续,还有分数等。3SnakeModel该类实现蛇的结构和具体运动,如判断食物是否和怎样被吃掉及判断后的动作。4Node该类实现组成蛇身的单位-食物。5SnakeView该类实现画板功能,用黑色画蛇身,红色画食物。华北科技学院计算机系综合性实验报告第2页SnakeViewview=newSnakeView(model,control);//添加一个观察者,让view成为model的观察者model.addObserver(view);(newThread(model)).start();}}②实现对蛇身的控制要求://第二部分//游戏的Model类,负责所有游戏相关数据及运行classSnakeControlimplementsKeyListener{//SnakeControl实现接口KeyListener,键盘监听SnakeModelmodel;publicSnakeControl(SnakeModelmodel){this.model=model;}publicvoidkeyPressed(KeyEvente){intkeyCode=e.getKeyCode();if(model.running){//运行状态下,处理的按键switch(keyCode){caseKeyEvent.VK_UP:model.changeDirection(SnakeModel.UP);break;caseKeyEvent.VK_DOWN:model.changeDirection(SnakeModel.DOWN);break;caseKeyEvent.VK_LEFT:model.changeDirection(SnakeModel.LEFT);break;caseKeyEvent.VK_RIGHT:model.changeDirection(SnakeModel.RIGHT);break;caseKeyEvent.VK_ADD:caseKeyEvent.VK_PAGE_UP://向上翻加速model.speedUp();break;caseKeyEvent.VK_SUBTRACT:caseKeyEvent.VK_PAGE_DOWN://减速model.speedDown();break;caseKeyEvent.VK_SPACE:caseKeyEvent.VK_P:model.changePauseState();//暂停进入睡眠状态break;default:}}//任何情况下处理的按键,按键导致重新启动游戏if(keyCode==KeyEvent.VK_R||keyCode==KeyEvent.VK_S||keyCode==KeyEvent.VK_ENTER){model.reset();}}publicvoidkeyReleased(KeyEvente){}publicvoidkeyTyped(KeyEvente){}华北科技学院计算机系综合性实验报告第3页}③实现蛇的结构和具体运动://第三部分@SuppressWarnings(“unchecked”)classSnakeModelextendsObservableimplementsRunnable{//SnakeModel继承Observable类并且实现接口Runnableainfra[][]matrix;//指示位置上有没蛇体或食物LinkedListNodenodeArray=newLinkedListNode();//蛇体Nodefood;intmaxX;intmaxY;intdirection=2;//蛇运行的方向ainfrarunning=false;//运行状态inttimeInterval=200;//时间间隔,毫秒doublespeedChangeRate=0.75;//每次得速度变化率ainfrapaused=false;//暂停标志intscore=0;//得分intcountMove=0;//吃到食物前移动的次数//UPandDOWNshouldbeeven//RIGHTandLEFTshouldbeoddpublicstaticfinalintUP=2;publicstaticfinalintDOWN=4;publicstaticfinalintLEFT=1;publicstaticfinalintRIGHT=3;publicSnakeModel(intmaxX,intmaxY){this.maxX=maxX;this.maxY=maxY;reset();}publicvoidreset(){direction=SnakeModel.UP;//蛇运行的方向timeInterval=500;//时间间隔,毫秒paused=false;//暂停标志score=0;//得分countMove=0;//吃到食物前移动的次数//initialainfr,全部清0matrix=newainfra[maxX][];for(intI=0;ImaxX;++i){matrix[i]=newainfra[maxY];Arrays.fill(matrix[i],false);}//initialthesnake//初始化蛇体,如果横向位置超过20个,长度为10,否则为横向位置的一半intinitArrayLength=maxX20?10:maxX/2;nodeArray.clear();for(intI=0;IinitArrayLength;++i){intx=maxX/2+I;//maxX被初始化为20inty=maxY/2;//maxY被初始化为30//nodeArray[x,y]:[10,15]-[11,15]-[12,15]~~[20,15]//默认的运行方向向上,所以游戏一开始nodeArray就变为://[10,14]-[10,15]-[11,15]-[12,15]~~[19,15]nodeArray.addLast(newNode(x,y));华北科技学院计算机系综合性实验报告第4页matrix[x][y]=true;}//创建食物food=createFood();matrix[food.x][food.y]=true;}publicvoidchangeDirection(intnewDirection){//改变的方向不能与原来方向同向或反向if(direction%2!=newDirection%2){direction=newDirection;}}publicainframoveOn(){Noden=nodeArray.getFirst();intx=n.x;inty=n.y;//根据方向增减坐标值switch(direction){caseUP:y--;break;caseDOWN:y++;break;caseLEFT:x--;break;caseRIGHT:x++;break;}//如果新坐标落在有效范围内,则进行处理if((0=x&&xmaxX)&&(0=y&&ymaxY)){if(matrix[x][y]){//如果新坐标的点上有东西(蛇体或者食物)if(x==food.x&&y==food.y){//吃到食物,成功nodeArray.addFirst(food);//从蛇头赠长//分数规则,与移动改变方向的次数和速度两个元素有关intscoreGet=(10000–200*countMove)/timeInterval;score+=scoreGet0?scoreGet:10;countMove=0;food=createFood();//创建新的食物matrix[food.x][food.y]=true;//设置食物所在位置returntrue;}else//吃到蛇体自身,失败returnfalse;}else{//如果新坐标的点上没有东西(蛇体),移动蛇体nodeArray.addFirst(newNode(x,y));matrix[x][y]=true;n=nodeArray.removeLast();matrix[n.x][n.y]=false;countMove++;returntrue;}}returnfalse;//触到边线,失败}华北科技学院计算机系综合性实验报告第5页publicvoidrun(){//运行方法running=true;while(running){try{Thread.sleep(timeInterval);}catch(Exceptione){break;}if(!paused){if(moveOn()){setChanged();//Model通知View数据已经更新notifyObservers();}else{JoptionPane.showMessageDialog(null,“你输了”,“GameOver”,JoptionPane.INFORMATION_MESSAGE);break;}}}running=false;}privateNodecreateFood(){intx=0;inty=0;//随机获取一个有效区域内的与蛇体和食物不重叠的位置do{Randomr=newRandom();x=r.nextInt(maxX);y=r.nextInt(maxY);}while(matrix[x][y]);returnnewNode(x,y);}publicvoidainfra(){timeInterval*=speedChangeRate;}publicvoidspeedDown(){timeInterval/=speedChangeRate;}publicvoidchangePauseState(){paused=!paused;}publicStringtoString(){Stringresult=“”;for(intI=0;InodeArray.size();++i){Noden=nodeArray.get(i);result+=“[“+n.x+“,”+n.y+“]”;}returnresult;}}④实现组成蛇身的单位-食物://第四部