用Java写一个小游戏

源码地址:
https://pan.baidu.com/s/18y8Et8QnahhDdz7N–0Rsg 提取码: b3tr

游戏开始图片 如下:在这里插入图片描述
游戏胜利图片 如下:
在这里插入图片描述

游戏分析:

       玩家控制键盘上下左右键,当数字按照从小到大依次排列的时候则玩家获胜
游戏功能
1、在游戏的菜单栏中设置了游戏的重新开始案件
2、制作了一个作弊键
3、设置了游戏步数计数器


编写过程用到的小知识点

JFrame、JMenuBar、JMenu、JMenuItem、JLabel、ImageIcon和继承等小知识点


代码示例

第一页代码:

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
//继承JFrame类添加监听器
public class MyJFrame extends JFrame implements KeyListener, ActionListener {
    //创建一个二维数组
    int[][] datas = new int[4][4];
    //创建一个二维数组为胜利情况下的数组用于胜利判断
    int[][] victory = new int[][]{{1, 2, 3 ,4},{5, 6, 7 ,8},{9, 10, 11 ,12},{13, 14, 15 ,0},};
    //计算步骤
    int step = 0;
    int x0 = 0;
    int y0 = 0;
    public MyJFrame(){
        //初始化窗体
        initJFrame();
        //初始化菜单
        initMenu();
        //将创建的有序数组随机排列后重新存入二维数组
        initData();
        //初始化图片
        initImage();
        //创建窗体
        this.setVisible(true);
    }
    //创建初始化窗体方法
    public void initJFrame(){
        //设置窗体宽高
        this.setSize(514,595);
        //将窗体设置在屏幕正中央
        this.setLocationRelativeTo(null);
        //将窗体覆盖过其他窗体
        this.setAlwaysOnTop(true);
        //点击叉子退出程序
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        //给窗体设置标题
        this.setTitle("石头迷阵单机版 v1.0");
        //让界面添加键盘监听
        this.addKeyListener(this);
        //取消内部居中放置方式
        this.setLayout(null);
    }
    //创建初始化菜单方法
    public void initMenu(){
        //创建菜单对象
        JMenuBar jMenuBar;
        jMenuBar = new JMenuBar();
        //设置菜单宽高
        jMenuBar.setSize(514,20);
        //创建一个选项
        JMenu jMenu = new JMenu("功能");
        //创建一个条目
        JMenuItem jMenuItem = new JMenuItem("重新游戏");
        //将创建的条目绑定监听器
        jMenuItem.addActionListener(this);
        //把条目放到选项里
        jMenu.add(jMenuItem);
        //把选项放到菜单里
        jMenuBar.add(jMenu);
        //把菜单放到窗体里
        this.setJMenuBar(jMenuBar);
    }
    //创建初始化图片方法
    public void initImage(){
        this.getContentPane().removeAll();
        JLabel label_step = new JLabel("步数" + step);
        label_step.setBounds(50, 20,100,20);
        this.add(label_step);
        if (victory()){
            ImageIcon imageIcon = new ImageIcon("image\\win.png");
            JLabel jLabel = new JLabel(imageIcon);
            jLabel.setBounds(514/2-266/2,230,266,88);
            this.add(jLabel);
        }
        for (int i = 0; i < datas.length; i++){
            for (int j = 0; j < datas[i].length; j++) {
                int data = datas[i][j];
                if (data != 0){
                    ImageIcon imageIcon = new ImageIcon("image\\"+ data +".png");
                    //创建了一个JLabel对象
                    JLabel jLabel = new JLabel(imageIcon);
                    //设置jLabel的宽高坐标
                    jLabel.setBounds(j * 100 + 50,i *100 + 90,100,100);
                    this.add(jLabel);
                }
            }
        }
        //添加背景图片
        ImageIcon  background = new ImageIcon("image\\background.png");
        JLabel backgroundJLabel = new JLabel(background);
        backgroundJLabel.setBounds(26, 30, 450,484);
        this.add(backgroundJLabel);
        //将整个界面重新绘制
        this.getContentPane().repaint();
    }
    //此方法用于判断游戏是否完成
    public boolean victory() {
        //判断数组是否相等datas和victory
        for (int i = 0; i < datas.length; i++) {
            for (int j = 0; j < datas[i].length; j++) {
                if (datas[i][j] != victory[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
    //初始化随机二维数组
    public void initData(){
        int[] temp = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, };
        for (int i = 0; i < temp.length; i++) {
            Random r = new Random();
            //因为temp的长度为16,而.nextInt(temp.length)方法的意思是生成范围为[0,16)的随机数
            int index = r.nextInt(temp.length);
            //当我们获得索引的随机数后,我们需要将索引所在元素和当前循环的元素换位置
            int number = temp[i];
            temp[i] = temp[index];
            temp[index] = number;
        }
        for (int i = 0; i < temp.length; i++) {
            //将已经打乱了后的数组存放于二维数组中保存
            datas[i /4][i % 4] = temp[i];
            if (temp[i] == 0){
                x0 = i / 4;
                y0 = i %4;
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按压
    @Override
    public void keyPressed(KeyEvent e) {

    }
    //松开
    @Override
    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        move(keyCode);
        //重新绘制界面
        initImage();
    }
    //图片移动方法
    public void move(int keyCode){
        //37代表键盘中的左键
        if (keyCode == 37){
            //防止在最右边的一列还要向右移动报错
            if (y0 == 3){
                return;
            }
            datas[x0][y0] = datas [x0][y0 + 1];
            datas[x0][y0 +1] = 0;
            y0++;
            step++;
        //38代表上
        }else if (keyCode == 38){
            if (x0 == 3){
                return;
            }
            datas[x0][y0] = datas [x0 + 1][y0];
            datas[x0 +1][y0] = 0;
            x0++;
            step++;
        //右
        }else if (keyCode == 39){
            if (y0 == 0){
                return;
            }
            datas[x0][y0] = datas [x0][y0 - 1];
            datas[x0][y0 - 1] = 0;
            y0--;
            step++;
        //下
        }else if (keyCode == 40){
            if (x0 == 0){
                return;
            }
            datas[x0][y0] = datas [x0 - 1][y0];
            datas[x0 - 1][y0] = 0;
            x0--;
            step++;
        }
        //作弊键  一步胜利   w键
        else if (keyCode == 87){
            datas = new int[][]{{1, 2, 3 ,4},{5, 6, 7 ,8},{9, 10, 11 ,12},{13, 14, 15 ,0},};
        }
    }

    @Override
    //重新游戏,把图片随机排列,步数清零
    public void actionPerformed(ActionEvent e) {
        initData();
        step = 0;
        initImage();

    }
}

第二页代码

public class App {
    public static void main(String[] args) {
        MyJFrame jFrame = new MyJFrame();
    }
}

这是我跟着网上的教学一点点写出来的,因为刚学java没多久,写个小项目练习用。
源码下载地址在评论区,免费不收币

  • 34
    点赞
  • 249
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值