移动白块可以将相邻块换掉,最终成功后可以得到这样的结果,并且弹窗显示游戏成功。
源码如下:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.JOptionPane;
public class pintu extends Frame implements ActionListener {
Button b[][] = new Button[4][4];
public pintu() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++)
b[i][j] = new Button();
}
Font boldFont = new Font("Helvetica", Font.BOLD, 48);
int arr[] = new int[16];
for (int i = 0; i < 15; i++) {
Random t = new Random();
arr[i] = t.nextInt(15) + 1;
for (int j = 0; j < i; j++) {
if (arr[j] == arr[i]) {
i--;
break;
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
b[i][j].setLabel(arr[i * 4 + j] + "");
b[i][j].setBackground(Color.green);
b[i][j].setFont(boldFont);
b[i][j].setForeground(Color.RED);
}
}
b[3][3].setLabel("");
GridLayout i = new GridLayout(4, 4);
setLayout(i);
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 4; k++) {
add(b[j][k]);
b[j][k].addActionListener(this);
}
}
setVisible(true);
setSize(400, 400);
setTitle("数字拼图");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
new pintu();
}
public void actionPerformed(ActionEvent e) {
//这是判断游戏结束的标志
//1 2 3 4
//5 6 7 8
//9 10 11 12
//13 14 15 空白
//就弹出框框
Integer a = 1;
Integer d = 0;
for(Integer i = 0; i<4;i++) {
for(Integer j= 0 ;j < 4;j++) {
b[i][j].setLabel((a=(j+i*4)).toString());
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
if (e.getSource() == b[i][j]) {
if ((i - 1) >= 0) {
if (b[i - 1][j].getLabel().equals("")) {
b[i - 1][j].setLabel(b[i][j].getLabel());
b[i][j].setLabel("");
}
}
if ((j - 1) >= 0) {
if (b[i][j - 1].getLabel().equals("")) {
b[i][j - 1].setLabel(b[i][j].getLabel());
b[i][j].setLabel("");
}
}
if ((j + 1) < 4) {
if (b[i][j + 1].getLabel().equals("")) {
b[i][j + 1].setLabel(b[i][j].getLabel());
b[i][j].setLabel("");
}
}
if ((i + 1) < 4) {
if (b[i + 1][j].getLabel().equals("")) {
b[i + 1][j].setLabel(b[i][j].getLabel());
b[i][j].setLabel("");
}
}
}
}
}
for(int i = 0; i < 4 ;i++) {
for(int j= 0 ;j < 4;j++) {
if( b[i][j].getLabel() == (a=(j+i*4)).toString()) {
d++;
continue;
}else{
break;
}
}
}
if(d==16) {
JOptionPane.showMessageDialog(null, "标题【gameover】", "ok", JOptionPane.ERROR_MESSAGE);
}
}
}
由于笔者不大会玩此类型的游戏,所以将此游戏改成了直接一步成功,其实程序本身是没有任何问题的,需要改会最原始的功能读者请自行学习思考或者点击链接获取笔者服务:源码和详细文件获取:https://pan.baidu.com/s/1aFNohw3xMVbkwvQmBP1_OA