数字华容道
@请注意,如果需要,请备注出处@
自己好玩,写了这个数字华容道小游戏。
想法
- 首先我们想一下我们的布局,应该使用什么布局?
- 使用布局的时候,该怎么添加东西
- 整体的布局中心是什么
- 随机数的生产(
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;
}
}
MenuBarAction.java
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
);
}
}
}