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

📄 magicpanel.java~35~

📁 拼图魔板由4×4或3×3个方格组成
💻 JAVA~35~
字号:
/*
*Creat on 2006 11 30
*Author: Eve
*CopyRight @ 2006
*/

import java.awt.*;       //导入所需要包
import javax.swing.*;
import java.awt.event.*;

class BPnl extends JPanel implements ItemListener    //定义BPnl类继承了容器类JPanel并实现了ItemListener接口
{      							//BPnl类:单选按钮*2&"开始玩"按钮
    JRadioButton num=new JRadioButton("数字拼图",true),       //创建具有指定文本和选择状态的单选按钮num,img.
    	img=new JRadioButton("图画拼图",false);
    ButtonGroup grp=new ButtonGroup(); //为单选按钮创建一个多斥作用域
    JButton start=new JButton("开始啦");//创建一个"开始"按钮

    public BPnl()
    {
    	setSize(300,300);
    	setLocation(0,25);//位置大小
      	num.addItemListener(this);//向num注册事件监听器对象,即将一个BPnl类添加到复选框中
    	add(num);//将按钮num增加到框架窗口上
    	img.addItemListener(this);//向img注册事件监听器对象
    	add(img);  //将按钮img增加到框架窗口上
     	grp.add(num);//将按钮num增加到多斥域中
    	grp.add(img);//将按钮img增加到多斥域中
    	add(start);//将按钮start增加到框架窗口上
            start.addActionListener(new LStart(){public void actionPerformed(ActionEvent e)
        {
            MFrame.mP.setTxtIcn(MFrame.mP.Start());  //重新设置数字和图像的位置
        }
});//点击"开始"
    }

    public void itemStateChanged(ItemEvent e)
    {
    	if(num.isSelected())//选中数字玩法
    	{
    	MFrame.mP.numSelected=true;
		MFrame.mP.setTxtIcn(MFrame.mP.Start());
		}
    	if(img.isSelected())//选中图像玩法
    	{
    	MFrame.mP.numSelected=false;
    	MFrame.mP.setTxtIcn(MFrame.mP.Start());
    	}
    }
}
/*
//////////////////////////////////////////////////////////////////////////////////
*/
class mulu extends JMenuBar     //定义mulu类设置选择菜单
{
	JMenuItem low;//定义菜单项即位于列表中的按钮
	JMenuItem high;

	public mulu()
	{
	JMenu youxi = new JMenu("难度");    //创建"选择难度菜单"菜单
	low = new JMenuItem("初级");  			//创建"初级"菜单项
	high = new JMenuItem("高级");           //创建"高级"菜单项
	add(youxi);//添加菜单
	youxi.add(low);//向菜单中添加菜单项low
	youxi.add(new JSeparator());//将一条分割线加入菜单中
	youxi.add(high);////向菜单中添加菜单项high
	low.addActionListener(new choose(this));//注册事件监听器对象
	high.addActionListener(new choose(this));
	add(youxi);
	}
}

 class choose implements ActionListener
 {
 mulu m;
 	public choose(mulu t){m=t;}
 	public void actionPerformed(ActionEvent e)
 	{
 	if(e.getSource()==m.high){MFrame.mP.size=4;MFrame.mP.setTxtIcn(MFrame.mP.Start());}//  e.getSource()最初发生 Event 的对象
 	if(e.getSource()==m.low){MFrame.mP.size=3;MFrame.mP.setTxtIcn(MFrame.mP.Start());}
 	}
 }
/*
//////////////////////////////////////////////////////////////////////////////////
*/
class mobanArrange
{
    static int size=3;	//mobanArrange类,魔板安排,默认为初级游戏
    int[] position;		//魔板位置整型数列
    int blank;			//空格位置
    boolean numSelected;//布尔量,是否选中"数字玩法"

    public mobanArrange(int t_size)//构造方法
    {
    	size=t_size;
    	position=new int[size*size];//定义数组
    	position=init();
    	blank=size*size;
    }

    static int[] init()  //生成前8位为整型1~8第9位为整型9的整型数组
    {
        int[] initialize=new int[size*size];  //初始化整型数组
    	for(int i=0;i<size*size;i++)initialize[i]=i+1;  //1-2-3-4-5-6-7-8-9
        for(int i=0;i<size*size-1;i++)
        {
            int rdm=(int)(Math.floor(Math.random()*(size*size-1-i)));//
            int temp=initialize[i];
            initialize[i]=initialize[rdm+i];
            initialize[rdm+i]=temp;
        }				       //从第i位起(8-i)位中随机选一个与第i个交换,不再移动
        return initialize;
	}

    mobanArrange moveButton(int frm)  //移动按钮
    {
        if(isNeighbour(frm,blank))//判断是否为邻居
        {
            int temp=position[frm-1];
            position[frm-1]=position[blank-1];
            position[blank-1]=temp;  //交换position数组相应的位置
            blank=frm;  //改变blank的值为起始按钮值
        }
        return this;  //返回当前对象
    }

    boolean isNeighbour(int a,int b)
    {										//是否为"邻居"
        if(Math.abs(a-b)==size)return true;//上下相邻
        if(
          (Math.abs(a-b)==1)
        &&(a*b!=size*(size+1))
        &&(a*b!=2*size*(2*size+1)
        &&(a*b!=3*size*(3*size+1)))//只支持size=3或4
        )
        {return true;}//左右相邻
        else
        {return false;}//不相邻
    }

    mobanArrange reStart()
    {//重新开始玩
        position=init();
        blank=size*size;//重新随机设置数字或图像位置,且空格为9
        return this;//返回当前对象
    }
}
/*
//////////////////////////////////////////////////////////////////////////////////
*/
class MPnl extends JPanel
{						//MPnl类,魔板按钮*9
    mobanArrange mbA;	//魔板位置的安排
    int size=3;           //初级大小
    private JButton[] b;//定义按钮组
    private final Icon                        //在按钮上固定大小图片。
    			p1=new ImageIcon("1.jpg"),
    			p2=new ImageIcon("2.jpg"),
                p3=new ImageIcon("3.jpg"),
                p4=new ImageIcon("4.jpg"),
                p5=new ImageIcon("5.jpg"),
                p6=new ImageIcon("6.jpg"),
                p7=new ImageIcon("7.jpg"),
                p8=new ImageIcon("8.jpg"),
                p9=new ImageIcon("9.jpg"),
                p10=new ImageIcon("10.jpg"),
        		p11=new ImageIcon("11.jpg"),
        		p12=new ImageIcon("12.jpg"),
        		p13=new ImageIcon("13.jpg"),
        		p14=new ImageIcon("14.jpg"),
        		p15=new ImageIcon("15.jpg"),
        		p16=new ImageIcon("");//魔板所用图像
     ////////////////////////////////////////////////////////////////////////////////////
    private final Icon[] p={p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16};
   	public boolean numSelected=true;//默认为初级游戏

   	public mobanArrange Start()		//开始
   	{
   		removeAll();
  		mbA=new mobanArrange(size);
    	b=new JButton[size*size];
    	setSize(70*size,size*70);
    	setLocation(35,100);
    	for(int i=0;i<=size*size-1;i++)add(b[i]=new JButton());//加入按钮数组
    	setLayout(new GridLayout(size,size,0,0));//布局管理器,GridLayout 类是以矩形网格形式对容器的组件进行布置的布局处理器


    	for(int i=0;i<size*size;i++)
    	{
    	b[i].addActionListener(new L(i));//加上动作监听器
    	}
        return mbA;
   	}

    public MPnl(){setTxtIcn(Start());}

    void setTxtIcn(mobanArrange mbA)
    {
    //按照形参魔板安排对象为魔板加上或更改文字或图像

    	boolean t=true;//是否成功完成游戏标志!
    	if(mbA.size==4)
    	{
    		for(int i=0;i<mbA.size*mbA.size;i++)
    		{
    	    b[i].setText(null);
    	    b[i].setIcon(null);  //清空魔板内容
    	    if(numSelected)
    	    b[i].setText(Integer.toString(mbA.position[i]));  //加上或更改数字
    	    else
    	    b[i].setIcon(p[mbA.position[i]-1]);  //或加上或更改图案
    		}
    	}
    	else
    	{
    		for(int i=0;i<mbA.size*mbA.size;i++)
    		{
    	    b[i].setText(null);
    	    b[i].setIcon(null);//清空魔板内容
    	    if(numSelected)
    	    {b[i].setText(Integer.toString(mbA.position[i]));} //加上或更改数字
    	    else
    	    {
    	    if(mbA.position[i]<4){b[i].setIcon(p[mbA.position[i]-1]);}
    	    if(7>mbA.position[i]&&mbA.position[i]>3){b[i].setIcon(p[mbA.position[i]]);}
    	    if(6<mbA.position[i]&&mbA.position[i]<10){b[i].setIcon(p[mbA.position[i]+1]);}
    	    } //或加上或更改图案
    		}

    	}
        b[mbA.blank-1].setText(null);
        b[mbA.blank-1].setIcon(p16);  //清空空格

        for(int j=0;j<size*size;j++)//检查游戏使用者是否成功移动了数字或图片
    	{
    		if(t)
    		{
    		if((j+1)!=mbA.position[j]){t=false;}//循环检查
    		}
    		else
    		{
    		break;//已经不成立,跳出循环
    		}
    	}
    if(t)//移动成功!
    	{
    	JOptionPane.showMessageDialog(null,"你成功了!");//show information
    	setTxtIcn(Start());//重新开始运行游戏
    	}
    }
}
/*
//////////////////////////////////////////////////////////////////////////////////
*/
class MFrame extends JFame    //MFrame类,窗口
{
    static MPnl mP=new MPnl();  //新建魔板安排对象,以其创建魔板面板
    public MFrame(){

    	setTitle("我的拼图游戏");
    	setSize(500,500);
        Container c=getContentPane();
        c.setLayout(null);  //撤消布局管理器
        //c.add(new TPnl());
        //c.add(new LPnl());
        c.add(new BPnl());
        c.add(mP);
        setJMenuBar(new mulu());//设置窗体的菜单栏
        addWindowListener(new LClose());
    }
}
/*
//////////////////////////////////////////////////////////////////////////////////
*/
//class LStart implements ActionListener
//{              //LStart类,"开始玩"按钮动作监听器
//    public void actionPerformed(ActionEvent e)
//    {
//    	MFrame.mP.setTxtIcn(MFrame.mP.Start());  //重新设置数字和图像的位置
//    }
//}
/*
////////////////////////////////////////////////////////////////////////////////
*/
class L implements ActionListener
{
	int i;
    public L(int t_i){i=t_i;}                  //L类,b[]按钮动作监听器
    public void actionPerformed(ActionEvent e)
    {
    	MFrame.mP.setTxtIcn(MFrame.mP.mbA.moveButton(i+1));  //移动按钮b[i]
    }
}
/*
//////////////////////////////////////////////////////////////////////////////////
*/
class LClose extends WindowAdapter
{                      //LClose类,排污口苦窗口事件监听器
    public void windowClosing(WindowEvent e){
    	System.exit(0);
    }
}
/*
//////////////////////////////////////////////////////////////////////////////////
*/
public class MagicPanel//Moban类,主程序
{
    public static void main(String[] args)
    {
        JFrame f=new MFrame();
        f.show();
    }
}

⌨️ 快捷键说明

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