小游戏java课程设计报告书.docx
《小游戏java课程设计报告书.docx》由会员分享,可在线阅读,更多相关《小游戏java课程设计报告书.docx(37页珍藏版)》请在冰豆网上搜索。
![小游戏java课程设计报告书.docx](https://file1.bdocx.com/fileroot1/2022-12/15/19176539-d903-4ed8-b3bd-a9b4ccc559ed/19176539-d903-4ed8-b3bd-a9b4ccc559ed1.gif)
小游戏java课程设计报告书
?
JAVA语言程序设计?
课程设计报告
2048智力小游戏设计
专业班级:
计算机科学与技术嵌入13-1
学生XX:
卓海有
学生学号:
小组成员:
单建飞堵文斐李栋承梅孔伟
指导教师XX:
宋强
一、前言
最近以来,移动手游越来越成为当下游戏产业中重要的一环,市场也在加大对这一产业的投入,涌现出了愤怒的小鸟,水果忍者,flappybird,2048等诸多优秀的手游,然而任何一款手游能够风行,主要还是依靠其简单的操作性,因此本次java课设我选择其中的典型2048PC版作为本次课设的课题。
2048游戏规那么很简单,玩家每次可以选择上下左右其中一个方向去移动,每移动一次,所有的数字方块都会往移动的方向靠拢外,系统也会在空白的地方随机出现一个数字方块,一样数字的方块在靠拢、相撞时会相加。
系统给予的数字方块不是2就是4,玩家要想方法在这小小的16格X围中凑出“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.pareTo("")==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((x1Math.abs(y2-y1)))
{
option=2;//移动的方向向右
System.out.println("向右方向移动");
}
if((y1>y2)&&((y1-y2)>Math.abs(x1-x2)))
{
option=3;//移动的方向向上
System.out.println("向上方向移动");
}
if((y1Math.abs(x1-x2)))
{
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{
Filef=newFile("src/myRecording.txt");
if(f.exists())
{
fr=newFileReader(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;//记录鼠标移动的方向
//定义组件
privateutton1;//声音图标的按钮
privatestaticboolean1_flag=true;//用于控制声音开关的一个标志
privateboolean1_flag2=true;//
publicstaticbooleanis1_flag(){
return1_flag;
}
publicstaticvoidset1_flag(boolean1_flag){
MyPanel.1_flag=1_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);//主面板的数字字体的设置
Randomrandom=newRandom();
//构造函数
publicMyPanel()
{
super();//调用父类的构造方法
//在构造函数中创立组件
this.setLayout(null);//设置空布局
this.setBackground(newColor(2,150,220));//设置该MyPanel类的背景颜色
scoresPane=newJPanel();//创立分数显示面板
scoresPane.setBackground(newColor(5,150,220));//设置分数面板的背景颜色
scoresPane.setBounds(0,0,482,100);//设置该面板显示的位置和长宽
//scoresPane.setBorder(BorderFa