资源包
思路总结
1.新建一个窗口
2.定义一个JLael(绘制背景版)
3.定义一个Jbutton(设置一个(胡桃)图片)
4.封装一个数组(存(胡桃)图片的名称-)
5.新建一个集合(存储一个胡桃的JButton)
6.封装一个方法(存一个Jbutton的样式(图片名称和地址))并导入到集合去
7.集合打乱顺序-分层(第一层48张,第二层36张,第三层35张,第四层24张)
8.压牌(界限判定)
9.在准备一个集合(用于用户操作JButton)
10.添加点击事件
最后总的项目代码(待完善)
package yang;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.LinkedList;
/**
* 目标
* 设计isCovered 压牌逻辑
*/
public class UsingYang {
public static void main(String[] args) {
JFrame frame = new JFrame("My Swing Window");
JPanel panel = new JPanel();
panel.setLayout(null);
PaintBackground(panel);
// 设置窗口的默认关闭操作(退出程序)
//设置 画一张卡牌
//JButton card = new JButton(new ImageIcon("img1/胡桃1.jpeg"));
// card.setSize(59,66);
// card.setLocation(20,50);
// //填充
// card.setName("胡桃搞笑");
// card.setBorderPainted(true);//设置绘制的边框
// card.setContentAreaFilled(false);
// panel.add(card,0);
// 遍历数组
LinkedList<JButton> cards = createCards();
shuffleCollection(cards);//打乱集合
collectionPutCard(panel,cards);//放置卡牌
allCover(cards);
//再来一个集合存储
LinkedList<JButton> belowCards = new LinkedList<>();
//添加一个点击事件
addClickAction(cards,belowCards,panel);
// //第一层 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);
//
// }
// //第二层 6*6=36张卡牌
// for (int i = 0; i < 36; i++) {
// JButton card = cards.get(i+49);
// card.setSize(59,66);
// card.setLocation(59+(i%6)*59,130+(i/6)*63);
// card.setBorderPainted(true);//设置绘制的边框
// card.setContentAreaFilled(false);
// panel.add(card,0);
//
// }
第三层 5*7=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);
// 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);
// card.setBorderPainted(true);//设置绘制的边框
// card.setContentAreaFilled(false);
// panel.add(card,0);
//
// }
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 jLabel1 = new JLabel(new ImageIcon("img/背景.jpg"));
jLabel1.setSize(480,800);
jLabel1.setLocation(0,0);
panel.add(jLabel1);
}
//
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);
}
}
return 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);
}
}
public static boolean isCovered(JButton top,JButton bottom){
int x1 = bottom.getX()-59;
int x2 = bottom.getX()+59;
int y1 = bottom.getY()-63;
int y2 = bottom.getY()+63;
int x = top.getX();//x:top的x坐标
int y = top.getY();//y:top的y坐标
return x>x1 && x<x2 && y>y1 && y<y2;
}
public static void addClickAction(LinkedList<JButton> cards, LinkedList<JButton> belowCards, JPanel panel){
for(int i=0;i<cards.size();i++){ //遍历所有卡牌
JButton card = cards.get(i); //获取每一张卡牌
card.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { //点击卡牌时自动执行
if(belowCards.size()<7){ //卡槽中的卡牌不够7,则正常操作
JButton current = (JButton)e.getSource(); //获取被点击的卡牌
cards.remove(current); //1)将当前卡牌从cards中删除
int num = belowCards.size(); //想插入卡牌的下标位置
for(int index=0;index<belowCards.size();index++){ //遍历卡槽集合
JButton card = belowCards.get(index); //获取卡槽中的每张卡牌
if(card.getName().equals(current.getName())){ //若卡槽中有相同卡牌
num = index; //修改要插入卡牌的位置
break; //结束循环
}
}
belowCards.add(num,current); //2)将当前卡牌存入到belowCards卡槽集合中
/*
若num位置后面的第2个位置卡牌的名字与当前点击的卡牌名字相同,
说明3张卡牌连续了,则需要将它们从卡槽中删除
*/
if(num+2<belowCards.size()){ //说明num后面最少有2张卡牌
JButton card = belowCards.get(num+2); //获取当前卡牌后面的第2张卡牌
//若当前卡牌后面的第2张卡牌的名称相同,说明三连了
if(card.getName().equals(current.getName())){
//将下标num的元素从卡槽集合中删除,并返回被删除的卡牌存到c1中
JButton c1 = belowCards.remove(num);
JButton c2 = belowCards.remove(num);
JButton c3 = belowCards.remove(num);
panel.remove(c1); //将c1从面板中删除
panel.remove(c2);
panel.remove(c3);
}
}
panel.updateUI(); //刷新面板,若不刷新则可能删掉的卡牌还在卡槽中显示(窗口自身问题)
for(int i=0;i<belowCards.size();i++){ //3.遍历卡槽中的所有卡牌
//+64而不是+59原因为仅仅是为了和槽子的格式对齐了好看
belowCards.get(i).setLocation(20+i*64,640); //设置卡槽中卡牌的位置
}
allCover(cards); //重新实现压牌操作
current.removeActionListener(current.getActionListeners()[0]); //删除卡牌点击事件(不要求掌握)
}else{ //够7了,则弹框提示游戏结束
JOptionPane.showMessageDialog(panel,"槽子已满,游戏结束"); //弹出提示框(不要求掌握)
}
}
});
}
}
public static void allCover(LinkedList<JButton> cards){
for(int index=0;index<cards.size();index++){ //遍历所有卡牌
JButton bottom = cards.get(index); //获取下标为index的卡牌
for(int i=index+1;i<cards.size();i++){ //遍历当前卡牌后面的所有卡牌
JButton top = cards.get(i); //获取后面的卡牌
boolean cov = isCovered(top,bottom); //判断是否压住
if(cov){ //若压住了
bottom.setEnabled(false); //设置按钮不可用
break; //结束循环,若不结束则后面的卡牌没压住走else又点亮了
}else{ //没压住
bottom.setEnabled(true); //设置按钮可用
}
}
}
}
public static void shuffleCollection(LinkedList<JButton> cards){
cards = createCards();
Collections.shuffle(cards);//第一次乱序
}
public static void collectionPutCard(JPanel panel,LinkedList<JButton> 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 restart(LinkedList<JButton> cards,JPanel panel,LinkedList<JButton> belowCard){
cards.clear();
belowCard.clear();
panel.updateUI();
collectionPutCard(panel,cards);
allCover(cards);
//再来一个集合存储
LinkedList<JButton> belowCards = new LinkedList<>();
//添加一个点击事件
addClickAction(cards,belowCards,panel);
}
}