一、二维数组概念
二维数组是一种常见的数据结构,用于存储表格形式的数据。在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这个类中,先将一个一维数组打乱,然后把打乱后的值,放到二维数组中