魔板游戏内含源代码_第1页
魔板游戏内含源代码_第2页
魔板游戏内含源代码_第3页
魔板游戏内含源代码_第4页
魔板游戏内含源代码_第5页
免费预览已结束,剩余13页可下载查看

下载本文档

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

文档简介

1、XX学院计算机科学与技术系实验报告课程名称程序设计根底实验2实验工程应用系统的面向对象设计与分析实验类型综合性实验完成人所在班级指导教师完成日期2021年11月30日一、实验报告简表02二、设计内容与要求021、设计内容2、设计要求三、总体设计031、需求分析2、功能描述3、设计工具与运行环境4、类及类间关系描述四、详细设计051、类图2、源代码五、实例运行及应用效果201、魔板游戏界面2、测试游戏及输出结果六、体会与总结24实验报告正文一.实验报告简表实验课题名称魔板游戏综合性实验工程应用系统的面向对象设计与分析实验小组组长指导教师参与实验人员及其在实验课题中承当的主要任务(包括组长)学号小

2、组成员姓名班级在实验课题中的主要作用效劳课程程序设计根底实验(2)二.设计内容与要求1、设计内容:用面向对象的Java程序设计语言开发设计GUI界面的魔板游戏程序.2、设计要求:(1)、魔板由3*3或4*4的方格组成,其中一个格子是空的.对于3*3的魔板,其他格子里随机放置8个编号为0-7的方块;对于4*4的魔板,其他格子里随即放置15个编号为0-14的方块,如果是n*n的方格原理相同.(2)、用鼠标单击任何与格子相邻的方块可以把该方块移入空格子.通过不断地移动方块,可以将方块一行一行按数字顺序依次排序.(3)、魔板游戏也可以使用图像来代替数字,对于3*3的魔板,将图像分成3*3个方块,打乱顺

3、序后,放入魔板,并将其中一个方格置为空.最终目标是通过移动方块来恢复为原始图像.4*4的魔板与3*3的方法相似.三.总体设计1、需求分析:魔板游戏就是大家以前常玩的拼板游戏!就是将一幅完整的图片分成小块,打乱顺序,再拼好,并且只能将图块和临界的空格交换位置.用最短的时间和最省的步骤将图形拼好,此玩法虽然简单,但特别考验智力,魔板游戏与魔方游戏相似属于益智游戏.此工程我们需要通过面向对象的Java程序设计来实现,游戏设计中需要用到GUI图形界面的设计,产生随机数生成打乱的图片,各种事件(动作事件、鼠标事件和窗口事件等)的响应和处理等面向对象的知识来实现游戏的各项功能.2、功能描述:我们所完成的魔

4、板游戏可以实现根本的魔板游戏的功能.此工程魔板游戏可由用户选择3*3和4*4两个不同难度,N*N的魔板游戏原理与此相同,游戏可以通过下拉列表实现选择不同的游戏图像,增加游戏的趣味性.点击“开始游戏按钮后可以实现游戏步骤的计数,拼图右边有一个完整的图像可以供用户参照,用鼠标单击任何与格子相邻的方块可以把该方块移入空格子.通过不断地移动方块,可以将方块一行一行按数字或图片依次拼图.假设成功完成拼图(即左边的拼图与右边的参照图像一样),那么有提示:“恭喜您,成功完成的字样出现.3、设计工具与运行环境:(1)、设计工具:Editplus.(2)、运行环境:JDK,WindowsXP4、类及类间关系描述

5、:此游戏工程创立了两个类:MobanFrame!和MobanSquare类,其中MobanFram嬖调用MobanSquare.四.详细设计(包括类图及源代码)1、类图:2、源代码:MobanFram嬖:importjava.awt.*;.*;publicclassMobanFrameextendsFrameimplementsActionListener,MouseListener,ItemListenerMobanSquareposition;/声明方块PointstartPoint=newPoint(110,120);/绘制左边图像的起始点PointrightStartPoint=new

6、Point(450,120);/绘制右边图像的起始点intnum;/存储随机数的数组Point口pointMove;inttotalStep=0;/总共已走的步数StringselectedImage="金牛座";当前选中的要游戏图像StringgamingImage="图像"/正在游戏的booleanstartGame=false;intsquareNumber=3;intlevel=1;/游戏等级intsquareSize=80;ImagesourceImage;/游戏图像的来源图像ImagespaceSourceImage;/空格图像的来源图像Im

7、agespaceImage;Image口myImage;/存储打乱的图像的数组Graphics2Dggg;*/*/*显示在界面上的一些组件*/*/*TextFieldtfx;TextFieldtfy;MenuBarmnbMyMenuBar;MenumnChooseLevel;MenuItemmniLevel1,mniLevel2;LabellbStep;/显示所走的步数LabellbSuccess=newLabel("");ButtonbtnStartGame;ChoicechChoiceImage;publicMobanFrame()super("魔板游戏&qu

8、ot;);pointMove=newPoint4;/方块可以移动的四个方向pointMove0=newPoint(-1,0);pointMove1=newPoint(1,0);pointMove2=newPoint(0,-1);pointMove3=newPoint(0,1);setLayout(newFlowLayout();chChoiceImage=newChoice();chChoiceImage.add("金牛座");chChoiceImage.add("迈克尔乔丹");chChoiceImage.add("多啦a梦");c

9、hChoiceImage.add("射手座");chChoiceImage.add("功夫熊猫");chChoiceImage.add("蜡笔小新");chChoiceImage.add("柯南)chChoiceImage.add("小狗)chChoiceImage.add("小狗2");chChoiceImage.add("小猫)chChoiceImage.add("Baby");chChoiceImage.add("数字)mniLevel1=newMe

10、nuItem("简单)mniLevel2=newMenuItem("困难)mnChooseLevel=newMenu.难度");mnbMyMenuBar=newMenuBar();tfx=newTextField(8);tfy=newTextField(8);tfx.setText("0");tfy.setText("1");tfx.setVisible(false);tfy.setVisible(false);lbStep=newLabel("已走步数:"+Integer.toString(totalS

11、tep);btnStartGame=newButton("开始游戏");mnChooseLevel.add(mniLevel1);mnChooseLevel.add(mniLevel2);mnbMyMenuBar.add(mnChooseLevel);this.setMenuBar(mnbMyMenuBar);add(tfx);add(tfy);add(lbSuccess);add(lbStep);add(chChoiceImage);add(btnStartGame);mniLevel1.addActionListener(this);mniLevel2.addActio

12、nListener(this);btnStartGame.addActionListener(this);chChoiceImage.addItemListener(this);this.addMouseListener(this);addWindowListener(newWindowAdapter()publicvoidwindowClosing(WindowEvente)System.exit(0););ProInit();GetImage();GetRandom();setSize(800,500);setVisible(true);publicvoidGetImage()/获取要完成

13、的拼图,并将拼图打乱myImage=newImagesquareNumber*squareNumber;ImageFiltercropFilterl;ImageFiltercropFilter2;ImageFiltercropFilter3;Toolkittool=getToolkit();sourcelmage=tool.createlmage(selectedlmage+".jpg");spaceSourceImage=tool.createImage("space.jpg");sourceImage=sourceImage.getScaledIns

14、tance(squareSize*squareNumber,squareSize*squareNumber,Image.SCALE_DEFAULT);/得到一个指定大小的图像cropFilter1=newCropImageFilter(0,0,squareSize*squareNumber,squareSize*squareNumber);/四个参数分别为图像起点坐标和宽高,即CropImageFilter(intx,inty,intwidth,intheight),详细情况请参考APIsourceImage=createImage(newFilteredImageSource(sourceI

15、mage.getSource(),cropFilter1);for(inti=0;i<squareNumber*squareNumber;i+)/从源图像上按选择的游戏难度截取相应个数的小图像块cropFilter2=newCropImageFilter(i%squareNumber)*squareSize,(i/squareNumber)*squareSize,squareSize,squareSize);myImagei=createImage(newFilteredImageSource(sourceImage.getSource(),cropFilter2);cropFilter

16、3=newCropImageFilter(0,0,squareSize,squareSize);spaceImage=createImage(newFilteredImageSource(spaceSourceImage.getSource(),cropFilter3);myImagesquareNumber*squareNumber-1=spaceImage;publicvoidProInit()num=newintsquareNumber*squareNumber;position=newMobanSquaresquareNumber+2squareNumber+2;绘制拼图publicv

17、oidpaint(Graphicsg)/(booleanshowSuccess=true;lbStep.setText("已走步数:"+Integer.toString(totalStep);if(startGame)(for(inti=1;i<squareNumber+1;i+)(for(intj=1;j<squareNumber+1;j+)(g.drawImage(positionij.GetImage(),startPoint.x+(positionij./y-1)*squareSize,startPoint.y+(positionij.x-1)*squa

18、reSize,this);绘制左边打乱的方块g.setColor(Color.cyan);for(inti=0;i<squareNumber+1;i+)(g.drawLine(startPoint.x+squareSize*i,startPoint.y,startPoint.x+squareSize*i,startPoint.y+squareNumber*squareSize);g.drawLine(startPoint.x,startPoint.y+squareSize*i,startPoint.x+squareNumber*squareSize,startPoint.y+square

19、Size*i);g.drawImage(sourceImage,rightStartPoint.x,rightStartPoint.y,this);/绘制右边参照图/g.drawImage(spaceImage,rightStartPoint.x+(squareNumber-1)*squareSize,rightStartPoint.y+(squareNumber-1)*squareSize,this);判断用户是否完成拼图for(inti=1;i<squareNumber+1;i+)/(for(intj=1;j<squareNumber+1;j+)(if(positionij.G

20、etOrder()!=(i-1)*squareNumber+(j-1)(showSuccess=false;if(showSuccess)/用户完成拼图,弹出完成对话框(showSuccess=false;lbSuccess.setText("恭喜您,成功完成");publicvoidGetRandom()/生成随机数,并将随机图像赋给每个方块(intk=squareNumber*squareNumber;booleannumExist=false;inttotal=0;for(intj=0;j<squareNumber*squareNumber;j+)(numj=-

21、1;while(total<squareNumber*squareNumber)/生成与方块个数相同的随机数(0.方块个数-1)(k=(int)(Math.random()*10)+(int)(Math.random()*10)%(squareNumber*squareNumber);for(intj=0;j<total;j+)if(k=numj)(numExist=true;break;)if(!numExist)(numtotal=k;total+;)numExist=false;)for(inti=0;i<squareNumber+2;i+)(for(intj=0;j&

22、lt;squareNumber+2;j+)(if(i=0|i=squareNumber+1|j=0|j=squareNumber+1)/实例化外围方块,这些方块是不可见的(this.positionij=newMobanSquare(i,j,-1,squareNumber*squareNumber-1);)for(inti=1;i<squareNumber+1;i+)/实例化要显示给用户的方块,此些方块可见,并可以移动(for(intj=1;j<squareNumber+1;j+)(this.positionij=newMobanSquare(i,j,num(i-1)*square

23、Number+j-1,squareNumber*squareNumber-1);this.positionij.SetImage(myImagethis.positionij.GetOrder();publicvoidMove(intx,inty)/移动方块intsquare_X,square_Y,order_Old,order_New;square_X=(y-1-startPoint.y)/squareSize+1;square_Y=(x-1-startPoint.x)/squareSize+1;for(inti=0;i<4;i+)if(positionsquare_X+pointMo

24、vei.xsquare_Y+pointMovei.y.arrive)/当前方块可以移ii,即空白块是它的邻块一this.totalStep+;PointnewPoint=newPoint(square_X+pointMovei.x,square_Y+pointMovei.y);order_Old=positionsquare_Xsquare_Y.GetOrder();order_New=positionnewPoint.xnewPoint.y.GetOrder();positionsquare_Xsquare_Y.SetOrder(order_New);positionsquare_Xsqua

25、re_Y.SetImage(myImageorder_New);positionnewPoint.xnewPoint.y.SetOrder(order_Old);positionnewPoint.xnewPoint.y.SetImage(myImageorder_Old);repaint();break;)publicvoidactionPerformed(ActionEvente)(if(e.getSource()=btnStartGame)/点击开始游戏按钮"(lbSuccess.setText("");totalStep=0;if(level=1)/难度为简

26、单(squareNumber=3;)if(level=2)/难度为困难(squareNumber=4;)startGame=true;gamingImage=selectedImage;ProInit();GetImage();GetRandom();repaint();)if(e.getSource()=mniLevel1)/在"难度"菜单项里选择了"简单"菜单子项(level=1;startPoint=newPoint(110,120);/绘制左边图像的起始点rightStartPoint=newPoint(450,120);/绘制右边图像的起始点)

27、在"难度"菜单项里选择了"困难菜单if(e.getSource()=mniLevel2)/子项(level=2;startPoint=newPoint(40,100);/绘制左边图像的起始点rightStartPoint=newPoint(440,100);/绘制右边图像的起始点)publicvoiditemStateChanged(ItemEvente)/处理下拉框事件的方法(if(e.getItemSelectable()instanceofChoice)(selectedImage=(Choice)e.getItemSelectable().getSelec

28、tedItem();tfx.setText(selectedImage);tfy.setText(gamingImage);if(selectedImage!=gamingImage)(GetImage();startGame=false;repaint();)publicvoidmouseClicked(MouseEvente)/处理在图片上点击鼠标事件的方法(intclick_X,click_Y;click_X=e.getX();click_Y=e.getY();tfx.setText(Integer.toString(e.getY()-1-startPoint.x)/squareSize

29、+1);tfy.setText(Integer.toString(e.getX()-1-startPoint.y)/squareSize+1);if(click_X>=startPoint.x&&click_X<=startPoint.x+squareNumber*squareSize&&click_Y>=startPoint.y&&click_Y<=startPoint.y+squareNumber*squareSize)Move(click_X,click_Y);publicvoidmouseExited(MouseE

30、vente)publicvoidmouseEntered(MouseEvente)publicvoidmousePressed(MouseEvente)publicvoidmouseReleased(MouseEvente)publicstaticvoidmain(Stringargs)newMobanFrame();MobanSquar演:importjava.awt.*;publicclassMobanSquare(publicintx,y;privateintorder;privateintnowSpaceOrder;privatebooleansquareHere;publicbool

31、eanarrive;privateImagesquareImage;publicMobanSquare(intpx,intpy,intorder,intspaceOrder)/MobanSquare的构造函数(this.x=px;this.y=py;this.order=order;this.nowSpaceOrder=spaceOrder;if(this.order=this.nowSpaceOrder)arrive=true;elsearrive=false;if(this.order=this.nowSpaceOrder|this.order=-1)squareHere=false;elsesquareHere=true;publicbooleanGetSquareHere()/得到当前位置是否有方块(returnthis.squareHere;设置当前位置是否是方块publicvoidSetSquareHere(booleanb)/this.squareHere=b;)publicintGetOrder()/得到当前位置方块上的序号(ret

温馨提示

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

评论

0/150

提交评论