java基础综合案例-石头阵游戏【Java】(附源码文件)

本文详细介绍了如何使用Java编程语言,通过面向对象和事件驱动的方式实现一个基于键盘控制的拼图游戏,涉及二维数组、随机数生成、GUI编程等知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行结果展示:

游戏玩法介绍:

        通过键盘方向键位的上下左右来控制黑色块移动,使其以此排布为四行,依次首行为1,2,3,4。第二行为6,7,8,9。第三行为10,11,12,13.第四行为14,15,16,17。移动过程计步,实现排列后出现游戏成功界面提醒。

使用知识总结:

        代码实现了一个拼图游戏的界面和逻辑。它运用了以下Java知识:

  1. 类和对象:代码中定义了一个名为MainFrame的类,继承自JFrame类,并实现了KeyListener接口。

  2. GUI编程:使用了Swing库来创建窗体和界面组件,如JFrame、JLabel、JButton等。

  3. 事件处理:实现了KeyListener接口,并重写了keyPressed()方法来处理键盘按键事件。

  4. 二维数组:使用了二维数组来表示拼图的数据和胜利状态。

  5. 随机数生成:使用了Random类来生成随机数,用于初始化拼图的位置。

  6. 图片加载:使用了ImageIcon类来加载并显示图片。

  7. 布局管理:使用了null布局来手动设置界面组件的位置和大小。

  8. 方法调用和参数传递:通过调用方法来初始化数据、绘制界面、判断胜利、移动拼图块等。

        总体来说,以上代码运用了面向对象编程、事件驱动编程、数组操作、随机数生成、图形界面编程等Java知识来实现拼图游戏的功能。值得刚学过Java相关知识的的小伙伴练一练。

代码展示:


import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class MainFrame extends JFrame implements KeyListener {

    int[][] data= {{1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    int[][] win= {{1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    int h;//0---行
    int l;//0---列
    int count;//计数
    public MainFrame(){
        // 窗体对象.addKeyListener(KeyListener实现类对象);
       this.addKeyListener(this);
        // 初始化窗体
        initFrame();
        // 初始化数据
        initData();
        // 绘制游戏界面
        paintView();
        //设置窗体可见
        setVisible(true);
    }
//数据初始化:随机
   public void initData() {
        Random r = new Random();
        //遍历二维数组
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                int randomA = r.nextInt(4);
                int randomB = r.nextInt(4);
                int temp = data [i][j];
                data[i][j] = data[randomA][randomB];
                data[randomA][randomB] =temp;
            }

        }
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
             if (data[i][j]==0){
                 h = i;
                 l = j;
             }
            }
        }

    }


    //窗体初始化
    public void initFrame(){
     setSize(514,595);//大小
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//默认关闭模式
     setTitle("小游戏1.0");//设计标题
     setAlwaysOnTop(true);//置顶最上层
     setLocationRelativeTo(null);//居中
     setLayout(null);//取消图片默认布局
    }
    //绘制界面
    public void paintView(){

        getContentPane().removeAll();//清空
       if (vicyory()){
           //加载胜利资源图
           JLabel winLabel = new JLabel(new ImageIcon("D:\\idea\\Java\\src\\com\\Test\\learn\\Stonepuzzle\\image\\win.png"));
       winLabel.setBounds(124,230,266,88);
           getContentPane().add(winLabel);
       }
       //重新开始按钮
        JButton btn = new JButton("重新游戏");
        btn.setBounds(350,20,100,20);
        getContentPane().add(btn);
        btn.setFocusable(false);//取消按钮聚焦
        btn.addActionListener(e -> {
            count=0;
            initData();
            paintView();
        });

        //计数
       JLabel scoreLabel = new JLabel("步数为:"+count);
       scoreLabel.setBounds(50,20,100,20);
        getContentPane().add(scoreLabel);

        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                JLabel image = new JLabel(new ImageIcon
                        ("D:\\idea\\Java\\src\\com\\Test\\learn\\Stonepuzzle\\image\\"+data[i][j]+".png"
                        ));
                image.setBounds(50 + 100*j,90 + 100*i,100,100);
               getContentPane().add(image);
            }
        }
        JLabel background = new JLabel(new ImageIcon("\"D:\\idea\\Java\\src\\com\\Test\\learn\\Stonepuzzle\\image\\background.png"));
        background.setBounds(26, 30, 450, 484);
        getContentPane().add(background);

        getContentPane().repaint();//刷新操作
    }
    //胜利判断
    public boolean vicyory(){
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data.length; j++) {
                if(data[i][j]!=win[i][j]){
                    return false;
                }
            }
        }
        return true;

    }
    @Override
    public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();
        move(keyCode);
        paintView();//每次移动后重新绘制
    }
     //移动逻辑
    private void move(int keyCode) {
        if(vicyory()){
            return;
        }
        if(keyCode == 37){
            if(l==0){return;}
            int  temp = data[h][l];
            data[h][l] = data[h][l-1];
            data[h][l-1] = temp;
            l--;//空白块坐标改变,列+1-----------"左移"
            count++;
        } else if (keyCode == 38) {
            if(h==0){return;}
            int  temp = data[h][l];
            data[h][l] = data[h-1][l];
            data[h-1][l] = temp;
            h--;//空白块坐标改变,列+1-----------"上移"
            count++;
        } else if (keyCode == 39) {
            if(l==3){return;}
            int  temp = data[h][l];
            data[h][l] = data[h][l+1];
            data[h][l+1] = temp;
            l++;//空白块坐标改变,列+1-----------"右移"
            count++;
        } else if (keyCode == 40) {
            if(h==3){return;}
            int  temp = data[h][l];
            data[h][l] = data[h+1][l];
            data[h+1][l] = temp;
            h++;//空白块坐标改变,列+1-----------"下移"
            count++;
        } else if (keyCode == 90) {
            data= new int[][]{{1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
        }//开挂:Ctrl+Z
    }

    @Override
    public void keyReleased(KeyEvent e) {

    } 
    @Override
    public void keyTyped(KeyEvent e) {

    }

}
public class Test {
    public static void main(String[] args) {
      new MainFrame();
    }
}

 案例源码文件:

备注:这个小综合案例源于黑马在某站发布的Java学习视频,在此基础上完成。由于代码石阵号的图片比较多,另将完整项目打包。

链接:https://pan.baidu.com/s/1IT9QnctG3LOtjW5ZSs3uig?pwd=3kbo 
提取码:3kbo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值