小游戏 Java 课程设计报告书.docx
- 文档编号:5606866
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:45
- 大小:266.07KB
小游戏 Java 课程设计报告书.docx
《小游戏 Java 课程设计报告书.docx》由会员分享,可在线阅读,更多相关《小游戏 Java 课程设计报告书.docx(45页珍藏版)》请在冰点文库上搜索。
小游戏Java课程设计报告书
《JAVA语言程序设计》
课程设计报告
2048智力小游戏设计
专业班级:
计算机科学与技术嵌入13-1
********
学生学号:
小组成员:
单建飞堵文斐李栋承梅孔伟
指导教师姓名:
宋强
一、前言
最近以来,移动手游越来越成为当下游戏产业中重要的一环,市场也在加大对这一产业的投入,涌现出了愤怒的小鸟,水果忍者,flappybird,2048等诸多优秀的手游,然而任何一款手游能够风靡,主要还就是依靠其简单的操作性,因此本次java课设我选择其中的典型2048PC版作为本次课设的课题。
2048游戏规则很简单,玩家每次可以选择上下左右其中一个方向去移动,每移动一次,所有的数字方块都会往移动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。
系统给予的数字方块不就是2就就是4,玩家要想办法在这小小的16格范围中凑出“2048”这个数字方块。
二、游戏需求分析
2、1需求分析
现代社会对休闲小游戏的需求就是:
提高游戏的操作可行性,降低游戏的操作难度,降低游戏的上手难度,降低游戏的竞争需求,对使用设备的要求趋于简单化与多样化,游戏界面更加人性化,功能更加贴合使用。
(1)界面
一款的好的游戏其界面必须友好,简洁已经成为当今UI设计的主流,简单易上手才能得到玩家的青睐。
(2)功能需求
能够显示游戏的当前得得分,并记录游戏的最高分并显示,当在次打开游戏时,能够显示最高分;在游戏进行的过程中循环播放音乐,并能够关闭音乐或者打开音乐;游戏的主界面上,相同的数字要显示相同的颜色。
游戏结束要有相应的提示。
游戏的主要目的就是通过上下左右移动来将相邻相同的数字相加,通过不断地累加最终加到2048。
(3)操作性需求
游戏的体验就是衡量一款游戏的关键,本游戏可通过键盘w,s,a,d以及方向键来控制方块的移动,还可以通过在游戏的主面板中向上下左右拖动鼠标来控制方块的移动,左右手都可以操作,充分考虑便捷性。
不同的人有不一样习惯,通过多种方式来操作游戏,可以各种习惯的人的需求。
2、2可行性分析
(1)面向对象的程序设计方法
Java面向对象程序设计的基本思想就是通过构造与组织对象来求解问题的。
对象就是很好理解的,任何一种物体都可以被认为就是对象,例如,汽车就就是一种对象。
对象具有两个最基本的属性:
具有一定的物质基础与一定的功能,这两种基本属性在Java语言中表现为拥有一定的存储单元并具备一定的功能。
理解了Java的这种面向对象程序设计的基本思想之后,在以后的编程过程中,就应当个构造人们容易理解的更接近于真实物理世界物体的对象。
Java面向对象程序设计的过程非常简单。
这里介绍一种自顶向下的程序设计方法,首先构造一个类来处理需要解决的问题,然后根据已经拥有的类(例如以前求解其它问题时实现的类),分析与构造新的类,设法将问题分解下去,而最开始构造的类通过组织这些新构造的类、已有的类及由她们生成的实例来求解指定的问题。
这个过程可以继续递归下去,用在新构造的类上,直到最后解决了指定的问题,例如Java的应用程序与小应用程序都必须有一个类作为入口求解问题。
在计算机语言中,面向对象的类一般具有三个基本特性:
封装性、继承性与多态性,这三种特性进一步简化了Java求解模型,提高了程序的复用性,节省了程序的代码量,从而提高了软件的生产率。
(2)java技术分析
图形用户界面不仅可以提供各种数据的基本图形的直观表示形式,而且可以建立友好的交互方式,从而使计算机软件可以设计得十分简单易用。
从Java语言诞生到现在,Java语言已经提供了两代图形用户界面。
第一代图形用户界面AWT提供了基本的图形用户界面,它强烈地依赖于具体的计算机操作系统,而且缺少基本的剪贴板与打印支持功能。
现在第二代图形用户界面Swing对AWT进行了扩展,Swing不仅在功能上比AWT强大,而且在很大程度上克服了AWT的上述缺点,它所设计的图形用户界面与具体的计算机操作相关性很小,而且可以定制指定的操作系统风格的图形用户界面。
GUI(图形用户界面)组件构成了图形用户界面的基础。
在Java程序设计中,要求按照一定的布局方式将组件安排在容器中,然后通过事件处理的方式实现人机交互,而容器本身也就是组件,这样在容器中也可以含有容器,从而可以通过这种嵌套方式方便地组合各种组件。
事件处理模型就是Java语言提供的一种人机交互模型,它使得用户能够通过鼠标、键盘或其她输入设备来控制程序的执行流程,从而达到人机交互的目的。
对鼠标、键盘或其她输入设备的各种操作一般也称为事件。
Java语言对这些事件的处理模型就是采用面向对象的方法,即通过对象的形式把各种事件进行封装与处理。
这种事件处理模型的三个基本要素就是事件源、事件对象以及事件监听器。
事件源就是各种组件,就是接受各种事件的对象。
在各种事件源上运用鼠标、键盘或其她输入设备进行各种操作,就会有事件发生。
每种操作一般都对应着事件,Java语言通过事件对象来包装这些事件。
对事件进行处理就是通过事件监听器实现的。
因为鼠标事件也就是一种事件,所以对鼠标事件进行处理要遵循事件处理模型。
鼠标事件的处理也就是建立在事件源的基础之上,以事件对象本身,最后通过事件监听器进行处理。
类java、awt、event、MouseEvent包装常用的鼠标事件,例如,按下鼠标键与放开鼠标键等。
类MouseEvent的实例对象记录了鼠标的当前位置与状态发生变化的鼠标键等。
对鼠标事件进行处理最关键的就是实现事件监听器接口。
这些相关接口包括MouseListener,MouseMotionListener,MouseWheelListener,MouseInputListener。
前面三个就是包java、awt、event中的接口,最后一个接口MouseInputlistener来自包javax、swing、event。
接口Java、awt、event、MouseListener主要用来处理按下鼠标键、放开鼠标键、单击鼠标键、鼠标进入组件内与鼠标离开组件区域等事件。
对鼠标事件进行处理,就就是要设计类,实现上面的鼠标事件监听器接口,然后在事件源中注册处理鼠标事件监听器的对象,以便对鼠标事件进行处理。
三、概要设计
四、详细设计
(1)流程图
(2)界面的整体布局
分别构建mainPane,scoresPane两大模块放入游戏窗体,其中scoresPane包含2048字样的提示,当前得分与最高分,当得分超过最高分时,将得分存入工程文件夹下的myRecording、txt,覆盖最高分,同时在最高分显示最新myRecording、txt的内容。
通过Create方法随机产生2号方块或者4号方块,通过setColor方法设置每个数字代表的方块颜色。
(3)方法模块分析
方法1:
设置标签颜色,每次随机产生2或4与数字合并之后就要调用该方法来设置标签的颜色
publicvoidsetColor(inti,intj,Stringstr){
if(""、equals(str)){
texts[i][j]、setBackground(newColor(120,221,247));
return;
}
intresult=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;
}
}
方法2:
在随机位置产生一个2号或4号方块的方法,同时该方法也用于判断游戏就是否结束。
publicvoidCreate(){
inti,j;//用于记录产生的二维方阵的下标值
booleanr=true;
Stringstr;
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);//随机产生2或4
Stringimass=String、valueOf(ima);
texts[i][j]、setText(imass);
setColor(i,j,imass);
times--;
r=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]=0;
elsetemp2[p][q]=Integer、parseInt(texts[p][q]、getText());
}
}
temp1scores=temp2scores;
temp2scores=scores;
}
elseif(p1>0&&p2>0&&p3>0&&p4>0)
{
//l1到l4同时被键盘赋值为1说明任何方向键都不能产生新的数字,说明游戏失败
tips、setText("游戏结束!
");
currentScores、setText("SCORE
"+String、valueOf(scores)+"");
JOptionPane、showMessageDialog(null,"游戏结束!
");
System、exit(0);;
}
}
方法3:
通过鼠标左键的按下与释放来判断向那个方向拖动,拖动实现主要就是通过记录按下鼠标左键时鼠标指针的位置,然后在记录鼠标左键释放时指针的位置坐标,通过对两次的坐标值计算处理,可以得到鼠标指针移动的方向,在将获得的方向值传到do_label_keyPressed(int)函数中,从而达到移动的目的。
publicvoidmousePressed(MouseEvente){
//TODOAuto-generatedmethodstub
//鼠标按下
//若鼠标位置在灰色的区域内则记录鼠标左键按下时的坐标
if(e、getX()>=20&&e、getX()<=480&&e、getY()>=180&&e、getY()<=640)
{
this、x1=e、getX();
this、y1=e、getY();
//调试程序输出鼠标的坐标位置
System、out、println("X="+e、getX()+""+"Y="+e、getY());
}
}
@Override
publicvoidmouseReleased(MouseEvente){
//TODOAuto-generatedmethodstub
//鼠标释放
//若鼠标位置在灰色区域内并且按下鼠标的位置不为0,则进行相应的处理
if(e、getX()>=20&&e、getX()<=480&&e、getY()>=180&&e、getY()<=640&&this、x1!
=0&&this、y1!
=0)
{
this、x2=e、getX();
this、y2=e、getY();
if((x1>x2)&&((x1-x2)>Math、abs(y2-y1)))
{
option=1;//移动的方向向左
System、out、println("向左方向移动");
}
if((x1
{
option=2;//移动的方向向右
System、out、println("向右方向移动");
}
if((y1>y2)&&((y1-y2)>Math、abs(x1-x2)))
{
option=3;//移动的方向向上
System、out、println("向上方向移动");
}
if((y1
{
option=4;//移动的方向向下
System、out、println("向下方向移动");
}
//将上一次的鼠标位置清零
this、x1=0;
this、y1=0;
this、x2=0;
this、y2=0;
do_label_keyPressed(option);
}
}
方法4:
从文件中读取,记录。
从文件中读取记录,同时也要将新的数据保存到文件中。
读取文件需要解决的问题就是,当程序首次运行的时候,文件不存在,这时不仅不能从文件中读数据,还要创建相应的文件。
创建文件之后,接下来在运行程序就能读取到数据。
文件读取结束要将文件关闭。
publicstaticvoidgetRecording()
{
booleanflag=false;//用于判断文件就是否就是新创建的
try{
newFile("src/myRecording、txt");
if(f、exists())
{
fr=new(f);
br=newBufferedReader(fr);
Stringn=br、readLine();
maxscores_2048=Integer、parseInt(n);
}
else
{
flag=f、createNewFile();
}
}catch(Exceptione){
//TODO:
handleexception
e、printStackTrace();
}
finally
{
try{
//关闭文件流的顺序,先开的后关闭
if(!
flag)
{
br、close();
fr、close();
}
}catch(Exceptione2){
//TODO:
handleexception
e2、printStackTrace();
}
}
}
五、测试
(1)首次运行程序(在工程文件中建立保存最高分的文件)与再次运行程序
(2)游戏结束
六、总结
在这次的课程设计中不仅检验了我所学习的知识,也培养了我的实践能力,让我知道遇到一个问题,如何去寻找思路,如何去解决问题,最终完成整个事情。
课程设计就是我们专业课程知识综合应用的实践训练,就是我们迈向社会,从事职业工作前一个必不少的过程。
这次课程设计不仅就是对这学期所学知识的一种综合检验,而且也就是对自己动手能力的一种提高,增强了自己实践能力。
通过这次课程设计使我明白了自己知识还比较欠缺,只就是学习书本知识还就是远远不够的,自己不会的东西还有太多,学习需要自己长期的积累,在以后的学习、工作中都应该不断的学习,将课本的理论知识与生活中的实践知识相结合,不断提高自己文化知识与实践能力。
由于本次试验的很多知识都就是现学现用,以致很多地方的代码显得累赘繁琐。
但总体上主要功能就是实现了的,并且美化了一下主界面,使得界面更加简洁。
最后也感谢老师给予的耐心指导与帮助。
总之,此次课程设计让我获益匪浅,我将会继续把它完善做好
参考文献
[1]java语言程序设计基础篇[M]、机械工业出版社、2011、3、
[2]黄晓东、Java课程设计案例精编[M]、北京:
中国水利水电出版社,2007、5、
[3]求就是科技、Java信息管理系统开发实例导航[M]、北京:
人民邮电出版社、2009、4、
源代码清单
packagemy2048game;
importjavax、sound、sampled、*;
importjavax、swing、*;
importjava、io、*;
importjava、awt、*;
importjava、awt、event、*;
importjava、util、*;
publicclassMy2048GameextendsJFrame{
//定义自己的面板
MyPanelmp=null;
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
My2048Gamem2048=newMy2048Game();
m2048、setFocusable(true);//(设置)该对象的焦点,不能用请求焦点对象名、requestFocus();
}
//构造函数
publicMy2048Game()
{
mp=newMyPanel();
this、add(mp);
//注册鼠标监听
this、addMouseListener(mp);
//注册键盘监听
this、addKeyListener(mp);
this、setTitle("2048游戏");
this、setLocation(400,30);
this、setSize(500,800);
this、setResizable(false);//禁止调整窗口大小
this、setDefaultCloseOperation(JFrame、EXIT_ON_CLOSE);
this、setVisible(true);
}
}
classMyPanelextendsJPanelimplementsMouseListener,KeyListener,ActionListener//动作监听器一般用于监听按钮或者菜单的点击事件
{
privateintx1=0,y1=0;//按下鼠标左键的位置坐标
privateintx2=0,y2=0;//释放鼠标左键的位置坐标
privateintoption=0;//记录鼠标移动的方向
//定义组件
privateJButtonjb1;//声音图标的按钮
privatestaticbooleanjb1_flag=true;//用于控制声音开关的一个标志
privatebooleanjb1_flag2=true;//
publicstaticbooleanisJb1_flag(){
returnjb1_flag;
}
publicstaticvoidsetJb1_flag(booleanjb1_flag){
MyPanel、jb1_flag=jb1_flag;
}
privateJPanelscoresPane;//分数面板
privateJPanelmainPane;//游戏主面板
privateJLabellabelMaxScores;//"最高分"标签
privateJLabelm2048;//显示2048
privateJLabellabelScores;//当前"得分"标签
privateJLabeltips;//提示操作标签
privateJLabelcurrentScores;
privateJLabeltextScores;
privateJLabel[][]texts;//创建文本框二维数组
privateint[][]temp1=newint[4][4];//记录上一步的状态
privateint[][]temp2=newint[4][4];//记录当前的状态
privateinttimes=16;//记录剩余空方块数目
privateintscores=0;//记录分数
privateintmaxscores=0;//最高分
privateinttemp1scores=0;
privateinttemp2scores=0;
privateintp1,p2,p3,p4;//用于判断游戏就是否失败
privateintbiaoji=1;//标记能否移动
Fontfont=newFont("",Font、BOLD,14);//设置字体类型与大小(标签字体的设置)
Fontfont2=newFont("",Font、BOLD,30);//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 小游戏 Java 课程设计报告书 课程设计 报告书