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