📄 getimagegame.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 + -