Java实现拼图小游戏(4)—— 打乱图片(含二维数组知识点)

一、前言

在上一篇文章中讲述了如何添加图片,本文将实现将十六个格子中的小图片打乱的效果,并且会提到有关于二维数组的知识点

二、思路

在上文就提到了,这个看起来完整的大图片,实际上是十六张小图片按照一定顺序放在4×4的格子当中的,那么我们不妨 用一个二维数组来表示每一个格子每个格子内再放入不同的图片;由于要求打乱图片,所以二维数组内的图片序号随机,具体的思路如下

  • 定义一个一维数组 tempArr,存放0-15(图片编号)
int[] tempArr = {0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
  • 定义一个随机数,用来表示索引值(范围是0-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;
        }
  • 创建一个二维数组data[i][j]来表示4×4的方格
int[][] data = new int[4][4];
  • 定义一个索引,用来提取一维数组内的值
int tempIndex = 0;
  • 遍历二维数组,为二维数组依次赋值为一维数组内的值
for (int i = 0; i < data.length; i++) {
    for (int j = 0; j < data[i].length; j++) {
        System.out.print(data[i][j] + " ");
    }
    //每行输出后要换行
    System.out.println();
}

测试一下代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、改写GameJFrame类

1.注意事项

  • 此处要注意,由于二维数组在打乱图片加载图片中都会用到,所以我们把初始化二维数组的代码写在成员位置上
    在这里插入图片描述
  • 打乱图片界面要放在初始化界面前面,否则无法实现打乱效果
  • 要用一个数去接收二维数组中的每个数(图片编号)
  • 重新定义一个方法来实现打乱图片的效果

2.完整代码

 private void initdata() {
        //初始化一维数组
        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;
        }
        //定义索引,用来提取一维数组中的数
        int tempIndex = 0;
        //遍历二维数组,填入数值
        for (int i = 0; i < data.length; i++) {
            //将每一行看作是一个一维数组,遍历一次
            for (int j = 0; j < data[i].length; j++) {
                data[i][j] = tempArr[tempIndex];
                //遍历完成后提取一维数组中下一个值
                tempIndex++;
            }
        }
    }

    private void initImage() {
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 4; j++){
                int number = data[i][j];
                JLabel jLabel = new JLabel(new ImageIcon("F:\\IDEA\\PuzzleGame\\image\\image\\animal\\animal3\\"+ number +".jpg"));
                jLabel.setBounds(105 * j, 105 * i,105,105);
                this.getContentPane().add(jLabel);
            }
        }

    }

四、测试代码

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

五、结语

本文中的二维数组实现方法还有另外一种,感兴趣的读者可以自己思考一下,具体的方法会在下一篇文章的文末写出来以供参考

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论
### 回答1: 这是一个 Java 写的拼图小游戏的完整代码示例: ``` import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Collections; public class PuzzleGame extends JFrame implements ActionListener { private JButton startButton; // 开始按钮 private JPanel gamePanel; // 游戏面板 private JButton[] buttons; // 拼图按钮 private ImageIcon[] icons; // 拼图图片 private int blankLocation; // 空白块位置 public PuzzleGame() { // 初始化窗口 setTitle("拼图小游戏"); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout()); // 初始化开始按钮 startButton = new JButton("开始游戏"); startButton.addActionListener(this); add(startButton, BorderLayout.NORTH); // 初始化游戏面板 gamePanel = new JPanel(); gamePanel.setLayout(new GridLayout(3, 3)); add(gamePanel, BorderLayout.CENTER); // 初始化拼图按钮和图片 buttons = new JButton[9]; icons = new ImageIcon[9]; for (int i = 0; i < 9; i++) { icons[i] = new ImageIcon("image" + i + ".jpg"); buttons[i] = new JButton(); buttons[i].addActionListener(this); } setVisible(true); } public void startGame() { // 随机打乱拼图顺序 ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < 9; i++) { list.add(i); } Collections.shuffle(list); // 将拼图加入游戏面板 for (int i = 0; i < 9; i++) { gamePanel.add(buttons[list.get(i)]); buttons[list.get(i)].setIcon(icons[list.get(i)]); if (list.get(i) == 0) { blankLocation = i; } } } @Override public void actionPerformed(ActionEvent e) { // 点击开始按钮 if (e ### 回答2: 拼图小游戏是一个经典的益智游戏,可以用Java编写。以下是一个简单的拼图游戏的完整代码示例: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PuzzleGame extends JFrame { private JPanel panel; private JButton[][] buttons; public PuzzleGame() { // 设置窗口属性 setTitle("拼图游戏"); setSize(400, 400); setResizable(false); setDefaultCloseOperation(EXIT_ON_CLOSE); setLocationRelativeTo(null); // 初始化面板和布局 panel = new JPanel(); panel.setLayout(new GridLayout(4, 4)); add(panel); // 创建按钮数组 buttons = new JButton[4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { buttons[i][j] = new JButton(String.valueOf(i * 4 + j + 1)); panel.add(buttons[i][j]); buttons[i][j].addActionListener(new ButtonClickListener()); } } // 设置最后一个按钮为空白 buttons[3][3].setText(""); // 打乱按钮顺序 shuffleButtons(); // 显示窗口 setVisible(true); } // 按钮点击监听器 private class ButtonClickListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton button = (JButton) e.getSource(); // 移动邻近的空白按钮 if (isEmptyNeighbour(button)) { moveButton(button); checkWin(); } } } // 检查是否成功拼图 private void checkWin() { String text = ""; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { text += buttons[i][j].getText(); } } // 判断是否完成拼图 if (text.equals("123456789101112131415")) { JOptionPane.showMessageDialog(this, "恭喜,你完成了拼图!"); System.exit(0); } } // 判断按钮是否是空白按钮的邻近位置 private boolean isEmptyNeighbour(JButton button) { int row = 0; int col = 0; // 找到按钮的行列位置 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (buttons[i][j] == button) { row = i; col = j; break; } } } // 判断是否是空白按钮的邻近位置 if (row > 0 && buttons[row - 1][col].getText().equals("")) { return true; } if (col > 0 && buttons[row][col - 1].getText().equals("")) { return true; } if (row < 3 && buttons[row + 1][col].getText().equals("")) { return true; } if (col < 3 && buttons[row][col + 1].getText().equals("")) { return true; } return false; } // 移动按钮到空白按钮位置 private void moveButton(JButton button) { int row = 0; int col = 0; // 找到按钮的行列位置 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (buttons[i][j] == button) { row = i; col = j; break; } } } // 找到空白按钮的位置 int emptyRow = 0; int emptyCol = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { if (buttons[i][j].getText().equals("")) { emptyRow = i; emptyCol = j; break; } } } // 交换按钮和空白按钮的文本内容 String tempText = buttons[row][col].getText(); buttons[row][col].setText(""); buttons[emptyRow][emptyCol].setText(tempText); } // 打乱按钮顺序 private void shuffleButtons() { for (int i = 0; i < 100; i++) { int randomRow = (int) (Math.random() * 4); int randomCol = (int) (Math.random() * 4); if (isEmptyNeighbour(buttons[randomRow][randomCol])) { moveButton(buttons[randomRow][randomCol]); } } } public static void main(String[] args) { new PuzzleGame(); } } ``` 这个代码示例实现了一个简单的拼图游戏,使用Java的图形界面库Swing创建了一个窗口,并在窗口中添加了一个4x4的按钮网格,每个按钮都被标记了1~15的数字,通过点击按钮可以将按钮移动到空白按钮的位置来完成拼图。其中,使用了`ActionListener`监听器来监听按钮的点击事件,并实现了一些方法来判断按钮的行为和完成拼图的判断。最后,在程序的主方法中创建了一个`PuzzleGame`对象来启动游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alita11101_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值