白马day09-石头迷阵

准备环节

  • 创建一个模块用于开发石头迷阵游戏,模块名称取名为:stone-maze

  • 导入项目需要的资源包到src目录下:主要是一些图片文件,在image文件夹下。

  • 创建项目包:com.itheima.

1、创建石头迷阵的界面

  • 定义主界面类,MainFrame继承JFrame. 自定义窗口。

  • 初始化窗口大小

  • 初始化界面图片

  • 初始化界面菜单:系统退出,重启游戏。

2、打乱顺序

  • 打乱界面的图片顺序,让游戏具备可玩性: 使用方法如下

3、控制上下左右移动

  • 给窗口绑定上下左右按键事件

  • 控制位置的交换。

    --- 定位当前空白色块的位置。

    --- 根据用户点击的方位确定交换哪个数据,到数组中交换。

  • 重新绘制主界面的内容

    --- 让主界面按照二维数组的最新内容刷新界面

4、判断是否通关

  • 用户每操作一步,需要立即判断是否已经通关,如果通过,需要显示胜利的标记。

5、统计移动步骤、重启游戏

  • 每成功移动一步,都需要累加一次步数。

  • 定义一个变量用于累加步数,并实时展示到界面上。

6、拓展问题

数字华容道的乱序操作,并不是可以随意打乱的,必须满足一定的算法去打乱顺序,这样才是有解的,才能让玩家恢复到有序。

MainFrame
Direction
App
package com.itheima;

public class App {
    public static void main(String[] args) {
        MainFrame mainFrame = new MainFrame();//创建窗口


    }
}
package com.itheima;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class MainFrame extends JFrame {
    //目标:做一个石头迷阵的游戏
    //自定义窗口
    //设置图片的绝对路径
    public static final String PATH = "stone-maze/src/image";
    //设置二维数组,记录图片位置
    public static final int[][] arr = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 0}

    };
    public static  int[][] Windata = {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 0}

    };

    private int row;// 行
    private int column;//列
    private int count=0;//统计步数

    public MainFrame() {
        //1初始化窗口大小
        initSize();
        //5打乱数组顺序
        initArray();
        //2初始化界面图片
        initImage();
        //3初始化界面菜单
        initMenu();
        //6给窗口添加上下左右按键监听
        initKeyPress();

        //4 ???这句语句写了之后,菜单栏就有了,不知道为什么
        this.setVisible(true);//设置界面可见
    }

    private void initKeyPress() {
        //6给窗口添加上下左右按键监听
        this.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {

                int keyCode = e.getKeyCode();
                switch (keyCode) {
                    case KeyEvent.VK_UP:

                        switchAndMove(Direction.UP);
                        count++;
                        break;
                    case KeyEvent.VK_DOWN:

                        switchAndMove(Direction.DOWN);
                        count++;
                        break;
                    case KeyEvent.VK_LEFT:
                        switchAndMove(Direction.LEFT);
                        count++;
                        break;
                    case KeyEvent.VK_RIGHT:
                        switchAndMove(Direction.RIGHT);
                        count++;
                        break;
                }

            }
        });
    }

    //写一个控制数据交换和图片交换的 方法
    private void switchAndMove(Direction direction) {
        switch (direction) {
            case DOWN:
                if (row > 0) {
                    arr[row][column] = arr[row - 1][column];
                    arr[row - 1][column] = 0;
                    row--;
                }
                break;
            case UP:
                if (row < 3) {
                    arr[row][column] = arr[row + 1][column];
                    arr[row + 1][column] = 0;
                    row++;
                }
                break;
            case RIGHT:
                if (column > 0) {
                    arr[row][column] = arr[row][column - 1];
                    arr[row][column - 1] = 0;
                    column--;
                }
                break;
            case LEFT:
                if (column < 3) {
                    arr[row][column] = arr[row][column + 1];
                    arr[row][column + 1] = 0;
                    column++;
                }
                break;
        }
        //重新刷新界面
        initImage();

    }



    private void initArray() {
        //打乱数组顺序
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                int random = (int) (Math.random() * 4);
                int temp = arr[i][j];
                arr[i][j] = arr[i][random];
                arr[i][random] = temp;
            }
        }
        //定位0的位置
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] == 0) {
                    row = i;
                    column = j;
                }
            }

        }
    }

    private void initMenu() {
        //目标:在界面最上方添加菜单,退出系统和重玩游戏
        JMenuBar menuBar = new JMenuBar();//创建菜单栏
        JMenu menu = new JMenu("菜单");//创建菜单
        JMenuItem exit = new JMenuItem("退出");
        JMenuItem restart = new JMenuItem("重新开始");
        exit.addActionListener(e -> {
            System.exit(0);
        });
        restart.addActionListener(e -> {
            initArray();
            initImage();
            count=0;
            this.setVisible(true);

        });
        menu.add(exit);
        menu.add(restart);
        menuBar.add(menu);//
        this.setJMenuBar(menuBar);//添加菜单栏

    }

    private void initImage() {
        //先删除所有图片
        this.getContentPane().removeAll();
        //只要刷新界面就判断用户是否完成游戏
        if (isWin()) {
            //拿文件夹下的图片
            JLabel win = new JLabel(new ImageIcon(PATH + "/win.png"));

            win.setBounds(124, 230, 266, 88);
            this.add(win);
        }


        this.setIconImage(Toolkit.getDefaultToolkit().getImage(PATH + "/logo.png"));//设置窗口图标

        JLabel background = new JLabel(new ImageIcon(PATH + "/background.png"));//创建背景图片
        this.add(background);//添加背景图片
        background.setBounds(0, 0, 450, 484);//设置背景图片大小


        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                int number = arr[i][j];
                if (number != 0) {
                    JLabel label = new JLabel(new ImageIcon(PATH + "/" + number + ".png"));
                    background.add(label);
                    label.setBounds(20 + j * 100, 60 + i * 100, 100, 100);
                }
            }
        }

        // 刷新新图层,重新绘制
        this.repaint();
    }
//与Windata数组对比
    private boolean isWin() {

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != Windata[i][j]) {
                    return false;
                }
            }
        }

        return true;
    }

    private void initSize() {
        this.setSize(465, 580);

        this.setVisible(true);//`
        this.setLocationRelativeTo(null);//`
        this.setTitle("石头迷阵 Tony");
        this.setResizable(false);//窗口大小不可变


    }

}
package com.itheima;

public enum Direction {
    UP, DOWN, LEFT, RIGHT;
}

详细调查问卷及数据参见:https://blog.csdn.net/yushibing717/article/details/150053776?spm=1011.2415.3001.5331(1GB多数据的网盘链接)由中国人民大学老年学研究所设计、中国人民大学科学研究基金与985专项经费支持、中国人民大学中国调查与数据中心具体实施的《中国老年社会追踪调查》(ChinaLongitudinal Aging Social Survey, 以下简称CLASS)CLASS从2011年开始,基线调查于2014年8-10月在全国28个省(市、自治区)正式开展,该调查最终获得分布在全国134个县、区,462个村、居的11511份个人问卷有效样本,以及462份社区调查问卷样本。该调查以全面了解老年人基本情况、健康状况及经济状况为基础,重点把握当前老年人的养老服务需求、养老资源状况、养老观念及规划、代际关系以及社会适应等方面的信息。CLASS调查研究报告指出,目前我国老年人口中以低龄老人为主,35.31%的老年人具有初中及以上受教育程度。在身体健康状况方面,87.46%的老年人整体生活自理能力良好;75.23%的老年人自报患有慢性病;2%的老人重度失能,人数已达444万。在老年心理健康方面,近三成老年人有不同程度的孤独感,独居老年人孤独感较为严重。在养老资源方面,85.9%城乡老年人领取了养老金,但农村老年人难以依靠养老金生活;84.77%老年人拥有自己的住房。94%的老年人的首要照料者是家庭成员,9.93%的老人仍在照顾高龄父母。老年人正式劳动就业率和社会公益活动参与率均约20%。社区调查分析结果还显示还城乡养老设施覆盖率存在较大差距,老年人对社区养老服务的使用率较低;城乡社区医疗服务设施覆盖率较高,服务内容和质量有待提升,老年人对社区医疗服务的需求意愿较高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值