Java拼图课程设计.docx
《Java拼图课程设计.docx》由会员分享,可在线阅读,更多相关《Java拼图课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
Java拼图课程设计
面向对象程序设计及课程设计
项目名称:
拼图
系部:
计算机系
班级:
云计算二班
姓名:
李东辉
学号:
14001433
指导教师:
李双月
开课学期:
2015-2016学年第一学期
课程成绩:
二○一五年十二月
一、项目功能:
3X3拼图游戏:
随机去除一张图片,点击空格附近的图片可将其移动至空格处。
如果8张图按顺序拼接则视为拼图成功,游戏结束。
点击“开始”键打乱图片,开始游戏;游戏内可随时点击“查看”键查看完整原图;可点击“选择”键换图;按顺序拼接8张图片后弹窗提示成功。
二、使用的软件:
开发环境:
Javase6.5
运行环境:
MyEclipse6.5
三、程序代码:
ImagePieceTogether.java
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
publicclassImagePieceTogetherextendsJFrameimplementsActionListener{//操作实现拼图的游戏的类
PanelOfImageimagePanel;//声明图片面板
JPanelpanelOfSouth,panelOfLook;//声明南侧面板和查看面板
ButtonstartButton;//声明开始按钮
ButtonlookButton;//声明查看按钮
ButtonchooseButton;//选择按钮
Containercontainer;//容器,得到内容面板
publicstaticvoidmain(String[]args){//java程序主入口处
newImagePieceTogether();//实例化对象
}
publicImagePieceTogether(){//构造方法进行初始化
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("picture/pic_"+PanelOfImage.currentPID+".jpg");//创建图标
JLabellabel=newJLabel(icon);//创建图标标签
label.setBounds(0,0,1215,717);//设置标签的位置
panelOfLook.add(label);//添加标签
panelOfSouth=newJPanel();//创建南侧面板
panelOfSouth.setBackground(Color.black);//设置背景颜色
panelOfSouth.add(startButton);//添加开始按钮
panelOfSouth.add(lookButton);//添加查看按钮
panelOfSouth.add(chooseButton);//添加选择按钮
imagePanel=newPanelOfImage();//创建图片面板
container.add(imagePanel,BorderLayout.CENTER);
container.add(panelOfSouth,BorderLayout.SOUTH);
this.setTitle("Puzzle");//设置标题
this.setLocation(100,30);//设置位置
this.setSize(1220,780);//设置大小
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("--Darius--");//添加列表项
choice.add("--Yasuo--");
choice.add("--Riven--");
choice.add("--Pantheon--");
choice.add("--Lux--");
inti=JOptionPane.showConfirmDialog(this,choice,"选择图片",JOptionPane.OK_CANCEL_OPTION);//弹出对话框
if(i==JOptionPane.YES_OPTION){//选择对话框的确定按钮
PanelOfImage.currentPID=choice.getSelectedIndex()+1;//获得列表项的编号
imagePanel.reLoadPictrue();//图片重载
Iconicon=newImageIcon("picture/pic_"+PanelOfImage.currentPID+".jpg");//获得图片图标
JLabellabel=newJLabel(icon);//根据图标设置标签
label.setBounds(0,0,1215,717);//设置标签的方位
panelOfLook.removeAll();
panelOfLook.add(label);
panelOfLook.repaint();
}
}
}
}
PanelOfImage.java
importjava.awt.*;
importjavax.swing.*;
importjava.awt.event.*;
classPaneButtonextendsJButton{//继承按钮类实现加图片的方格
PaneButton(Iconicon){//构造方法进行初始化,设置图标
super(icon);
this.setSize(405,239);//设置每个方格的大小
}
publicvoidmove(Stringdirection,intsleep){//方格的移动
if(direction=="UP"){//方格向上移动
this.setLocation(this.getBounds().x,this.getBounds().y-239);
}elseif(direction=="DOWN"){//方格向下移动
this.setLocation(this.getBounds().x,this.getBounds().y+239);
}elseif(direction=="LEFT"){//方格向左移动
this.setLocation(this.getBounds().x-405,this.getBounds().y);
}else{//方格向右移动
this.setLocation(this.getBounds().x+405,this.getBounds().y);
}
}
}
publicclassPanelOfImageextendsJPanelimplementsMouseListener{//图片面板加载方格对象
booleanhasAddActionListener=false;//设置方格动作监听器的标识
PaneButtonpane[];//声明方格
RectanglenullPanel;//声明空方格,没有添图片
publicstaticintcurrentPID=1;//当前选择的图片编号
publicPanelOfImage(){//构造方法进行初始化
this.setLayout(null);//设置面板的布局为空
this.setSize(810,478);//设置面板的大小
nullPanel=newRectangle(810,478,405,239);//设置空方格的位置
pane=newPaneButton[9];//创建九个方格
Iconicon;//声明图标
for(inti=0;i<3;i++){//循环为每个方格加载图片
for(intj=0;j<3;j++){//循环列
icon=newImageIcon("picture/pic_"+currentPID+"_"
+(i*3+j+1)+".jpg");//创建图标
pane[i*3+j]=newPaneButton(icon);//创建方格在方格中加载图片
pane[i*3+j].setLocation(j*405,i*239);//设置方格的位置
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/239*3+x/405!
=i)
returnfalse;
}
returntrue;
}
publicvoidreLoadPictrue(){//重新加载图片在重新选择图片时
Iconicon;
for(inti=0;i<3;i++){//循环为每个方格加载图片
for(intj=0;j<3;j++){
icon=newImageIcon("picture/pic_"+currentPID+"_"
+(i*3+j+1)+".jpg");
pane[i*3+j].setIcon(icon);
}
}
}
publicvoidbreakRank(){//方格打乱重新排序
while(pane[0].getBounds().x<=405&&pane[0].getBounds().y<=239){//当第一个方格距左上角近时
intx=nullPanel.getBounds().x;
inty=nullPanel.getBounds().y;
intdirection=(int)(Math.random()*4);//随机产生一个数字对应空方格的上下左右移动
if(direction==0){//空方格左移动,与左侧方格互换位置,左侧方格右移动
x-=405;//空主格左移
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",405);//方格向右移动一格
nullPanel.setLocation(x,y);//重新设置空方格的位置
break;//跳出循环
}
}
}
}elseif(direction==1){//空方格右移动
x+=405;
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",405);//方格向左移动一格
nullPanel.setLocation(x,y);
break;
}
}
}
}elseif(direction==2){//空方格上移动
y-=239;
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",239);//方格向下移动一格
nullPanel.setLocation(x,y);
break;
}
}
}
}else{//空方格下移动
y+=239;
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",239);//方格向上移动一格
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<=405)||(y>=0&&y<=239))
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==239)//进行比较果满足条件则交换
button.move("UP",239);//方格向上移动
elseif(x1==nullDir_X&&y1-nullDir_Y==-239)
button.move("DOWN",239);//方格向下移动
elseif(x1-nullDir_X==405&y1==nullDir_Y)
button.move("LEFT",405);//方格向左移动
elseif(x1-nullDir_X==-405&&y1==nullDir_Y)
button.move("RIGHT",405);//方格向右移动
else
return;
nullPanel.setLocation(x1,y1);//重新设置空方格的位置
this.repaint();//重新加载
if(this.isFinish()){//进行是否完成的判断
JOptionPane.showMessageDialog(this,"Congratulations!
");
for(inti=0;i<8;i++){//循环撤消鼠标事件
pane[i].removeMouseListener(this);
}
hasAddActionListener=false;
}
}
}