版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《JAVA语言程序设计》2048智力小游戏设计1、前言.................................................12、游戏需求分析.........................................12、1需求分析.........................................12、2可行性分析.......................................23、概要设计.............................................34、详细设计.............................................44、1流程图...........................................45、测试.................................................86、总结................................................106、参考文献............................................107、部分源代码:.........................................10前言最近以来,移动手游越来越成为当下游戏产业中重要的一环,市场也在加大秀的手游,然而任何一款手游能够风靡,主要还就是依靠其简单的操作性,因此本2048游戏规则很简单,玩家每次可以选择上下左右其中一个方向去移动每移动一次,所有的数字方块都会往移动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。系统给予的数字方块。分析21:,,,单化与多样化,游戏界面更加人性化能更加贴合使用。(1)界面一款的好的游戏其界面必须友好,简洁已经成为当今UI设计的主流,简上手才能得到玩家的青睐。(2)功能需求能够显示游戏的当前得得分,并记录游戏的最高分并显示,当在次打开游戏时,能够显示最高分;在游戏进行的过程中循环播放音乐,并能够关闭音乐;束要相加,通过不断地累加最终加到2048(3)操作性需求游戏的体验就是衡量一款游戏的关键,本游戏可通过键盘w,s,a,d以及方向键来控制方块的移动,还可以通过在游戏的主面板中向上下左右拖动鼠标来控制方块的移动,左右手都可以操作,充分考虑便捷性。不同的人有不一样习惯,通过多种方式来操作游戏以各种习惯的人的需求。22(1)象的程序设计方法Java面向对象程序设计的基本思想就是通过构造与组织对象来求解问题的。对象就是很好理解的,任何一种物体都可以被认为就是对象,例如,汽车就:能,这两种基本属性在Java语言中表现为拥有一定的存储单元并具备一定的功能。理解了Java的这种面向对象程序设计的基本思想之后,在以后的编程过程中,当个构造人们容易理解的更接近于真实物理世界物体的对象。设计方法,首先构造一个类来处理需要解决的问题,然后根据已经拥有的类(例来求解指定的问题。这个过程可以继续递归下去,用在新构造的类上,直到最后解决了指定的问题,例如Java的应用程序与小应用程序都必须有一个类作口求解问题。在计算机语言中,面向对象的类一般具有三个基本特性:封装性、继承性与多态性,这三种特性进一步简化了Java求解模型,提高了程序的复用性,节省了程序的代码量,提高了软件的生产率。(2)java图形用户界面不仅可以提供各种数据的基本图形的直观表示形式,而且可以建立友好的交互方式,从而使计算机软件可以设计得十分简单易用。从,系统,而且缺少基本的剪贴板与打印支持功能。现在第二代图形用户界面Swing对AWT进行了扩展,Swing不仅在功能上比AWT强大,而且在很大程相关性很小,可以定制指定的操作系统风格的图形用户界面。GUI(图形用户界面)组件构成了图形用户界面的基础。在Java程序设计中,要求按照一定的布局方式将组件安排在容器中,然后通过事件处理的方式实现人机交互,而容器本身也就是组件,这样在容器中也可以含有容器,从而可这种嵌套方式方便地组合各种组件。事件处理模型就是Java语言提供的一种人机交互模型,它使得用户能够Java对这些事件的处理模型就是采用面向对象的方法,即通过对象的形式把各种事件进行封装与处理。这种事件处理模型的三个基本要素就是事件源、事件种事件源上运用鼠标、键盘或其她输入设备进行各种操作有事件发生。处理就是通过事件监听器实现的。因为鼠标事件也就是一种事件,所以对鼠标事件进行处理要遵循事件处理模型。鼠标事件的处理也就是建立在事件源的基础之上,以事件对象本身,通过事件监听器进行处理。,与放开鼠标键等。类MouseEvent的实例对象记录了鼠标的当前位置与状态口 。 这 些 相 关 接 口 包 。,来自包javaxswing、event。键、单击鼠标键、鼠标进入组件内与鼠标离开组件区域等事件。对鼠标事件进行处理,就就是要设计类,实现上面的鼠标事件监听器接口,然后在事件源中注册处理鼠标事件监听器的对象,便对鼠标事件进行处理。(1)流程图(2)界面的整体布局数字代表的方块颜色。(3)方法模块分析来设置标签的颜色publicvoidsetColor(inti,intj,Stringstr){if(""、equals(str)){texts、setBackground(Color(120,221,247));return;
result=Integer、parseInt(str);switch(result){case2:texts[i][j]、setBackground(newColor(240,240,0));break;case4:texts[i][j]、setBackground(Color、pink);break;case8:texts[i][j]、setBackground(newColor(240,150,10));break;case16:texts[i][j]、setBackground(Color、green);break;case32:texts[i][j]、setBackground(Color、magenta);break;case64:texts[i][j]、setBackground(newColor(155,10,190));break;case128:texts[i][j]、setBackground(Color、blue);break;case256:texts[i][j]、setBackground(Color、gray);break;case512:texts[i][j]、setBackground(Color、cyan);break;case1024:texts[i][j]、setBackground(Color、DARK_GRAY);break;case2048:texts[i][j]、setBackground(Color、red);break;case4096:texts[i][j]、setBackground(Color、white);break;default:break;游戏就是否结束。publicvoidCreate(){inti,j;//用于记录产生的二维方阵的下标值booleanr=true;if(times>0&&biaoji==1){while(r){i=random、nextInt(4);j=random、nextInt(4);str=texts[i][j]、getText();if((str、compareTo("")==0)){intima=2*(int)(1+Math、random()*2);//随机产Stringimass=String、valueOf(ima);texts、Text(imass);setColor(i,j,imass);timesr=false;p1=p2=p3=p4=0;//前的状态for(intp=0;p<4;++p){for(intq=0;q<4;++q){temp1[p][q]=temp2[p][q];if(""、equals(texts[p][q]、getText()))temp2[p][q]=elsetemp2[p][q]=Integer、parseInt(texts[p][q]、temp1scores=temp2scores;temp2scores=scores;elseif(p1>0&&p2>0&&p3>0&&p4>0)//到l41说明任何方向键都不能产生新的数字tips、setText("游戏结束!");currentScores、setText("<html>SCORE<br>"+String、valueOf(scores)+"</html>"JOptionPaneshowMessageDialognull"游戏结束!"Systemexit);;方法3:通过鼠标左键的按下与释放来判断向那个方向拖动,拖动实现主要就是通过记录按下鼠标左键时鼠标指针的位置,然后在记录鼠标左键释放的方向,在将获得的方向值传到do_label_keyPressed(int)函数中,从而达动的目的。publicvoidmousePressed(MouseEvente){//TODOAuto-generatedmethodstub按下(e、、、640)、=e);thisy1、tY();out"X="、"++epublicvoidmouseReleased(MouseEvente){//TODOAuto-generatedmethodstub释放//若鼠标位置在灰色区域内并且按下鼠标的位置不为相应的处理if(e、getX()>=20&&e、getX()<=480&&e、getY()>=180&&e、getY()<=640&&this、x1!=0&&thisy1=0)thisx2、tX();this、y2=e、etY();if(()&&((-)>Math、abs-y1option//向向左Systemprintln(}if((x1<x2)&&((x2-x1)>Math、abs(y2-y1)))option//向向右Systemprintln(}if((y1>y2)&&((y1-y2)>Math、abs(x1-x2)))option//向向上Systemprintln(}if((y1<y2)&&((y2-y1)>Math、abs(x1-x2)))option//向向下Systemoutprintln(向下方向移动this、y2do_label_keyPressed(option);方法4:从文件中读取,记录。从文件中读取记录,同时也要将新的数据,,文件不存在,这时不仅不能从文件中读数据,还要创建相应的文件。创建文件之后,接下来在运行程序就能读取到数据。文件读取结束要将文闭。publicstaticvoidgetRecording()flag=//newFile("src/myRecording、txt");(f())=newbrnewBufferedReader();Stringn=br、readLine();maxscores_2048、parseInt);}、ewFile();}catch(Exceptione){//TODO:handleexception);},g));}catch(Exceptione2){//TODO:handleexceptione();(1)首次运行程序(在工程文件中建立保存最高分的文件再次运行程序(2)结束在这次的课程设计中不仅检验了我所学习的知识,也培养了我的实践能力,让我知道遇到一个问题如何去寻找思路,如何去解决问题终完成整个事情。课程设计就是我们专业课程知识综合应用的实践训练,就是我们迈向社会,从事次课程设计使我明白了自己知识还比较欠缺是学习书本知识还就是远远不够的,自己不会的东西还有太多学习需要自己长期的积累以后的学习、工作中都应该不断的学习,将课本的理论知识与生活中的实践知识相结合,不断提高自己文化知识与实践能力。由于本次试验的很多知识都就是现学现用致很多地方的代码显得累赘繁琐。但总体上主要功能就是实现了的且美化了一下主界面,面更加简洁。也感谢老师给予的耐心指导与帮助。总之,此次课程设计让我获益匪浅将会继续把它完善做好[1]java语言程序设计基础篇[M]、机械工业出版社、2011、3、[2]黄晓东、Java课程设计案例精编[M]、北京:中国水利水电出版社,20075[3]求就是科技、Java信息管理系统开发实例导航[M]、北京:人民邮电出版社、20094importjavax、sound、sampled、*;importjava、awt、event、*;publicclassMy2048GameextendsJFrame{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstub
publicMy2048Game()this、setTitle("2048游戏");this、setLocation(400,30);classMyPanelextendsJPanelimplementsMouseListener,KeyListener,ActionListener//动作监听privatebooleanjb1_flag2=true;//publicstaticbooleanisJb1_flag(){publicstaticvoidsetJb1_flag(booleanjb1_flag){=privateJPanelscoresPane;//分数面板privateJPanelmainPane;//游戏主面板//"privateJLabellabelScores;//当前"得分"标签privateJLabeltips;//提示操作标签privateJLabelcurrentScores;privateJLabeltextScores;privateJLabel[][]texts;//创建文本框二维数组privateint[][]temp1=newint[4][4];//记录上一步的状态privateint[][]temp2=newint[4][4];//记录当前的状态privateinttimes=16;//记录剩余空方块数目privateintscores=0;//记录分数privateinttemp1scores=0;privateinttemp2scores=0;privateintp1,p2,p3,p4;//用于判断游戏就是否失败privateintbiaoji=1;//标记能否移动Fontfont=newFont("",Font、BOLD,14);//设置字体类型与大小(标签字体的设置)Fontfont2=newFont("",Font、BOLD,30);//主面板的数字字体的设置Randomrandom=newRandom();currentScores=newJLabel();//当前得分标签currentScores、setFont(newFont("宋体",Font、BOLD,30));//设置字体类型与大小currentScores、setBounds(240,0,140,100);//设置最高分标签的位置尺寸、 labelMaxScores、setFont(newFont("宋体",Font、BOLD,30));//设置字体类型与大//labelMaxScores、setBorder(BorderFactory、createMatteBorder(2,2,2,2,Color、labelMaxScores、setBounds(380,0,120,100);mainPane=newJPanel();//创建游戏主面板mainPane、setBounds(18,150,460,460);//设置主面板位置尺寸texts=newJLabel[4][4];//创建文本框二维数组for(inti=0;i<4;i++){//遍历数组for(intj=0;j<4;j++){texts[i][j]=newJLabel();//创建标签、texts[i][j]、setHorizontalAlignment(SwingConstants、CENTER);//设置标、*setColor(i,j,"");texts[i][j]、setOpaque(true);//设置控件不透明2, 2,Color、green));//设置方块边框颜色tips=newJLabel("<html>小提示:在灰色区域内按下鼠标左键并向上下左右方向拖动<br>&NBSP&NBSP&NBSP&NBSP&NBSP&NBSP&NBSP也可以通过键盘的方向+"<br>&NBSP&NBSP&NBSP&NBSP&NBSP&NBSP&NBSPZ键返tips、setBounds(0,640,500,60);for(inti=0;i<4;++i){for(intj=0;j<4;++j){if(""、equals(texts[i][j]、getText()))temp1[i][j]=temp2[i][j]=0;elsetemp1[i][j]=temp2[i][j]=Integer、parseInt(texts[i][j]、getText());publicvoidsetColor(inti,intj,Stringstr){if(""、equals(str)){texts[i][j]setBackground(newColor(120,221,247));intresult=Integer、parseInt(str);switch(result){、、、protectedvoiddo_label_keyPressed(finalKeyEvente){intcode=e、getKeyCode();//获取按键代码inta;//a的引入就是为了防止连加的情况出现str;Stringstr1;switch(code){caseKeyEvent、VK_A://如果按键代码就是左方向键或者A键biaoji=0;//标记左边能不能合并for(inti=0;i<4;i++){a=5;for(intk=0;k<3;k++){//让左边每2个能合并的全合并了for(intj=1;j<4;j++){//遍历16个方块str=texts[i][j]、getText();//获取当前方块标签文本字符str1=texts[i][j-1]、getText();//获取当前左1方块标签文本if(str、compareTo("")!=0)biaoji=1;//如果向左能移,就标记一下texts[i][j-1]、setText(str);//字符左移setColor(i,j-1,str);setColor(i,j,"");}elseif((str、compareTo(str1)==0)&&(j!=a)&&(j!=a-1)){//如果当前方块与左1方块文本scores+=num;str=String、valueOf(2*num);//返回int参数的字符串-setColor(i,j-1,str);setColor(i,j,"");a=j;biaoji=1;p1=1;Create();break;biaoji=0;for(inti=0;i<4;i++){a=5;for(intk=0;k<3;k++){for(intj=2;j>=0;j--){str1=texts[i][j+1]、getText();if(str1、compareTo("")==0){if(str、compareTo("")!=0)biaoji=1;+setColor(i,j+1,str);setColor(i,j,"");}elseif(str、compareTo(str1)==0&&j!=a&&j!=a+1){scores+=num;str=String、valueOf(2*num);texts[i][j+1]、setText(str);setColor(i,j+1,str);setColor(i,j,"");a=j;biaoji=1;p2=1;Create();break;biaoji=0;for(intj=0;j<4;j++){a=5;for(intk=0;k<3;k++){for(inti=1;i<4;i++){str1=texts[i-1][j]、getText();if(str1、compareTo("")==0){if(str、compareTo("")!=0)biaoji=1;setColor(i-1,j,str);setColor(i,j,"");}elseif(str、compareTo(str1)==0&&i!=a&&i!=a-1){scores+=num;str=String、valueOf(2*num);texts[i-1][j]、setText(str);setColor(i-1,j,str);setColor(i,j,"");a=i;biaoji=1;p3=1;Create();break;caseKeyEvent、VK_DOWN:biaoji=0;for(intj=0;j<4;j++){a=5;for(intk=0;k<5;k++){for(inti=2;i>=0;i--){str1=texts[i+1][j]、getText();if(str1、compareTo("")==0){if(str、compareTo("")!=0)biaoji=1;setColor(i+1,j,str);setColor(i,j,"");}elseif(str、compareTo(str1)==0&&i!=a&&i!=a+1){scores+=num;str=String、valueOf(2*num);texts[i+1][j]、setText(str);setColor(i+1,j,str);setColor(i,j,"");a=i;biaoji=1;p4=1;Create();break;if(p1<=0||p2<=0||p3<=0||p4<=0){for(inti=0;i<4;++i){for(intj=0;j<4;++j){temp2[i][j]=temp1[i][j];j,scores=temp1scores;default:break; protectedvoiddo_label_keyPressed(intoption){inta;//a的引入就是为了防止连加的情况出现str;Stringstr1;switch(option){biaoji=0;//标记左边能不能合并for(inti=0;i<4;i++){a=5;for(intk=0;k<3;k++){//让左边每2个能合并的全合并了for(intj=1;j<4;j++){//遍历16个方块str=texts[i][j]、getText();//获取当前方块标签文本字符str1=texts[i][j-1]、getText();//获取当前左1方块标签文本if(str、compareTo("")!=0)biaoji=1;//如果向左能移,就标记一下texts[i][j-1]、setText(str);//字符左移setColor(i,j-1,str);setColor(i,j,"");}elseif((str、compareTo(str1)==0)&&(j!=a)&&(j!=a-1)){//如果当前方块与左1方块0文本scores+=num;str=String、valueOf(2*num);//返回int参数的字符串-setColor(i,j-1,str);setColor(i,j,"");a=j;biaoji=1;p1=1;Create();break;biaoji=0;for(inti=0;i<4;i++){a=5;for(intk=0;k<3;k++){for(intj=2;j>=0;j--){str1=texts[i][j+1]、getText();if(str1、compareTo("")==0){if(str、compareTo("")!=0)biaoji=1;+setColor(i,j+1,str);setColor(i,j,"");}elseif(str、compareTo(str1)==0&&j!=a&&j!=a+1){scores+=num;str=String、valueOf(2*num);texts[i][j+1]、setText(str);setColor(i,j+1,str);setColor(i,j,"");a=j;biaoji=1;p2=1;Create();break;biaoji=0;for(intj=0;j<4;j++){a=5;for(intk=0;k<3;k++){for(inti=1;i<4;i++){str1=texts[i-1][j]、getText();if(str1、compareTo("")==0){if(str、compareTo("")!=0)biaoji=1;setColor(i-1,j,str);setColor(i,j,"");}elseif(str、compareTo(str1)==0&&i!=a&&i!=a-1){scores+=num;str=String、valueOf(2*num);texts[i-1][j]、setText(str);setColor(i-1,j,str);setColor(i,j,"");a=i;biaoji=1;p3=1;Create();break;biaoji=0;for(intj=0;j<4;j++){a=5;for(intk=0;k<5;k++){for(inti=2;i>=0;i--){str1=texts[i+1][j]、getText();if(str1、compareTo("")==0){if(str、compareTo("")!=0)biaoji=1;setColor(i+1,j,str);setColor(i,j,"");}elseif(str、compareTo(str1)==0&&i!=a&&i!=a+1){scores+=num;str=String、valueOf(2*num);texts[i+1][j]、setText(str);setColor(i+1,j,str);setColor(i,j,"");a=i;biaoji=1;p4=1;Create();break;default:break; publicvoidCreate(){booleanr=true;str;if(times>0&&biaoji==1){while(r){i=random、nextInt(4);j=random、nextInt(4);if((str、compareTo("")==0)){intima=2*(int)(1+Math、random()*2);//随机产生2或4setColor(i,j,imass);r=false;p1=p2=p3=p4=0;for(intp=0;p<4;++p){for(intq=0;q<4;++q
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二四年度大型设备采购合同担保协议
- 网络供应合同范本
- 二零二四年版:智能停车场系统设计与施工合同
- 合同范本修订意义
- 2024年度消防宣传教育与推广合同
- 2024年度电竞游戏研发与运营合同
- 校区扶持合同范本
- 二零二四年智能化工厂搬迁合同
- 开发贷合同范本
- 轻钢隔墙合同范本
- GB/T 26184-2010绝对发光强度分布的测量方法
- 创新城市管理提高城市管理水平讲义
- 小学六年级上册综合实践-5.1了解汉字的发展演变-(19张)ppt
- 汽车品牌介绍专题培训课件
- 第23课《范进中举》课件(25张PPT) 年部编版语文九年级上册
- 新概念英语第一册课文及翻译
- 新版现代西班牙语第二册课后答案
- 生产调度竞聘报告第一版课件
- 颅脑CT检查技术课件
- 测量系统分析 -课件
- 《狼》选择题解析(内容理解)-
评论
0/150
提交评论