⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getimagegame.java

📁 java编写的拼图游戏
💻 JAVA
字号:
/*
   实验二十三 拼图游戏
   可以选择原始图像 按上、下、左、右键Play
 */
import java.util.*;
import java.awt.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileView;

public class GetImageGame
{
	public static void main(String[] args)
	{
		IFrame frame = new IFrame();
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setResizable(false);
	}
}

class IFrame extends JFrame
{
	public IFrame()
	{
		setTitle("拼图游戏");
		setSize(550,375);
		setLayout(null);
		keyListener=new KeyHandler();
		addKeyListener(keyListener);
		setFocusable(true);

		img = new Image[9];
		num = new int[9];
		panel = new IPanel[9];
		panelPlace = new int[3];
		panelPlace[0]=5;
		panelPlace[1]=110;
		panelPlace[2]=215;
		//分隔图像的面板
		for(int i=0;i<9;i++)
		{
			num[i]=i;
			int h=i%3,z=i/3;
			panel[i]=new IPanel(null);
			add(panel[i]);
			panel[i].setBounds(panelPlace[h],panelPlace[z],100,100);
		}

        // 添加打开菜单及子窗口
		final JFileChooser chooser = new JFileChooser();
		final ExtensionFileFilter filter = new ExtensionFileFilter();
        filter.addExtension("jpg");
        filter.addExtension("gif");
        filter.setDescription("图片");
        chooser.setFileFilter(filter);
        chooser.setCurrentDirectory(new File("."));

		JMenuBar menuBar = new JMenuBar();
		setJMenuBar(menuBar);

		file = new JMenu("选择源图");
		menuBar.add(file);

		JMenuItem open = new JMenuItem("打开");
		open.addActionListener(new
			ActionListener()
			{
				public void actionPerformed(ActionEvent event)
				{
					int result = chooser.showDialog(null, "确定");;
					if (result == JFileChooser.APPROVE_OPTION)
					{
				        String imageAdr = chooser.getSelectedFile().getPath();
						readImage(imageAdr);
					}
				}
			});
		file.add(open);
        //添加按钮
		beginButton = new JButton("开始");
		beginButton.setEnabled(false);
		upButton = new JButton("上");
		leftButton = new JButton("左");
		downButton = new JButton("下");
		rightButton = new JButton("右");
		setButton(false);
		JButton exitButton = new JButton("退出");

		BAction upAction = new BAction(8);
		BAction leftAction = new BAction(4);
		BAction downAction = new BAction(2);
		BAction rightAction = new BAction(6);
		BAction beginAction = new BAction(1);
		BAction exitAction = new BAction(-1);

        //添加按钮位置
		add(upButton);upButton.setBounds(400,100,50,30);
		upButton.addActionListener(upAction);
		add(downButton);downButton.setBounds(400,135,50,30);
		downButton.addActionListener(downAction);
		add(leftButton);leftButton.setBounds(340,135,50,30);
		leftButton.addActionListener(leftAction);
		add(rightButton);rightButton.setBounds(460,135,50,30);
		rightButton.addActionListener(rightAction);
		add(beginButton);beginButton.setBounds(340,270,90,30);
		beginButton.addActionListener(beginAction);
		add(exitButton);exitButton.setBounds(440,270,60,30);
		exitButton.addActionListener(exitAction);

        //游戏步数记录
		JLabel label = new JLabel("步数");
		add(label);
		label.setBounds(340,5,30,30);
		countField = new JTextField();
		countField.setEditable(false);
		add(countField);
		countField.setBounds(370,5,40,20);

        //游戏时间记录
		label = new JLabel("时间");
		add(label);
		label.setBounds(430,5,30,30);
		timeField = new JTextField();
		timeField.setEditable(false);
		add(timeField);
		timeField.setBounds(460,5,40,20);

		endLabel = new JLabel("  o(∩_∩)o... ");
		menuBar.add(endLabel);
	}

    //添加键盘事件监听器——开始、退出、移动按钮
    public void actionPerform(int listener)
	{
		int h=empty%3,z=empty/3;
		//找出可活动面板
		if(listener==1)
		{
			if(beginButton.getText().equals("重新开始"))
								reStart();
			else				start();
			return ;
		}
		else if(listener==2)
		{
			z--;
			if(z<0)	return ;
		}
		else if(listener==8)
		{
			z++;
			if(z>2)	return ;
		}
		else if(listener==6)
		{
			h--;
			if(h<0)	return ;
		}
		else if(listener==4)
		{
			h++;
			if(h>2)	return ;
		}
		else	return;
		swap(empty,z*3+h);
		empty=z*3+h;
		Finish();
		requestFocus();
	}

	public void reStart()
	{
		for(int i=0;i<9;i++)
		{
			panel[i].setImage(img[i]);
			num[i]=i;
		}
		beginButton.setText("开始");

		file.setEnabled(true);
		times = new timeThread();
		times.start();
		count=0;
		setButton(false);
	}

	public void start()
	{
		reStart();
		requestFocus();
		countField.setText("0");
		timeField.setText("0");
		endLabel.setText(" ---祝 你 成 功 !!!");
		setButton(true);
		//打乱拼块
		for(int i=0;i<8;i++)
		{
			int rand = (int)(Math.random()*(8-i));
			swap(rand,7-i);
		}

		file.setEnabled(false);
		empty=8;
		panel[empty].setImage(null);
		beginButton.setText("重新开始");
		times = new timeThread();
		times.start();
	}
	public void swap(int i,int j)
	{
		Image image = panel[i].getImage();
		panel[i].setImage(panel[j].getImage());
		panel[j].setImage(image);
		int temp=num[i];
		num[i]=num[j];
		num[j]=temp;
	}
	public void Finish()
	{
		count++;
		countField.setText(""+count);
		for(int i=0;i<9;i++)
				if(num[i]!=i)	return ;
		endLabel.setText(" 恭喜你 ! 成功了 o(∩_∩)o...");
		JOptionPane.showMessageDialog(null,"恭喜你 成功了!!!");
		reStart();
	}
	public void setButton(boolean b)
	{
		upButton.setEnabled(b);
		downButton.setEnabled(b);
		leftButton.setEnabled(b);
		rightButton.setEnabled(b);
	}
	//读取原图像 并分隔成3*3方格
	public void readImage(String sfile)
	{
		try
		{
			ImageFilter cropFilter;

			BufferedImage bi = ImageIO.read(new File(sfile));
			int srcWidth = bi.getHeight(); // 源图宽度
			int srcHeight = bi.getWidth(); // 源图高度
			Image image1 = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);
			Image image = image1.getScaledInstance(300, 300,Image.SCALE_DEFAULT);
			for (int i=0;i<3;i++)
			for (int j=0;j<3;j++)
			{
				// 四个参数分别为图像起点坐标和宽高
				// 即: CropImageFilter(int x,int y,int width,int height)
				cropFilter = new CropImageFilter(j * 100, i * 100,100, 100);
				img[i*3+j] = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(image.getSource(),cropFilter));
				panel[i*3+j].setImage(img[i*3+j]);
			}
		}
		catch (Exception e)//捕捉异常
		{
			System.out.println("图片读取失败");
  		}
  		beginButton.setEnabled(true);
	}
	private class BAction implements ActionListener
	{
		public BAction(int i)
		{
			listener = i;
		}
		public void actionPerformed(ActionEvent event)
		{
			if(listener==-1)
								System.exit(0);
			actionPerform(listener);
		}
		private int listener;
	}
	private class KeyHandler extends KeyAdapter
	{
		public void keyPressed(KeyEvent event)
		{
			if(beginButton.getText().equals("开始"))	return;
			int keyCode=event.getKeyCode(),action = 0;
			if(keyCode==KeyEvent.VK_LEFT)  		action=4;
			else if(keyCode==KeyEvent.VK_RIGHT) action=6;
			else if(keyCode==KeyEvent.VK_UP)	action=8;
			else if(keyCode==KeyEvent.VK_DOWN) 	action=2;
			actionPerform(action);
		}
	}
	private class timeThread extends Thread
	{
		public void run()
		{
			int t=0;
			while(beginButton.getText().equals("重新开始"))
			{
				try{
						sleep(1000);
				}
				catch(InterruptedException e){}
				t++;
				timeField.setText(""+t);
			}
			return;
		}
	}
	private timeThread times;
	private Image[] img;
	private int[] num;
	private int[] panelPlace;
	private IPanel[] panel;
	private JButton beginButton;
	private JButton upButton;
	private JButton downButton;
	private JButton leftButton;
	private JButton rightButton;
	private int empty;
	private JMenu file;
	private int count;
	private int time;
	private JTextField countField;
	private JTextField timeField;
	private JLabel endLabel;
	private KeyHandler keyListener;
}

class IPanel extends JPanel
{
	public IPanel(Image image)
	{
		img = image;
	}
	public void paintComponent(Graphics g)
	{
		super.paintComponent(g);

		g.drawImage(img,0,0,null);
	}
	public Image getImage(){ return img; }
	public void setImage(Image image)
	{
		img = image;
		repaint();
	}
	private Image img;
}

class ExtensionFileFilter extends FileFilter
{
	public void addExtension(String extension)
	{
		if(!extension.startsWith("."))
				extension="."+extension;
		extensions.add(extension.toLowerCase());
	}
    //打开文件的描述
	public void setDescription(String a)
	{
		description=a;
	}

	public String getDescription()
	{
		return description;
	}

	public boolean accept(File f )
	{
		if(f.isDirectory())  return true;
		String name=f.getName().toLowerCase();

		for(String extension:extensions)
		{
			if(name.endsWith(extension))  return true;
		}
		return false;
	}

	private String description = "";
	private ArrayList<String> extensions=new ArrayList<String>();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -