java二维数组

一、二维数组概念

二维数组是一种常见的数据结构,用于存储表格形式的数据。在Java中,二维数组可以看作是一个数组的数组。每个元素都是一个一维数组。

二、运用

定义一个二维数组

java 复制代码
int[][] array;

初始化数组

java 复制代码
array = new int[3][4]; // 创建一个3行4列的二维数组

申明并初始化一个二维数组

java 复制代码
int[][] array = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

使用双层循环来遍历数组,拿到值

java 复制代码
for (int i = 0; i < array.length; i++) { // 遍历行
    for (int j = 0; j < array[i].length; j++) { // 遍历列
        System.out.print(array[i][j] + " ");
    }
    System.out.println();
}

示例代码

以下是一个完整的示例代码,展示了如何声明、初始化、访问、修改和遍历二维数组

java 复制代码
public class TwoDimensionalArrayExample {
    public static void main(String[] args) {
        // 声明并初始化一个3行4列的二维数组
        int[][] array = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        };

        // 访问和修改元素
        int value = array[1][2]; // 访问第二行第三列的元素,值为7
        System.out.println("Value at array[1][2]: " + value);

        array[1][2] = 15; // 将第二行第三列的元素修改为15
        System.out.println("New value at array[1][2]: " + array[1][2]);

        // 遍历二维数组
        System.out.println("Array elements:");
        for (int i = 0; i < array.length; i++) { // 遍历行
            for (int j = 0; j < array[i].length; j++) { // 遍历列
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
    }
}

三、回顾拼图小游戏中的二维数组的应用

java 复制代码
package Gameoperation;
 
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
 
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
    int [][]win={
            {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}
            };
 
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem LoginItem = new JMenuItem("重新登录");
    JMenuItem CloseItem = new JMenuItem("关闭游戏");
 
    JMenuItem AccountItem = new JMenuItem("公众号");
 
    String path = "E:\\Tool\\study_java\\day12java2024-8-13 拼图游戏\\image\\animal\\animal3\\";
    // x y 用来记录空白图片的位置
    int x = 0;
    int y = 0;
 
    // 4 个为一组 添加数据
    int[][] data = new int[4][4];
 
    // 设置 步数记录
    int step = 0;
 
    //这里写游戏界面的主框架,所有游戏内容都放到这里面
    public GameJFrame() {
 
        //   初始化界面
        initJFrame();
 
        // 初始化菜单
        initMenuBar();
 
        //(打乱图片) 初始化数据
        initData();
 
        initImageView();
 
        // 显示游戏界面,建议放到最后
        this.setVisible(true);
 
    }
 
    // 初始化数据
    // 现在 需要按照二维数据 来添加图片
    private void initData() {
        // 把一个一维数组中的数据 打乱 然后放到二维数组中 4 个一组
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        Random r = new Random();
        for (int i = 0; i < tempArr.length; i++) {
            // 获取的是随机索引
            int index = r.nextInt(tempArr.length);
            /// 拿到的数据与 随机索引的值 交换
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
        }
 
        // 遍历二维数组 ,给二维数组 赋值
      for(int i=0;i<tempArr.length;i++){
          if ( tempArr[i]==0 ){
              x=i/4;
              y=i%4;
          }
          data[i/4][i%4]=tempArr[i];
      }
}
 
 
 
    private void initMenuBar() {
        // 初始化菜单 --创建这个对象的菜单
        JMenuBar jMenuBar = new JMenuBar();
 
        // 创建 菜单上面的2个选项
        JMenu functionMenu = new JMenu("功能");
        JMenu abortMenu = new JMenu("关于我们");
 
        // 创建 选项下面的对象
 
 
        // 给每一个条目邦定事件
        replayItem.addActionListener(this);
        LoginItem.addActionListener(this);
        CloseItem.addActionListener(this);
        AccountItem.addActionListener(this);
 
 
        //功能     把每一个对象都放到 上面的选项中
        functionMenu.add(replayItem);
        functionMenu.add(LoginItem);
        functionMenu.add(CloseItem);
 
 
        // 公众号
        abortMenu.add(AccountItem);
 
        // 把两个选项添加到 菜单中
        jMenuBar.add(functionMenu);
        jMenuBar.add(abortMenu);
 
        //  给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
 
 
    }
 
    public void initImageView() {
        //  删除所有的图片
        this.getContentPane().removeAll();
        if(victory()){
            // 如果胜利 需要返回一个胜利的图标
            JLabel win=new JLabel(new ImageIcon("E:\\Tool\\study_java\\day12java2024-8-13 拼图游戏\\image\\win.png"));
            win.setBounds(203,283,197,73);
            this.getContentPane().add(win);
        }
 
        //计数
        JLabel stepCount=new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);
 
 
 
 
 
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                int num = data[i][j];
                JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
                //  指定图片位置
                jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
                // 给图片添加边框
                jLabel.setBorder(new BevelBorder(1));
                // 把容器放到 界面中
                this.getContentPane().add(jLabel);
            }
        }
        JLabel backgroundLabel = new JLabel(new ImageIcon("E:\\Tool\\study_java\\day12java2024-8-13 拼图游戏\\image\\background.png"));
        backgroundLabel.setBounds(40, 40, 508, 560);
        this.getContentPane().add(backgroundLabel);
        // 刷新所有的图片
        this.getContentPane().repaint();
 
    }
 
 
    private void initJFrame() {
        //设置游戏界面的宽高
        this.setSize(683, 680);
        // 设置游戏名称
        this.setTitle("拼图小游戏.单机版1.0");
        //设置游戏置顶
        this.setAlwaysOnTop(true);
        // 设置游戏界面居中
        this.setLocationRelativeTo(null);
        // 关闭游戏
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // 取消默认的居中放置,才能按照x ,y 轴的新式添加图片
        this.setLayout(null);
        this.addKeyListener(this);
 
 
    }
 
    @Override
    public void keyTyped(KeyEvent e) {
 
    }
// 按住不松,调用这个方法
 
    @Override
    public void keyPressed(KeyEvent e) {
 
        int code = e.getKeyCode();
        if ( code == 65 ) {
            // 删去所有的图片
            this.getContentPane().removeAll();
 
            // 加载上all图片
 
            JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
            all.setBounds(83, 134, 420, 420);
            this.getContentPane().add(all);
            // 添加背景图片
            JLabel backgroundLabel = new JLabel(new ImageIcon("E:\\Tool\\study_java\\day12java2024-8-13 拼图游戏\\image\\background.png"));
            backgroundLabel.setBounds(40, 40, 508, 560);
            this.getContentPane().add(backgroundLabel);
            // 刷新图片
            this.getContentPane().repaint();
 
        }
 
    }
 
    @Override
    public void keyReleased(KeyEvent e) {
        ///   判断游戏是否已经胜利 如果胜利就不能再执行下面的代码了
 
        if (victory()){
            // 结束方法
            return;
        }
        int code = e.getKeyCode();
        // 左: 37  上:38 右:39 下:40
        if ( code == 37 ) {
            System.out.println("向左移动");
            if ( y == 3 ) {
                return;
            }
            data[x][y] = data[x][y + 1];
            data[x][y + 1] = 0;
            y++;
            //  每移动一次,step就自增
            step++;
            initImageView();
        } else if ( code == 38 ) {
            System.out.println("向上移动");
            if ( x == 3 ) {
                return;
            }
            data[x][y] = data[x + 1][y];
            data[x + 1][y] = 0;
            x++;
            //  每移动一次,step就自增
            step++;
            initImageView();
        } else if ( code == 39 ) {
            System.out.println("向右移动");
            if ( y == 0 ) {
                return;
            }
            data[x][y] = data[x][y - 1];
            data[x][y - 1] = 0;
            y--;
            //  每移动一次,step就自增
            step++;
            initImageView();
        } else if ( code == 40 ) {
            System.out.println("向下移动");
            if ( x == 0 ) {
                return;
            }
            data[x][y] = data[x - 1][y];
            data[x - 1][y] = 0;
            x--;
            //  每移动一次,step就自增
            step++;
            initImageView();
        } else if ( code == 65 ) {
            initImageView();
        } else if ( code == 87 ) {
            data = new int[][]{
                    {1, 2, 3, 4},
                    {5, 6, 7, 8},
                    {9, 10, 11, 12},
                    {13, 14, 15, 16}
            };
            initImageView();
 
        }
 
    }
    // 判断输赢 输 false ---- 赢 true
    public boolean victory() {
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
               if( data[i][j] != win[i][j]){return  false;}
               }
            }
        return true;
            
        }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        /// 获取当前被点击的 项目
        Object  obj=e.getSource();
        if(obj==replayItem){
            System.out.println("重新游戏");
 
            // 计步器 清零
            step=0;
            // 再次打乱二维数组的数据
            initData();
            // 图片再次重新加载
            initImageView();
 
 
        }
        else if(obj==LoginItem){
            System.out.println("重新登录");
            // 返回登录界面
            // 清除 游戏界面
            this.setVisible(false);
 
            // 打开登录界面
            new LoginJFrame();
 
        } else if(obj==CloseItem){
            System.out.println("关闭游戏");
            // 关闭虚拟机
            System.exit(0);
 
        }else if(obj==AccountItem){
            System.out.println("公众号");
            // 创建一个弹框对象
             JDialog jDialog = new JDialog();
             // 创建一个图片管理对象
            JLabel jLabel1 = new JLabel(new ImageIcon("E:\\Tool\\study_java\\day12java2024-8-13 拼图游戏\\image\\about.png"));
            jLabel1.setBounds(0,0,258,258);
            // 把图片添加到弹框中
            this.getContentPane().add(jLabel1);
            // 给弹窗设置大小
            jDialog.setSize(344,344);
            //给弹框置顶
            jDialog.setAlwaysOnTop(true);
            //给弹框据中
            jDialog.setLocationRelativeTo(null);
            // 弹框不关闭 就不执行下面的操作
            jDialog.setModal(true);
            // 让弹框显示出来
            jDialog.setVisible(true);
 
 
 
        }
 
    }
}
 
 
 

在外面之前写的拼图小游戏中,在图片上下左右滑动的过程中,就用到的二维数组,因为本质上就是将16张图片打乱,然后按照4*4的格式,打印在屏幕上,但是这个4×4就是一个二维数组。

java 复制代码
private void initData() {
        // 把一个一维数组中的数据 打乱 然后放到二维数组中 4 个一组
        int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
        Random r = new Random();
        for (int i = 0; i < tempArr.length; i++) {
            // 获取的是随机索引
            int index = r.nextInt(tempArr.length);
            /// 拿到的数据与 随机索引的值 交换
            int temp = tempArr[i];
            tempArr[i] = tempArr[index];
            tempArr[index] = temp;
        }

        // 遍历二维数组 ,给二维数组 赋值
      for(int i=0;i<tempArr.length;i++){
          if ( tempArr[i]==0 ){
              x=i/4;
              y=i%4;
          }
          data[i/4][i%4]=tempArr[i];
      }
}

这个就是图片滑动的核心代码,这里放到一个initiData这个类中,先将一个一维数组打乱,然后把打乱后的值,放到二维数组中

相关推荐
这个男人是小帅17 分钟前
【GAT】 代码详解 (1) 运行方法【pytorch】可运行版本
人工智能·pytorch·python·深度学习·分类
Qter_Sean19 分钟前
自己动手写Qt Creator插件
开发语言·qt
何曾参静谧23 分钟前
「QT」文件类 之 QIODevice 输入输出设备类
开发语言·qt
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
Shy9604184 小时前
Doc2Vec句子向量
python·语言模型
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习
杜杜的man5 小时前
【go从零单排】Closing Channels通道关闭、Range over Channels
开发语言·后端·golang