拼图游戏源码

主界面源码GameJFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
package top.lyzlove;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

public class GameJFrame extends JFrame implements KeyListener, ActionListener {
int[][] data = new int[4][4];
int x = 0;
int y = 0;
//定义路径
String path = "../gameDemo/image/animal/animal1/";
int[][] win = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0}
};
//计步器
int count = 0;
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");

JMenuItem accountItem = new JMenuItem("本人照片");
public GameJFrame() {
//初始化界面
initJFrame();
//菜单初始化
initMenuBar();
//初始化数据
intData();
//初始化图片
initImage();

this.setVisible(true);


}


private void intData() {
//图片与数字相对应,打乱数组
int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}

//将一维数组元素添加至二维数组
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
x = i / 4;
y = i % 4;
}
data[i / 4][i % 4] = arr[i];


}
}

private void initImage() {
this.getContentPane().removeAll();

if (victory()) {
//显示图片
JLabel winJLale = new JLabel(new ImageIcon("../gameDemo/image/win.png"));
winJLale.setBounds(203, 283, 197, 73);
this.getContentPane().add(winJLale);
}

JLabel countJLable = new JLabel("步数:" + count);
countJLable.setBounds(50, 30, 100, 20);
this.getContentPane().add(countJLable);


for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int index = data[i][j];
JLabel jLabel = new JLabel(new ImageIcon(path + index + ".jpg"));
//指定图片位置
jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
this.getContentPane().add(jLabel);
}

}
//背景图片
JLabel bg = new JLabel(new ImageIcon("../gameDemo/image/background.png"));
bg.setBounds(40, 40, 508, 560);
this.getContentPane().add(bg);
this.getContentPane().repaint();

}

private void initMenuBar() {
JMenuBar jMenuBar = new JMenuBar();

JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于");


//添加选项
functionJMenu.add(reLoginItem);
functionJMenu.add(replayItem);
functionJMenu.add(closeItem);

aboutJMenu.add(accountItem);

//绑定事件

replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);

jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
this.setJMenuBar(jMenuBar);
}

private void initJFrame() {
//设置界面的宽高
this.setSize(603, 680);
//设置界面的标题
this.setTitle("拼图游戏 v1.0 作者:刘源昭 ");
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消默认居中
this.setLayout(null);
//添加一个键盘监听事件
this.addKeyListener(this);

}

@Override
public void keyTyped(KeyEvent e) {

}

@Override
public void keyPressed(KeyEvent e) {
//键盘不松开出发
int code = e.getKeyCode();
if (code == 65) {
//删除图片
this.getContentPane().removeAll();
//添加背景
JLabel all = new JLabel(new ImageIcon("../gameDemo/image/animal/animal1/all.jpg"));
all.setBounds(83, 134, 420, 420);
this.getContentPane().add(all);
//添加背景图片
JLabel bg = new JLabel(new ImageIcon("../gameDemo/image/background.png"));
bg.setBounds(40, 40, 508, 560);
this.getContentPane().add(bg);
//刷新
this.getContentPane().repaint();

}


}

@Override
public void keyReleased(KeyEvent e) {
//游戏结束,不在执行下去
if (victory()) {
return;
}

//37← 38 上 39 右 40下
int code = e.getKeyCode();
if (code == 37) {
// System.out.println("向左移动");
if (y == 3) {
return;
}
data[x][y] = data[x][y + 1];
data[x][y + 1] = 0;
y++;
count++;
initImage();
} else if (code == 38) {
//在最下方向上移动需要进行判断
// System.out.println("上");
if (x == 3) {
return;
}
data[x][y] = data[x + 1][y];
data[x + 1][y] = 0;
x++;
count++;
initImage();
} else if (code == 39) {
// System.out.println("右");
if (y == 0) {
return;
}
data[x][y] = data[x][y - 1];
data[x][y - 1] = 0;
y--;
count++;
initImage();
} else if (code == 40) {
if (x == 0) {
return;
}
// System.out.println("下");
data[x][y] = data[x - 1][y];
data[x - 1][y] = 0;
x--;
count++;
initImage();
} else if (code == 65) {
initImage();
} else if (code == 87) {
//创建一个新数组
data = new int[][]{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 0}
};
//加载图片
initImage();
}
}

public boolean victory() {
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
if (data[i][j] != win[i][j]) {
return false;
}
}
}
return true;
}

@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == reLoginItem) {
// System.out.println("重新登录");
//关闭界面
this.setVisible(false);
//打开游戏界面
new LoginJFrame();
} else if (source == replayItem) {
// System.out.println("重新游戏");
//重新打乱
intData();
//清除步数
count = 0;
//重新加载图片
initImage();
} else if (source == closeItem) {
// System.out.println("关闭游戏");
System.exit(0);
} else if (source == accountItem) {
// System.out.println("照片");
JDialog jDialog=new JDialog();
JLabel jLabel=new JLabel(new ImageIcon("../gameDemo/image/picture.png"));
//位置
jLabel.setBounds(0,0,488,648);
jDialog.getContentPane().add(jLabel);
jDialog.setSize(550,750);
jDialog.setAlwaysOnTop(true);
jDialog.setLocationRelativeTo(null);
jDialog.setModal(true);
jDialog.setVisible(true);

}
}
}

LoginJFrame

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package top.lyzlove;

import javax.swing.*;
import java.util.ArrayList;

public class LoginJFrame extends JFrame {
//创建一个集合存储正确的用户名和密码
static ArrayList<User> list = new ArrayList<>();
static {
list.add(new User("lyz","123"));
list.add(new User("lisi","1234"));
}


public LoginJFrame() {
//初始化界面
initJFrame();

//在这个界面中添加内容
initView();

//让当前界面显示出来
this.setVisible(true);
}

public void initView() {
//1. 添加用户名文字
JLabel usernameText = new JLabel(new ImageIcon("../gameDemo/image/login/用户名.png"));
usernameText.setBounds(116, 135, 47, 17);
this.getContentPane().add(usernameText);

//2.添加用户名输入框
JTextField username = new JTextField();
username.setBounds(195, 134, 200, 30);
this.getContentPane().add(username);

//3.添加密码文字
JLabel passwordText = new JLabel(new ImageIcon("../gameDemo/image/login/密码.png"));
passwordText.setBounds(130, 195, 32, 16);
this.getContentPane().add(passwordText);

//4.密码输入框
JTextField password = new JTextField();
password.setBounds(195, 195, 200, 30);
this.getContentPane().add(password);

//验证码提示
JLabel codeText = new JLabel(new ImageIcon("../gameDemo/image/login/验证码.png"));
codeText.setBounds(133, 256, 50, 30);
this.getContentPane().add(codeText);

//验证码的输入框
JTextField code = new JTextField();
code.setBounds(195, 256, 100, 30);
this.getContentPane().add(code);

String codeStr = CodeUtil.getCode();
JLabel rightCode = new JLabel();
//设置内容
rightCode.setText(codeStr);
//位置和宽高
rightCode.setBounds(300, 256, 50, 30);
//添加到界面
this.getContentPane().add(rightCode);

//5.添加登录按钮
JButton login = new JButton();
login.setBounds(123, 310, 128, 47);
login.setIcon(new ImageIcon("../gameDemo/image/login/登录按钮.png"));
//去除按钮的默认边框
login.setBorderPainted(false);
//去除按钮的默认背景
login.setContentAreaFilled(false);
this.getContentPane().add(login);

//6.添加注册按钮
JButton register = new JButton();
register.setBounds(256, 310, 128, 47);
register.setIcon(new ImageIcon("../gameDemo/image/login/注册按钮.png"));
//去除按钮的默认边框
register.setBorderPainted(false);
//去除按钮的默认背景
register.setContentAreaFilled(false);
this.getContentPane().add(register);

//7.添加背景图片
JLabel background = new JLabel(new ImageIcon("../gameDemo/image/login/background.png"));
background.setBounds(0, 0, 470, 390);
this.getContentPane().add(background);
}


public void initJFrame() {
this.setSize(488, 430);//设置宽高
this.setTitle("拼图登录 v1.0 作者:刘源昭 ");//设置标题
this.setDefaultCloseOperation(3);//设置关闭模式
this.setLocationRelativeTo(null);//居中
this.setAlwaysOnTop(true);//置顶
this.setLayout(null);//取消内部默认布局
}


//要展示用户名或密码错误
public void showJDialog(String content) {
//创建一个弹框对象
JDialog jDialog = new JDialog();
//给弹框设置大小
jDialog.setSize(200, 150);
//让弹框置顶
jDialog.setAlwaysOnTop(true);
//让弹框居中
jDialog.setLocationRelativeTo(null);
//弹框不关闭永远无法操作下面的界面
jDialog.setModal(true);

//创建Jlabel对象管理文字并添加到弹框当中
JLabel warning = new JLabel(content);
warning.setBounds(0, 0, 200, 150);
jDialog.getContentPane().add(warning);

//让弹框展示出来
jDialog.setVisible(true);
}
}

CodeUtil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package top.lyzlove;

import java.util.ArrayList;
import java.util.Random;

public class CodeUtil {
public static String getCode() {
//1.创建一个集合
ArrayList<Character> list = new ArrayList<>();//52 索引的范围:0 ~ 51
//2.添加字母 a - z A - Z
for (int i = 0; i < 26; i++) {
list.add((char) ('a' + i));//a - z
list.add((char) ('A' + i));//A - Z
}
//3.打印集合
//System.out.println(list);
//4.生成4个随机字母
String result = "";
Random r = new Random();
for (int i = 0; i < 4; i++) {
//获取随机索引
int randomIndex = r.nextInt(list.size());
char c = list.get(randomIndex);
result = result + c;
}
//System.out.println(result);//长度为4的随机字符串

//5.在后面拼接数字 0~9
int number = r.nextInt(10);
//6.把随机数字拼接到result的后面
result = result + number;
//System.out.println(result);//ABCD5
//7.把字符串变成字符数组
char[] chars = result.toCharArray();//[A,B,C,D,5]
//8.在字符数组中生成一个随机索引
int index = r.nextInt(chars.length);
//9.拿着4索引上的数字,跟随机索引上的数字进行交换
char temp = chars[4];
chars[4] = chars[index];
chars[index] = temp;
//10.把字符数组再变回字符串
String code = new String(chars);
//System.out.println(code);
return code;
}
}

exe程序

[setup.exe](https://pan.baidu.com/s/1klZZYz5Wz6QQuthSrrrl_A?pwd=love 提取码:love)

注意:如果出现error

说明没有jdk环境

请先下载jdk 链接:https://pan.baidu.com/s/1sw5OwrCDInCjNSLN28YHog?pwd=love
提取码:love

安装后即可运行

作弊码:W

查看原图:A

该游戏目前只是demo