java拼图3x3

这个项目是课程设计的时候随手写的,没有去考虑过规范效率优美这些东西,但是还是写出来记录一下吧。说不定能给某个看到的人一点思路。
package dn.dmandp.maingui;

import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingConstants;

/**
*@author  杨  Email mengxiangzuojia@163.com
*@version 1.0
*@date    17 Nov 2017 17:57:53
*
*/
public class ImagicLabel extends JLabel{
	private static final long serialVersionUID = 1L;
	ImagicLabel(ImageIcon icon){
		setPreferredSize(new Dimension(100,100));
		setSize(100,100);
		setIcon(icon);
		setHorizontalAlignment(SwingConstants.CENTER);
	}
}

上面这个类没什么特殊意义,就是用来方便初始化的时候传图片。

下面是主类:

package dn.dmandp.maingui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

/**
*@author  杨  Email mengxiangzuojia@163.com
*@version 1.0
*@date    17 Nov 2017 17:14:36
*
*/
public class MainGui implements ActionListener{
	private JFrame mainFrame=new JFrame();
	private JPanel mainPanel=new JPanel();
	private JPanel workPanel=new JPanel();
	private JButton startbutton=new JButton("开始");
	private JButton topbutton=new JButton("排行榜");
	private ImagicLabel[] labels=new ImagicLabel[9];//标签数组
	private ImageIcon[] images=new ImageIcon[9];//图片数组
	private long starttime,endtime;//开始时间,结束时间
	private int currentimage=8;//当前空白图位置0~8
	private int[] order=new int[9];//顺序数组
	private int[] random=new int[9];//打乱顺序后的数组
	static Connection con=null;
	static Statement statement=null;
	static {
		String driver ="com.mysql.jdbc.Driver";//数据库相关的一些东西,存放成绩,如果不要的话也不影响主体功能
		String url="jdbc:mysql://localhost:3306/opendata";
		String sqluser="openuser";
		String sqlpassword="123abc";
		try {
			Class.forName(driver);
			con=DriverManager.getConnection(url,sqluser,sqlpassword);
			if(!con.isClosed()){
				System.out.println("Successded connecting to mysql!");
				}
				statement=con.createStatement();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/**
	 *构造函数 
	 */
	MainGui(){
		try {
			UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());//设置UI风格为系统风格
		} catch (Exception e) {
			e.printStackTrace();
		}
		mainFrame.setTitle("拼图");
		mainFrame.setSize(310,365);
		mainFrame.setLocationRelativeTo(null);
		mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		mainFrame.setResizable(false);
		
		startbutton.addActionListener(this);
		topbutton.addActionListener(this);

		workPanel.add(startbutton);
		workPanel.add(topbutton);
		
		mainPanel.setLayout(new GridLayout(3,3,2,2));
		mainPanel.setPreferredSize(new Dimension(300,300));
		for(int i=0;i<9;i++){
			order[i]=i;
			images[i]=new ImageIcon("D:/sigsaw/leimu/leimu"+i+".jpg");//这个看自己情况自行更改
			labels[i]=new ImagicLabel(images[i]);
			labels[i].addMouseListener(new MouseAdapter(){//标签鼠标监听
				@Override
				public void mouseClicked(MouseEvent e) {
					for(int click=0;click<9;click++){
						if((ImagicLabel)e.getSource()==labels[click]){
							changeAndCheck(click);
						}
					}
				}		
			});
			mainPanel.add(labels[i]);
		}
		mainFrame.add(mainPanel,BorderLayout.SOUTH);
		mainFrame.add(workPanel,BorderLayout.NORTH);
		mainFrame.setVisible(true);
	}
	/**
	 *保存成绩 
	 */
	private void savegrade(String name,Double usetime) {
		try{
			String sql="insert into jigsaw(name,usetime) values('"+name+"',"+usetime+");";
			if(statement.executeUpdate(sql)==1){
				System.out.println("successded to save");
			}else{
				System.out.println("failed to save");
			}
	}catch (Exception e) {
		e.printStackTrace();
	}finally{	
	}
	}
	/**
	 *动作监听 
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		if((JButton)e.getSource()==startbutton){
			setRandom();
			for(int i=0;i<9;i++){
				labels[i].setIcon(images[random[i]]);
				order[i]=i;
			}
			startbutton.setText("重新开始");
			currentimage=8;
			starttime=System.currentTimeMillis();
		}else if((JButton)e.getSource()==topbutton){
			getgrades();
		}
	}
	/**
	 *获取成绩 
	 */
	private void getgrades() {
		String sql="select * from jigsaw order by usetime asc";
		try {
			ResultSet rs=statement.executeQuery(sql);
			String grade="";
			int i=0;
			while(rs.next()&&i<10){
				i++;
				grade=grade+"名次:"+i+"  "+rs.getString("name")+" 用时:"+rs.getDouble("usetime")+"秒  "+rs.getTimestamp("createdate")+"\r\n";
			}
			JOptionPane.showMessageDialog(null,grade,"排行榜",JOptionPane.PLAIN_MESSAGE);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 *改变并检查是否完成 
	 */
	public void changeAndCheck(int click){
		if(click-currentimage==1||click-currentimage==3||click-currentimage==-1||click-currentimage==-3){
			labels[currentimage].setIcon(labels[click].getIcon());
			random[currentimage]=random[click];
			random[click]=8;
			currentimage=click;
			labels[click].setIcon(images[8]);
		}else{
			return;
		}
		for(int i=0;i<9;i++){
			if(random[i]!=order[i]){
				return;
			}
		}
			endtime=System.currentTimeMillis();
			String name=(String) JOptionPane.showInputDialog(null,"恭喜你完成拼图!用时"+(double)(endtime-starttime)/1000+"秒","完成啦!",JOptionPane.PLAIN_MESSAGE,null,null,"请输入你的名字");
			order[8]=0;
			if(name!=null){
				savegrade(name,(double)(endtime-starttime)/1000);
			}
	}
	/**
	 *打乱图片 
	 */
	public void setRandom(){
		for(int i=8,j=0;j<8;j++,i--){
			int index=(int)(Math.random()*i);
			random[j]=order[index];
			order[index]=order[i-1];
		}
		random[8]=8;
		int coverPairCount = 0;  
        for (int i=0;i<8;++i){  
           for (int j=i+1;j<8;++j){  
             if (random[i]>random[j])  
                coverPairCount++;  
          }  
       }
       if(coverPairCount%2!=0){
    	   int tmp=random[7];
    	   random[7]=random[6];
    	   random[6]=tmp;
       } 
	}
	/**
	 *主函数 
	 */
	public static void main(String args[]){
		SwingUtilities.invokeLater(new Runnable(){
			@Override
			public void run() {
				new MainGui();
			}
		});
	}
}
具体也没什么好说的,感觉已经注释的差不多了。就是放九个标签,每个标签一张图。点击空白图四周的标签就可以跟空白图交换~就这样吧233

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值