有两种玩法(数字和图片)、可选择初级和高级模式、可查看英雄榜。
1. Block.java
import javax.swing.*;
import java.awt.*;
public class Block extends JTextField{
Point point;
Object object;
Block(){
setEditable(false);
setHorizontalAlignment(JTextField.CENTER);
setFont(new Font("Arial",Font.BOLD,16));
setForeground(Color.blue);
}
public void setAtPoint(Point p){
point=p;
}
public Point getAtPoint(){
return point;
}
public void setObject(Object object){
this.object=object;
if(object instanceof Integer){
Integer number=(Integer)object;
setText(""+number.intValue());
}
else if(object instanceof Image){
repaint();
}
}
public Object getObject(){
return object;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
int w=getBounds().width;
int h=getBounds().height;
try{
g.drawImage((Image)object,0,0,w,h,this);
}
catch(Exception exp){}
}
}
2. HandleImage.java
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
public class HandleImage extends JComponent{
int imageWidth,imageHeight;
Toolkit tool;
HandleImage(){
tool=getToolkit();
}
public Image [] getImages(Image image,int rows,int colums){
Image [] blockImage=new Image[rows*colums];
try{
imageWidth=image.getWidth(this);
imageHeight=image.getHeight(this);
int w=imageWidth/colums;
int h=imageHeight/rows;
int k=0;
PixelGrabber pg=null;
ImageProducer ip=null;
for(int i=0;i<rows;i++){
for(int j=0;j<colums;j++){
int pixels[]= new int[w*h];
pg=new PixelGrabber(image,j*w,i*h,w,h,pixels,0,w);
pg.grabPixels();
ip=new MemoryImageSource(w,h,pixels,0,w);
blockImage[k]=tool.createImage(ip);
k++;
}
}
}
catch(Exception ee){}
return blockImage;
}
}
3. HandleMove.java
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.applet.*;
import java.net.*;
public class HandleMove extends JPanel implements MouseListener,ActionListener {
Point [][] point;
int spendTime=0;
int grade=1;///
javax.swing.Timer recordTime;
File fileOneGrade,fileTwoGrade;
///
File musicFile=new File("hello.wav");//
URL url;//
AudioClip clip;
///
JTextField showTime;
VerifySuccess verify;
Record record;
HandleMove(){
try
{
url=musicFile.toURL();
clip=Applet.newAudioClip(url);
}
catch(Exception e)
{}
recordTime=new javax.swing.Timer(1000,this);
showTime=new JTextField(16);
showTime.setEditable(false);
showTime.setHorizontalAlignment(JTextField.CENTER);
showTime.setFont(new Font("楷体_GB2312",Font.BOLD,16));
JLabel hitMess=new JLabel("用鼠标单击方块",JLabel.CENTER);
hitMess.setFont(new Font("楷体_GB2312",Font.BOLD,18));
add(hitMess);
add(showTime);
setBackground(Color.cyan);
fileOneGrade=new File("初级魔板游戏排行榜.txt");///
fileTwoGrade=new File("高级魔板游戏排行榜.txt");///
}
public void setPoint(Point [][] p){
point=p;
}
public void initSpendTime(){
recordTime.stop();
spendTime=0;
showTime.setText(null);
/* File musicFile=new File("hello.wav");
URI uri=musicFile.toURI();/
URL url=uri.toURL("E:\chaper6");
AudioClip clip=Applet.newAudioClip(url);*/
}
public void setVerifySuccess(VerifySuccess verify){
this.verify=verify;
}
public void mousePressed(MouseEvent e){
recordTime.start();
clip.play();
Block block=null;
block=(Block)e.getSource();
int w=block.getBounds().width;
int h=block.getBounds().height;
int startI=-1,startJ=-1,endI=-1,endJ=-1;
Point startPoint=block.getAtPoint();
Point endPoint=null;
for(int i=0;i<point.length;i++){
for(int j=0;j<point[0].length;j++)
if(point[i][j].equals(startPoint)){
startI=i;
startJ=j;
break;
}
}
for(int i=0;i<point.length;i++){
for(int j=0;j<point[0].length;j++)
if(point[i][j].isHaveBlock()==false){
endI=i;
endJ=j;
endPoint=point[i][j];
break;
}
}
boolean moveCondition1=Math.abs(endI-startI)==1&&endJ==startJ;
boolean moveCondition2=Math.abs(endJ-startJ)==1&&endI==startI;
if(moveCondition1||moveCondition2){
block.setLocation(endPoint.getX(),endPoint.getY());
block.setAtPoint(endPoint);
endPoint.setBlock(block);
endPoint.setHaveBlock(true);
startPoint.setHaveBlock(false);
}
}
public void actionPerformed(ActionEvent e){
spendTime++;
showTime.setText("您的用时:"+spendTime+"秒");
}
public void mouseReleased(MouseEvent e){
if(verify.isSuccess()){
recordTime.stop();
record=new Record();
switch(grade){
case 1:record.setGradeFile(fileOneGrade);
break;
case 2:record.setGradeFile(fileTwoGrade);
break;
}
record.setTime(spendTime);
record.setVisible(true);
JOptionPane.showMessageDialog(this,"您成功了!","消息框",
JOptionPane.INFORMATION_MESSAGE );
/*record.setTime(spendTime);
record.setGradeFile(gradeFile);
record.setVisible(true);//记录英雄榜*/
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){
/* record.setTime(spendTime);
record.setGradeFile(gradeFile);
record.setVisible(true);//记录英雄榜*/
}
}
4. People.java
import java.io.*;
public class People implements Serializable,Comparable{
String name=null;
int time=0;
public People(String name,int t){
this.name=name;
time=t;
}
public int getTime(){
return time;
}
public String getName(){
return name;
}
public int compareTo(Object b){
People p=(People)b;
if((this.time-p.time)==0)
return 1;
else
return (this.time-p.time);
}
}
5. Point.java
public class Point{
int x,y;
boolean haveBlock;
Block block=null;
public Point(int x,int y){
this.x=x;
this.y=y;
}
public boolean isHaveBlock(){
return haveBlock;
}
public void setHaveBlock(boolean boo){
haveBlock=boo;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public boolean equals(Point p){
if(p.getX()==this.getX()&&p.getY()==this.getY())
return true;
else
return false;
}
public void setBlock(Block block){
this.block=block;
}
public Block getBlock(){
return block;
}
}
6. PuzzleGame.java
关注“触动青年”公众号,在对话框中搜索“魔板游戏”,即可获得相关代码链接。
7. PuzzlePad.java
import javax.swing.*;
import java.io.*;
import java.util.*;
import java.awt.*;
public class PuzzlePad extends JPanel{
Point [][] point;
Block [][] block;
int distance=100,grade=1,m=3,n=3;
HandleMove handleMove;
HandleImage handleImage;
VerifySuccess verifySuccess;
Image image;
boolean isDigitPlay;
//Record record;
public PuzzlePad(){
setBackground(Color.gray);
setLayout(null);
handleMove=new HandleMove();
handleMove.initSpendTime();
handleImage=new HandleImage();
verifySuccess=new VerifySuccess();
// record=new Record();
handleMove.setVerifySuccess(verifySuccess);
}
public HandleMove getHandleMove(){
return handleMove;
}
public void setImage(Image image){
this.image=image;
}
public void setGrade(int grade){
this.grade=grade;
handleMove.grade=grade;
if(grade==1){
m=3;
n=3;
}
else if(grade==2){
m=4;
n=4;
}
}
public int getGrade(){
return grade;
}
private void needInit(){
handleMove.initSpendTime();
removeAll();
point=new Point[m][n];
block=new Block[m][n];
int Hspace=distance,Vspace=distance;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
point[i][j]=new Point(Hspace,Vspace);
Hspace=Hspace+distance;
}
Hspace=distance;
Vspace=Vspace+distance;
}
handleMove.setPoint(point);
verifySuccess.setPoint(point);
handleMove.setVerifySuccess(verifySuccess);
int k=0;
for(int i=0;i<m;i++){
if(i<m-1)
for(int j=0;j<n;j++){
block[i][j]=new Block();
block[i][j].addMouseListener(handleMove);
k++;
}
else
for(int j=0;j<n-1;j++){
block[i][j]=new Block();
block[i][j].addMouseListener(handleMove);
k++;
}
}
for(int i=0;i<m;i++){
if(i<m-1)
for(int j=0;j<n;j++){
add(block[i][j]);
block[i][j].setSize(distance,distance);
block[i][j].setLocation(point[i][j].getX(),point[i][j].getY());
block[i][j].setAtPoint(point[i][j]);
point[i][j].setBlock(block[i][j]);
point[i][j].setHaveBlock(true);
}
else
for(int j=0;j<n-1;j++){
add(block[i][j]);
block[i][j].setSize(distance,distance);
block[i][j].setLocation(point[i][j].getX(),point[i][j].getY());
block[i][j].setAtPoint(point[i][j]);
point[i][j].setBlock(block[i][j]);
point[i][j].setHaveBlock(true);
}
}
}
public void setIsDigitPlay(){
needInit();
isDigitPlay=true;
ArrayList<Integer> numberList=new ArrayList<Integer>();
for(int k=0;k<m*n-1;k++){
numberList.add(k+1);
}
Object []object=numberList.toArray();
verifySuccess.setObject(object);
Collections.shuffle(numberList); //随机排列数字
int k=0;
for(int i=0;i<m;i++){
if(i<m-1)
for(int j=0;j<n;j++){
block[i][j].setObject(numberList.get(k));
k++;
}
else
for(int j=0;j<n-1;j++){
block[i][j].setObject(numberList.get(k));
k++;
}
}
repaint();
}
public void setIsImagePlay(){
needInit();
isDigitPlay=false;
ArrayList<Image> imageList=new ArrayList<Image>();
Image [] blockImage=handleImage.getImages(image,m,n);
for(int k=0;k<blockImage.length-1;k++){
imageList.add(blockImage[k]);
}
Object []object=imageList.toArray();
verifySuccess.setObject(object);
Collections.shuffle(imageList); //随机排列图像
int k=0;
for(int i=0;i<m;i++){
if(i<m-1)
for(int j=0;j<n;j++){
block[i][j].setObject(imageList.get(k));
block[i][j].repaint();
block[i][j].setBorder(null);
k++;
}
else
for(int j=0;j<n-1;j++){
block[i][j].setObject(imageList.get(k));
block[i][j].repaint();
block[i][j].setBorder(null);
k++;
}
}
repaint();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(isDigitPlay==false)
try{
g.drawImage(image,20+distance*(m+1),point[0][0].getY(),
distance*m,distance*n,this);
}
catch(Exception exp){}
}
}
8. Record.java
import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Record extends JDialog implements ActionListener{
int time=0;
JTextField yourName;
JLabel label=null;
JButton enter,cancel;
File gradeFile=null;
public Record(){
setBounds(100,50,550,380);
setResizable(false);
setModal(true);
setVisible(false);
enter=new JButton("确定");
cancel=new JButton("取消");
yourName=new JTextField(8);
yourName.setText("匿名");
enter.addActionListener(this);
cancel.addActionListener(this);
setLayout(new GridLayout(2,1));
label=new JLabel();
add(label);
JPanel p=new JPanel();
p.add(yourName);
p.add(enter);
p.add(cancel);
add(p);
}
public void setGradeFile(File f){
gradeFile=f;
setTitle("保存成绩到"+gradeFile.getName());
label.setText("保存成绩到"+gradeFile.getName());
validate();
}
public void setTime(int time){
this.time=time;
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==enter){
LinkedList<People> list=new LinkedList<People>();
try{
RandomAccessFile out=new RandomAccessFile(gradeFile,"rw");
out.seek(out.length());
out.writeUTF(yourName.getText());
out.writeInt(time);
out.close();
}
catch(Exception event) {
System.out.println("error");///
}
setVisible(false);
}
if(e.getSource()==cancel){
setVisible(false);
}
}
}
9. ShowRecordDialog.Java
关注“触动青年”公众号,在对话框中搜索“魔板游戏”,即可获得相关代码链接。
10. VerifySuccess.java
public class VerifySuccess{
Point [][] point;
Object [] object;
public void setPoint(Point [][] point){
this.point=point;
}
public void setObject(Object [] object){
this.object=object;
}
public boolean isSuccess(){
boolean boo=true;
int k=0;
for(int i=0;i<point.length;i++){
if(i<point.length-1){
for(int j=0;j<point[i].length;j++){
if(!(point[i][j].getBlock().getObject()==object[k])){
boo=false;
break;
}
k++;
}
}
else{
for(int j=0;j<point[i].length-1;j++){
if(!(point[i][j].getBlock().getObject()==object[k])){
boo=false;
break;
}
k++;
}
}
}
return boo;
}
}