自制类似羊了羊游戏 (胡桃消消乐)
swing定义
Swing是一个用于创建图形用户界面(GUI)的框架,类似弹窗口
基础 模版
JFrame frame = new JFrame("My Swing Window");//创建一个窗口框架
JPanel panel = new JPanel();//创建一个面板
panel.setLayout(null);//设置页面布局为自定义(即后面需要自己定义位置,宽高)(可选)
frame.add(panel);//将面板添加到框架中
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//用于当用户取消该界面时,程序退出
frame.setSize(496, 840); // 设置窗口的大小
frame.setLocationRelativeTo(null); // 居中显示 // 设置窗口的位置(可选)
frame.setVisible(true); // 让窗口可见
frame.setResizable(false); //设置窗口自由伸缩(可选)
设置背景 这边 是用方法调用
public static void PaintBackground(JPanel panel){
//传入面板,新建一个标签 jLabel是用于静态页面(不进行交互)
JLabel jLabel1 = new JLabel(new ImageIcon("img/背景.jpg"));
// ImageIcon是背景图标,需要新建,后面是文件地址
jLabel1.setSize(480,800); //设置 标签宽高大小
jLabel1.setLocation(0,0); //设置 位置方向位置
//可选 jLabel1.setBounds(0,0,480,800);//设置标签界限 即(位置 宽高)
panel.add(jLabel1);
}
设置卡牌样式
//设置 画一张卡牌
JButton card = new JButton(new ImageIcon("img1/胡桃1.jpeg"));
//card是可以消除的,用button实现用户交互
// ImageIcon是背景图标,需要新建,后面是文件地址
card.setSize(59,66);//设置card尺寸
card.setLocation(20,50);//设置 card的位置
//自定义button样式
card.setName("胡桃搞笑");//设置button的名字
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);//设置点击是否有弹出的填充区域
panel.add(card,0);//添加到面板中,设置一个出现的索引,不设置,系统会将这个button隐藏
遍历所有卡牌
这边事先创建了一个目录文件(装取图片)
String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};
//创建一个数组存储,为后面文件名可变易找寻,这边存储的是照片的名字
代码(这边只是遍历该数组,看一下显示的情况)
String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};
for (int i = 0; i < name.length; i++) {
//为了美观 列的个数为7,
JButton card = new JButton(new ImageIcon("img1/"+name[i]+".jpeg"));
card.setSize(59,66);
card.setLocation(30+(i%7)*59,100+(i/7)*66);
//i/7为行 ,i%7为列 一个周期为列的个数,宽度为就是30+(i%7)*59 高度100+(i/7)*66
//填充
card.setName(name[i]);
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);
panel.add(card,i);
}java
运行图
设置集合
充满7*7的图层,集合可以方便乱序,我们只有将会改变的封装在Jbutton中就行
public static LinkedList<JButton> createCards(){
LinkedList<JButton> cards = new LinkedList<>();
String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};//将图片名称存储为集合
这边是因文件名和卡牌名一致,只设置一个数组
for (int j =0 ;j<9;j++) {
for (int i = 0; i < name.length; i++) {
JButton card = new JButton(new ImageIcon("img1/"+name[i]+".jpeg"));
//这边是总卡牌数是9*16张卡牌
//填充
card.setName(name[i]);//设置 Jbutton card的名称
cards.add(card);//将卡牌添加到集合中
//下面是重复性代码,后面会调用这个方法,没必要重复设置
// card.setSize(59,66);
// card.setLocation(30+(i%7)*59,100+(i/7)*63);
// card.setBorderPainted(true);//设置绘制的边框
// card.setContentAreaFilled(false);
// panel.add(card,0);
}
}
return cards;//返回集合<Jbutton>,便于操作集合乱序
}
调用方法(存储卡牌的card样式),
形成第一个图层(49张排牌))
LinkedList<JButton> cards = createCards();
Collections.shuffle(cards);//乱序
//第一层 7*7=49张卡牌
for (int i = 0; i < 49; i++) {
JButton card = cards.get(i);
card.setSize(59,66);
card.setLocation(30+(i%7)*59,100+(i/7)*63);
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);
panel.add(card,0);//将卡牌显示到第一层(底层)
}
运行图(这里是49张排牌)
第二层 排列 (36张牌)
//第二层 6*6=36张卡牌
for (int i = 0; i < 36; i++) {
JButton card = cards.get(i+49);//集合是固定的,144张,前面已以及有49张
card.setSize(59,66);
card.setLocation(59+(i%6)*59,130+(i/6)*63);
//改变位置偏移(初始位置 width:30+(60/2),可以相等与原先位置(第一层)加上宽度一半, height = 100+(60/2),可以相等与原先位置(第一层)加上宽度一半)
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);
panel.add(card,0);
}
运行图
三层(7*5=35张牌)和四层(6*4=24张牌])
//为了美观,这边错位使用半张牌差
//第三层 7*5=35
for (int i = 0; i < 35; i++) {
JButton card = cards.get(i+49+36);
card.setSize(59,66);
card.setLocation(30+(i%7)*59,160+(i/7)*63);
//5行七列 初始值 宽 就是第一层宽初始值 高需要第一层初始值的加上一个(7-5)*30=60的高度
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);
panel.add(card,0);
}
// 第四层 6*4=24
for (int i = 0; i < 24; i++) {
JButton card = cards.get(i+49+36+35);
card.setSize(59,66);
card.setLocation(60+(i%6)*59,195+(i/6)*63);
//4行6列 初始值 宽 就是第一层宽初始值+(7-6)*30(宽的一半) 高需要第一层初始值的加上一个(7-4)*30,90的高度
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);
panel.add(card,0);
}
运行图
简写 循环
主函数调用(多层数的卡牌图)
LinkedList<JButton> cards = createCards();
Collections.shuffle(cards);//第一次乱序
putCards(49,0,7,30,100,panel,cards);
putCards(36,49,6,60,130,panel,cards);
putCards(35,49+36,7,30,160,panel,cards);
putCards(24,49+36+35,6,60,195,panel,cards);
//主函数调用
编写方法(多层数的卡牌图)
public static void putCards(int count , int offset ,int cols,int x,int y ,JPanel panel, LinkedList<JButton> cards ){
for (int i = 0; i < count; i++) {
JButton card = cards.get(i+offset);
card.setSize(59,66);
card.setLocation(x+(i%cols)*59,y+(i/cols)*63);
card.setBorderPainted(true);//设置绘制的边框
card.setContentAreaFilled(false);
panel.add(card,0);
}
}
//需要改变的数量,偏移量,行,x(宽的位置),y(高的位置),
//需要导入的Jbutton,Jpanel
设置 默认图片
card.setDisabledIcon(new ImageIcon("img1/"+name[i]+"-1.jpeg"));//设置默认的图片
public static LinkedList<JButton> createCards(){
LinkedList<JButton> cards = new LinkedList<>();
String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};
for (int j =0 ;j<9;j++) {
for (int i = 0; i < name.length; i++) {
JButton card = new JButton(new ImageIcon("img1/"+name[i]+".jpeg"));
card.setDisabledIcon(new ImageIcon("img1/"+name[i]+"-1.jpeg"));//设置默认的图片
// card.setSize(59,66);
// card.setLocation(30+(i%7)*59,100+(i/7)*63);
//填充
card.setName(name[i]);
cards.add(card);
// card.setBorderPainted(true);//设置绘制的边框
// card.setContentAreaFilled(false);
// panel.add(card,0);
}
}