Java华容道

数字华容道


@请注意,如果需要,请备注出处@

自己好玩,写了这个数字华容道小游戏。

想法

  • 首先我们想一下我们的布局,应该使用什么布局?
  • 使用布局的时候,该怎么添加东西
  • 整体的布局中心是什么
  • 随机数的生产(nextInt()函数)
  • 怎样移动数字
  • 怎样判断旁边是否有空位置
  • 如果旁边有空位,怎样移动这个数到那个空位旁边
  • 按键内部的函数的调用

显示图


代码部分

Main.java


package MyDigitalHuarongRoad;

public class Main {
    public static void main(String[]arguments){
        new Display();
    }
}

Display.java

package MyDigitalHuarongRoad;
import java.awt.*;
import java.sql.Time;
import javax.swing.*;
public class Display extends JFrame{

    int sideX,sideY;//x,y相隔的位置
    int maxX, maxY;
    int whiteID=15;

    boolean ifStart=false;
    JButton []inSideButton;//滑块
    JButton exitButton, startButton,versionButton;//按键

    final int WIDTHS =550;//宽度
    final int HEIGHTS =550;//长度

    Display(){

        //实体化变量
        JPanel centerPanel = new JPanel();
        //容器
        JPanel belowPanel = new JPanel();
        //边界管理器
        GridLayout gg = new GridLayout();

        //菜单
        versionButton=new JButton("Version");
        exitButton=new JButton("Exit");
        startButton =new JButton("Start");
        inSideButton=new JButton[16];

        for(int i=0;i<16;i++){
            inSideButton[i] = new JButton();//申请按键
            inSideButton[i].setFont(new Font("微软雅黑",Font.BOLD,20));
        }
        //应该随机化按钮的数字

        for(int i=0;i<15;i++) {
            inSideButton[i].setText("(^_^)");//设置标题
        }

        //添加到容器并且添加事件处理
        for(int i=0;i<16;i++){
            inSideButton[i].setBackground(Color.white);
            centerPanel.add(inSideButton[i]);
            inSideButton[i].addActionListener(new DisplayAction(this));
        }

        exitButton.addActionListener(new DisplayAction(this));
        startButton.addActionListener(new DisplayAction(this));

        //设计微小布局

        belowPanel.add(startButton);
        belowPanel.add(exitButton);
        //belowPanel.add(versionButton);
        gg.setColumns(4);
        gg.setRows(4);

        centerPanel.setLayout(gg);//中心容器的布局
        JMenuBar menuBar=new JMenuBar();
        JMenu menu=new JMenu("Help");
        JMenuItem item1=new JMenuItem("Easy going");
        JMenuItem item2=new JMenuItem("Version");
        menu.add(item1);
        menu.add(item2);
        menuBar.add(menu);
        item1.addActionListener(new MenuBarAction(this));
        item2.addActionListener(new MenuBarAction(this));

        add(menuBar,BorderLayout.NORTH);
        //添加布局
        add(centerPanel,BorderLayout.CENTER);
        add(belowPanel,BorderLayout.SOUTH);


        //设计总体布局
        setBounds(200,100, WIDTHS, HEIGHTS);//设置界限大小
        setResizable(false);//设置不可更改窗口
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

        //计算两个按钮之间的距离
        sideX=inSideButton[0].getWidth();
        sideY=inSideButton[0].getHeight();

        maxX = centerPanel.getWidth();//容器的长度
        maxY = centerPanel.getHeight();//容器的高度




    }

}

/*
    做一个华容道游戏
    每点击一下可以移动
    数字华容道
    十五个数字

    底部有重新开始,退出游戏的操作

    网格布局,4*4,十五个按钮

    ▲ 每点击一下便可以进行移动,怎么样移动???

 */

DisplayAction.java

package MyDigitalHuarongRoad;

import javax.swing.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Random;

//事件响应
public class DisplayAction implements ActionListener {
    Display _D;
    DisplayAction(Display d){
        _D=d;
    }
    //重要:移动之前怎样知道要移动的下一个没有按钮
    public void actionPerformed(ActionEvent a) {
        if(a.getSource()==_D.versionButton)
            JOptionPane.showMessageDialog(null,
                    "wuyunrui make",
                    "Version",
                    JOptionPane.INFORMATION_MESSAGE
                    );
        else if (a.getSource() == _D.exitButton)
            System.exit(0);
        else if (a.getSource() == _D.startButton) {
            _D.ifStart=true;
            ArrayList<Integer> ans= new ArrayList<>();
            Random r1=new Random();
            do {
                int num = r1.nextInt(15) + 1;
                if (!ans.contains(num)) {
                    ans.add(num);
                }
            } while (ans.size() < 15);
            for(int i=0;i<_D.inSideButton.length-1;i++){
                _D.inSideButton[i].setText(String.valueOf(ans.get(i)));
            }
            _D.inSideButton[15].setText("");
            _D.whiteID=15;
            ans.clear();
        } else {
            if (_D.ifStart) {
                for (int i = 0; i < 16; i++) {
                    if (a.getSource() == _D.inSideButton[i]) {
                        if (ifCanMove(_D.inSideButton[i], _D.inSideButton[_D.whiteID])) {
                            MoveButton(_D.inSideButton[i], _D.inSideButton[_D.whiteID]);
                            _D.whiteID = i;
                        }
                    }
                }
            }
            if (ifWin()) {
                JOptionPane.showMessageDialog(null,
                        "You Win!!",
                        "You are a winner",
                        JOptionPane.INFORMATION_MESSAGE
                );
                _D.ifStart=false;
            }

        }
        if(!_D.ifStart){
            JOptionPane.showMessageDialog(null,
                    "请开始游戏",
                    "开始游戏",
                    JOptionPane.INFORMATION_MESSAGE
            );
        }
    }
    boolean ifCanMove(JButton b,JButton white) {
        if ((b.getX() - _D.sideX == white.getX() || b.getX() + _D.sideX == white.getX()) &&b.getY()==white.getY()) {
            return true;
        }
        else
            return (b.getY() - _D.sideY == white.getY() || b.getY() + _D.sideY == white.getY()) && b.getX() == white.getX();
    }
    void MoveButton(JButton b,JButton white){
        String str=b.getText();
        white.setText(str);
        b.setText("");
    }
    boolean ifWin(){
        for(int i=1;i<=15;i++){
            if(!_D.inSideButton[i - 1].getText().equals(String.valueOf(i))){
                return false;
            }
        }
        return true;
    }

}
package MyDigitalHuarongRoad;

import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.*;

public class MenuBarAction implements ActionListener {
    Display _D;
    MenuBarAction(Display t){
        _D=t;
    }
    public void actionPerformed(ActionEvent a){
        if(a.getActionCommand().equals("Easy going")){
            JOptionPane.showMessageDialog(null,
                    "1.点击“Start”按钮开始\n" +
                            "2.点击“Exit”退出\n" +
                            "3.当你移动滑块成顺序(1,2,3...15)的时候,获胜",
                    "Easy going",
                    JOptionPane.INFORMATION_MESSAGE
                    );
        }
        else if(a.getActionCommand().equals("Version")){
            JOptionPane.showMessageDialog(null,
                    "WuYunrui Yes!!!",
                    "Version",
                    JOptionPane.INFORMATION_MESSAGE
            );
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/Yunrui-blogs/p/12112358.html