1 Star 0 Fork 1

Cool_MingGe / java_study_demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Game.java 5.38 KB
一键复制 编辑 原始数据 按行查看 历史
Cool_MingGe 提交于 2021-02-09 17:30 . 2021.2.9
package imgGame;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
//jframe 搭建创建
public class Game extends JFrame{
//定义图片标签
JLabel image;
//小图片的下标
int index=0;
JPanel mainbox;
//空白按钮对象
JButton nullBtn;
public static void main(String[] args) {
Game game=new Game();
// 显示窗口
game.setVisible(true);
}
//
public Game() {
//初始化
//大小
setSize(370, 525);
// title
setTitle("拼图游戏");
//居中显示
setLocationRelativeTo(null);
// 关闭窗口程序结束
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//定义一个容器
JPanel top_panel=new JPanel();
//顶部容器定义布局方式(边界布局)
top_panel.setLayout(new BorderLayout());
//getContentPane()代表窗口对象 以下进行了顶部的摆放(北边)
getContentPane().add(top_panel,BorderLayout.NORTH);
//实例化标签
image=new JLabel();
//标签赋值
image.setIcon(new ImageIcon("images/"+index+"model.jpg"));
//我们把图片放到容器当中 西
top_panel.add(image,BorderLayout.WEST);
// 定义按钮容器
JPanel btnbox=new JPanel();
//定义布局方式为网格布局
btnbox.setLayout(new GridLayout(2,1));
//把按钮的容器放到顶部容器的中间
top_panel.add(btnbox,BorderLayout.CENTER);
//定义按钮
JButton start_btn=new JButton("开局");//开始
start_btn.addActionListener(new StartClick());
JButton next_btn=new JButton("下一张");//下一张
//进行监听的关联
next_btn.addActionListener(new NextClick());
btnbox.add(start_btn);
btnbox.add(next_btn);
//定义下边4,4网格布局容器
mainbox =new JPanel();
mainbox.setLayout(new GridLayout(4,4));
//给网格布局添加到父容器
getContentPane().add(mainbox,BorderLayout.CENTER);
//接受整理好的二维数组src
String[][] imgsrc=imgSrc();
//往网格当中放按钮
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
JButton btn=new JButton();
// 给每一个按钮命名
btn.setName(i+""+j);
btn.addActionListener(new ImgClick());
mainbox.add(btn);
//贴图
btn.setIcon(new ImageIcon(imgsrc[i][j]));
System.out.println(imgsrc[i][j]);
//判断当前空白按钮的位置并赋值
if(imgsrc[i][j].equals("images/"+index+"00.jpg")) {
nullBtn=btn;
}
}
}
}
// 定义一个整理src的方法
public String[][] imgSrc() {
//为了把src存储到数组当中
String [][] imgsrc=new String[4][4];
// 遍历二维数组
for (int i = 0; i < imgsrc.length; i++) {
for (int j = 0; j < imgsrc[i].length; j++) {
imgsrc[i][j]="images/"+index+i+j+".jpg";
}
}
return imgsrc;
}
//内部类实现监听接口
class NextClick implements ActionListener{
//具体操作方法
@Override
public void actionPerformed(ActionEvent e) {
//思路:index的迭代 ++ 0~6
index++;
if (index>5) {
index=0;
}
image.setIcon(new ImageIcon("images/"+index+"model.jpg"));
//遍历每一个按钮给每一个按钮重新换图片
String[][] imgsrc=imgSrc();
int k=0;
for (int i = 0; i < imgsrc.length; i++) {
for (int j = 0; j < imgsrc[i].length; j++) {
//拿到父容器的每一个子元素通过k++进行迭代
JButton btn= (JButton) mainbox.getComponent(k++);
btn.setIcon(new ImageIcon(imgsrc[i][j]));
//判断当前空白按钮的位置并赋值
if(imgsrc[i][j].equals("images/"+index+"00.jpg")) {
nullBtn=btn;
}
}
}
}
}
//定义开局按钮的监听
class StartClick implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
/**
* 思路:
* 把原本有规律的二维数组进行随机排列然后返回进行重新贴图
*
* */
String[][] re_src=re_src();
int k=0;
for (int i = 0; i < re_src.length; i++) {
for (int j = 0; j < re_src[i].length; j++) {
//拿到父容器的每一个子元素通过k++进行迭代
JButton btn= (JButton) mainbox.getComponent(k++);
btn.setIcon(new ImageIcon(re_src[i][j]));
//判断当前空白按钮的位置并赋值
if(re_src[i][j].equals("images/"+index+"00.jpg")) {
nullBtn=btn;
}
}
}
}
}
//图片打乱
public String [][] re_src() {
//老数组
String lod_src[][]=imgSrc();
String new_src[][]=new String[4][4];
for (int i = 0; i < new_src.length; i++) {
for (int j = 0; j < new_src[i].length; j++) {
while(new_src[i][j]==null) {
int r=(int) (Math.random()*4);
int c=(int) (Math.random()*4);
if(lod_src[r][c]!=null) {
new_src[i][j]=lod_src[r][c];
lod_src[r][c]=null;
}
}
}
}
return new_src;
}
//图片按钮监听
class ImgClick implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
//当前点击对象 拿到当前点击的按钮
JButton btn=(JButton) e.getSource();
System.out.println(btn.getName());
//怎么知道挨着不挨着呢? name 00 01....
//知道了 i-i绝对值+j-j的绝对值=1
String name= btn.getName();
//charAt(下标)来检索子字符
char name_i= name.charAt(0);
char name_j=name.charAt(1);
//拆分空白按钮的子字符
String nullname= nullBtn.getName();
char null_i=nullname.charAt(0);
char null_j=nullname.charAt(1);
//判断 i-i绝对值+j-j的绝对值=1 相邻
if(Math.abs(name_i-null_i)+Math.abs(name_j-null_j)==1) {
//空白按钮添加当前点击按钮的贴图
nullBtn.setIcon(btn.getIcon());
//覆盖当前按钮为白色贴图
btn.setIcon(new ImageIcon("images/"+index+"00.jpg"));
//把当前按钮赋值给空白按钮
nullBtn=btn;
}
}
}
}
Java
1
https://gitee.com/cool_mingge/java_study_demo.git
git@gitee.com:cool_mingge/java_study_demo.git
cool_mingge
java_study_demo
java_study_demo
java_demo

搜索帮助