java拼图游戏设计报告.docx
《java拼图游戏设计报告.docx》由会员分享,可在线阅读,更多相关《java拼图游戏设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
![java拼图游戏设计报告.docx](https://file1.bdocx.com/fileroot1/2022-12/31/b8135f95-0467-4e04-8c2d-346181abe9cf/b8135f95-0467-4e04-8c2d-346181abe9cf1.gif)
java拼图游戏设计报告
《Web程序开发》课程大作业
拼图游戏
一、题目说明
拼图游戏不仅可以帮助人们打发时间,还可以用于锻炼儿童脑力,帮助少儿开发大脑思维,拼图游戏结合了许多元素,可以图片切割,游戏拼图,游戏成功时和打破记录时的判断,同时还有游戏时间和步数的记录,并以文档形式进行保存。
在拼图时首先把图片添加到background目录下,程序会自动获取该目录下的所有文件,并加载到游戏中,进行切割后,显示在拼图按钮上。
本游戏使用Java语言设计,开发平台为JDK。
开发工具Eclipse。
JDK是SunMicrosystems针对Java开发员的产品。
自从Java推出以来,JDK已经成为使用最广泛的JavaSDK。
JDK是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。
JDK是学好Java的第一步。
从SUN的JDK5.0开始,提供了泛型等非常实用的功能,其版本也不断更新,运行效率得到了非常大的提高。
2、题意分析
因为要制作拼图游戏,所以首先要实现图片的导入。
这是通过getImage()函数来实现的,该函数有两个参数,第一个参数指明图片的路径,第二个参数指明图片的名称。
然后,因为要实现图片摆放的随意性,所以要通过initgame()函数来实现。
Initgame()函数是自写函数,在函数体内,通过调用Math.random()函数产生随机数,用来达到图片位置摆放的随意性和随机性。
最后,因为要实现人机交互.,所以首先要通过一系列函数来实现对鼠标事件的监听和响应,这是通过函数addMouseListener(this)和addMouseMotionListener(this)来完成的。
这样程序会区分用户对鼠标不同的操作,正确执行相应的功能。
游戏操作流程:
开始游戏
操作游戏
游戏完成
关闭游戏
3、设计目的
本游戏的设计目的在于休闲娱乐,玩家可以在学习、编程等工作后用来休息放松,让集中的心态得到释放,对于小孩可以通过精美的卡通的图片来吸引孩子的兴趣,加强动脑动手能力。
本游戏适玩人群老少皆宜。
4、设计特点
本游戏主要充分运用图形用户界面将一张图片切割成大小相同的九块小图,运用其中的八块,将小图的顺序和位置打乱,通过将图片移动到剩余的一格空白处而改变图片的位置,最终拼成原始图片。
五、功能说明
游戏功能图:
拼图游戏
退出游戏
选择图片
查看图片
开始游戏
本拼图游戏,运用了Java2中的图形处理技术和消息响应技术。
通过图形技术,实现图片的导入和分割。
通过消息响应机制,使程序可以响应用户的鼠标操作,进行拼图游戏的操作。
这个游戏主要分为四个模块,分别是游戏开始、查看图片、选择图片和退出游戏。
这四个摸块的功能各不一样,玩家如果在游戏过程中感觉拼图小块之间的接合不明显,玩家可以点击“查看”按钮来浏览拼图完成的效果图,从而使得游戏不会无从下手;玩家如果觉得当前拼图的画面不满意可以点击“选择”图片按钮来更换图片,或者想更改拼图的画面,玩家可以进入游戏文件夹进行更换图片文件,但是需要注意的是图片需要有格式,同时还需要将所要更改的图片切割成大小相同的九个小块,具体就不详细说了,游戏文件夹中会给大家附一个.txt文件,供大家更换图片使用,从而提高玩家乐趣。
六、主要功能程序段
importjava.awt.Rectangle;//引入类
importjava.awt.event.*;
importjavax.swing.*;
classPaneButtonextendsJButton{//继承按钮类实现加图片的方格
PaneButton(Iconicon){//构造方法进行初始化,设置图标
super(icon);
this.setSize(100,100);//设置每个方格的大小
}
publicvoidmove(Stringdirection,intsleep){//方格的移动
if(direction=="UP"){//方格向上移动
this.setLocation(this.getBounds().x,this.getBounds().y-100);
}elseif(direction=="DOWN"){//方格向下移动
this.setLocation(this.getBounds().x,this.getBounds().y+100);
}elseif(direction=="LEFT"){//方格向左移动
this.setLocation(this.getBounds().x-100,this.getBounds().y);
}else{//方格向右移动
this.setLocation(this.getBounds().x+100,this.getBounds().y);
}
}
}
publicclassPanelOfImageextendsJPanelimplementsMouseListener{//图片面板加载方格对象
booleanhasAddActionListener=false;//设置方格动作监听器的标识
PaneButtonpane[];//声明方格
RectanglenullPanel;//声明空方格,没有添图片
publicstaticintcurrentPID=1;//当前选择的图片编号
publicPanelOfImage(){//构造方法进行初始化
this.setLayout(null);//设置面板的布局为空
this.setSize(400,400);//设置面板的大小
nullPanel=newRectangle(200,200,100,100);//设置空方格的位置
pane=newPaneButton[9];//创建九个方格
Iconicon;//声明图标
for(inti=0;i<3;i++){//循环为每个方格加载图片
for(intj=0;j<3;j++){//循环列
icon=newImageIcon("pictrue/pic_"+currentPID+"_"
+(i*3+j+1)+".jpg");//创建图标
pane[i*3+j]=newPaneButton(icon);//创建方格在方格中加载图片
pane[i*3+j].setLocation(j*100,i*100);//设置方格的位置
this.add(pane[i*3+j]);//面板添加方格
}
}
this.remove(pane[8]);//移除多余的方格
}
publicbooleanisFinish(){//判断是否拼凑成功
for(inti=0;i<8;i++){
intx=pane[i].getBounds().x;
inty=pane[i].getBounds().y;
if(y/100*3+x/100!
=i)
returnfalse;
}
returntrue;
}
publicvoidreLoadPictrue(){//重新加载图片在重新选择图片时
Iconicon;
for(inti=0;i<3;i++){//循环为每个方格加载图片
for(intj=0;j<3;j++){
icon=newImageIcon("pictrue/pic_"+currentPID+"_"
+(i*3+j+1)+".jpg");
pane[i*3+j].setIcon(icon);
}
}
}
publicvoidbreakRank(){//方格打乱重新排序
while(pane[0].getBounds().x<=100&&pane[0].getBounds().y<=100){//当第一个方格距左上角近时
intx=nullPanel.getBounds().x;
inty=nullPanel.getBounds().y;
intdirection=(int)(Math.random()*4);//随机产生一个数字对应空方格的上下左右移动
if(direction==0){//空方格左移动,与左侧方格互换位置,左侧方格右移动
x-=100;//空主格左移
if(test(x,y)){
for(intj=0;j<8;j++){//循环寻打左侧的按钮
if((pane[j].getBounds().x==x)
&&(pane[j].getBounds().y==y)){//依次寻找左侧的按钮
pane[j].move("RIGHT",100);//方格向右移动一格
nullPanel.setLocation(x,y);//重新设置空方格的位置
break;//跳出循环
}
}
}
}elseif(direction==1){//空方格右移动
x+=100;
if(test(x,y)){
for(intj=0;j<8;j++){
if((pane[j].getBounds().x==x)
&&(pane[j].getBounds().y==y)){
pane[j].move("LEFT",100);//方格向左移动一格
nullPanel.setLocation(x,y);
break;
}
}
}
}elseif(direction==2){//空方格上移动
y-=100;
if(test(x,y)){
for(intj=0;j<8;j++){
if((pane[j].getBounds().x==x)
&&(pane[j].getBounds().y==y)){
pane[j].move("DOWN",100);//方格向下移动一格
nullPanel.setLocation(x,y);
break;
}
}
}
}else{//空方格下移动
y+=100;
if(test(x,y)){
for(intj=0;j<8;j++){
if((pane[j].getBounds().x==x)
&&(pane[j].getBounds().y==y)){
pane[j].move("UP",100);//方格向上移动一格
nullPanel.setLocation(x,y);
break;
}
}
}
}
}
if(!
hasAddActionListener)//判断是否添加动作事件
for(inti=0;i<8;i++){//循环为每个方格添加动作事件
pane[i].addMouseListener(this);
}
hasAddActionListener=true;
}
privatebooleantest(intx,inty){//检测方格是否在指定的范围内移动
if((x>=0&&x<=200)||(y>=0&&y<=200))
returntrue;
else
returnfalse;
}
publicvoidmouseClicked(MouseEventarg0){//鼠标点击时调用
}
publicvoidmouseEntered(MouseEventarg0){//鼠标进入组件区域时调用
}
publicvoidmouseExited(MouseEventarg0){//控制鼠标不能移动出面板的范围
}
publicvoidmouseReleased(MouseEventarg0){//鼠标按键在组件上释放时调用
}
publicvoidmousePressed(MouseEventevent){//鼠标按下时调用
PaneButtonbutton=(PaneButton)event.getSource();//获得鼠标按的方格按钮
intx1=button.getBounds().x;//获得该方格按钮的横坐标
inty1=button.getBounds().y;//获得该方格按钮的纵坐标
intnullDir_X=nullPanel.getBounds().x;//得到空方格的横坐标
intnullDir_Y=nullPanel.getBounds().y;//得到空方格的纵坐标
if(x1==nullDir_X&&y1-nullDir_Y==100)//进行比较果满足条件则交换
button.move("UP",100);//方格向上移动
elseif(x1==nullDir_X&&y1-nullDir_Y==-100)
button.move("DOWN",100);//方格向下移动
elseif(x1-nullDir_X==100&y1==nullDir_Y)
button.move("LEFT",100);//方格向左移动
elseif(x1-nullDir_X==-100&&y1==nullDir_Y)
button.move("RIGHT",100);//方格向右移动
else
return;
nullPanel.setLocation(x1,y1);//重新设置空方格的位置
this.repaint();//重新加载
if(this.isFinish()){//进行是否完成的判断
JOptionPane.showMessageDialog(this,"恭喜你,完成拼图");
for(inti=0;i<8;i++){//循环撤消鼠标事件
pane[i].removeMouseListener(this);
}
hasAddActionListener=false;
}
}
}
importjava.awt.*;//引入类
importjava.awt.event.*;
importjavax.swing.*;
publicclassTextImagePieceTogetherextendsJFrameimplementsActionListener{//操作实现拼图的游戏的类
PanelOfImageimagePanel;//声明图片面板
JPanelpanelOfSouth,panelOfLook;////声明南侧面板和查看面板
ButtonstartButton;//声明开始按钮
ButtonlookButton;//声明查看按钮
ButtonchooseButton;//选择按钮
Containercontainer;//容器,得到内容面板
publicTextImagePieceTogether(){//构造方法进行初始化
container=this.getContentPane();//获得内容面板
startButton=newButton("开始");//创建开始按钮
startButton.addActionListener(this);//添加监听事件
lookButton=newButton("查看");
lookButton.addActionListener(this);
chooseButton=newButton("选择");
chooseButton.addActionListener(this);
panelOfLook=newJPanel();//创建查看面板
panelOfLook.setLayout(null);//设置布局
Iconicon=newImageIcon("pictrue/pic_"+PanelOfImage.currentPID
+".jpg");//创建图标
JLabellabel=newJLabel(icon);//创建图标标签
label.setBounds(0,0,300,300);//设置标签的位置
panelOfLook.add(label);//添加标签
panelOfSouth=newJPanel();//创建南侧面板
panelOfSouth.setBackground(Color.red);//设置背景颜色
panelOfSouth.add(startButton);//添加开始按钮
panelOfSouth.add(lookButton);//添加查看按钮
panelOfSouth.add(chooseButton);//添加选择按钮
imagePanel=newPanelOfImage();//创建图片面板
container.add(imagePanel,BorderLayout.CENTER);
container.add(panelOfSouth,BorderLayout.SOUTH);
this.setTitle("拼图游戏");//设置标题
this.setLocation(300,200);//设置位置
this.setSize(308,365);//设置大小
this.setResizable(false);//设置是否可以通过某个用户操作调整
this.setVisible(true);//设置可视
this.setDefaultCloseOperation(3);//设置默认关闭操作
}
publicvoidactionPerformed(ActionEventevent){//按钮触发的事件
Buttonbutton=(Button)event.getSource();//获得事件按钮源
if(button==startButton){//如果是开始按钮
imagePanel.breakRank();//调用图片方格打乱方法
}elseif(button==lookButton){//如果是查看事件
if(button.getLabel()=="查看"){//如果按钮标签为"查看"
container.remove(imagePanel);//容器移除图片面板
container.add(panelOfLook);//容器添加查看标签
panelOfLook.updateUI();//不用调整大小就可以出现新增删的组件
container.repaint();//重绘
button.setLabel("返回");//设置按钮标签
}else{
container.remove(panelOfLook);//容器移除查看面板
container.add(imagePanel);//容器添加图片面板
container.repaint();//重绘
button.setLabel("查看");
}
}elseif(button==chooseButton){//如果是选择按钮
Choicechoice=newChoice();//创建选择器
choice.add("--小猫--");//添加列表项
choice.add("--QQ--");
inti=JOptionPane.showConfirmDialog(this,choice,"选择图片",
JOptionPane.OK_CANCEL_OPTION);//弹出对话框
if(i==JOptionPane.YES_OPTION){//选择对话框的确定按钮
PanelOfImage.currentPID=choice.getSelectedIndex()+1;//获得列表项的编号
imagePanel.reLoadPictrue();//图片重载
Iconicon=newImageIcon("pictrue/pic_"
+PanelOfImage.currentPID+".jpg");//获得图片图标
JLabellabel=newJLabel(icon);//根据图标设置标签
label.setBounds(0,0,300,300);//设置标签的方位
panelOfLook.removeAll();
panelOfLook.add(label);
panelOfLook.repaint();
}
}
}
publicstaticvoidmain(String[]args){//java程序主入口处
newTextImagePieceTogether();//实例化对象
}
}
七、运行结果
游戏界面:
开始游戏:
查看全图:
更换图片:
8、编程经验
本练习制作拼图游戏的实例,运用了Java2中的图形处理技术和消息响应技术。
通过图形技术,实现图片的导入和分割。
通过消息响应机制,使程序可以响应用户的鼠标操作,进行拼图游戏的操作。
9、设计体会
在编程过程中,使我更进一步理解了JAVA编程的思想,体会