图形游戏

1.包结构

代码结构

2.代码

2.1 入口文件App.java

1
2
3
4
5
6
7
8
9
10
public class App {
public static void main(String[] args) {
// 启动
new LoginJFrame();
//
////
// new RegisterJFrame();
// new GameJFrame();
}
}

2.2 登录文件LoginJFrame.java

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
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;

//登录界面
//与登录相关的代码都在这里
public class LoginJFrame extends JFrame implements MouseListener {
// 创建一个集合存储正确的用户名和密码
static ArrayList<User> userList = new ArrayList<>();

//static {} 在类装载的时候执行一次 且只执行一次
static {
userList.add(new User("zhangsan", "123"));
userList.add(new User("lisi", "123"));
}

//添加用户名输入框
JTextField username = new JTextField();
// 添加密码输入框
JTextField password = new JTextField();
//登录按钮
JButton login = new JButton();
//注册按钮
JButton register = new JButton();
//验证码输入框
JTextField code = new JTextField();
// 随机生成验证码
String codeStr = CodeUtil.getCode();
JLabel rightCode = new JLabel();//正确的验证码
// 构造方法 就是对类进行一些初始化
public LoginJFrame() {
// 初始化窗口
initJFrame();
// 在窗口中添加内容
initView();

//让其显示出来,建议写在最后
this.setVisible(true);
}

private void initJFrame() {
// 创建登录界面时,同时给这个界面去设置一个信息
this.setSize(488, 430);
//界面标题
this.setTitle("登录");
//界面置顶
this.setAlwaysOnTop(true);
//页面居中
this.setLocationRelativeTo(null);
// 关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

}

private void initView() {
// 添加用户名
JLabel usernameText = new JLabel(new ImageIcon("day16\\image\\login\\用户名.png"));
usernameText.setBounds(116, 135, 47, 17);
this.getContentPane().add(usernameText);

username.setBounds(195, 134, 200, 30);
this.getContentPane().add(username);
//添加密码文字
JLabel passwordText = new JLabel(new ImageIcon("day16\\image\\login\\密码.png"));
passwordText.setBounds(130, 195, 32, 16);
this.getContentPane().add(passwordText);
// 添加密码输入框
password.setBounds(195, 195, 200, 30);
this.getContentPane().add(password);
// 验证码提示
JLabel codeText = new JLabel(new ImageIcon("day16\\image\\login\\验证码.png"));
codeText.setBounds(133, 256, 50, 30);
this.getContentPane().add(codeText);
//验证码输入框
code.setBounds(195, 256, 100, 30);
this.getContentPane().add(code);

//设置内容 获取验证码
rightCode.setText(codeStr);
rightCode.setBounds(300, 256, 50, 30);
// 添加鼠标点击事件的监听
rightCode.addMouseListener(this);
this.getContentPane().add(rightCode);

//登录按钮
login.setBounds(123, 310, 128, 47);
login.setIcon(new ImageIcon("day16\\image\\login\\登录按钮.png"));
// 去除默认的边框
login.setBorderPainted(false);
//去除默认的背景
login.setContentAreaFilled(false);
// 添加鼠标点击事件的监听
login.addMouseListener(this);
this.getContentPane().add(login);

//注册按钮
register.setBounds(256, 310, 128, 47);
register.setIcon(new ImageIcon("day16\\image\\login\\注册按钮.png"));
// 去除默认的边框
register.setBorderPainted(false);
//去除默认的背景
register.setContentAreaFilled(false);
// 添加鼠标点击事件的监听
register.addMouseListener(this);
this.getContentPane().add(register);

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

private 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);
}

@Override
public void mouseClicked(MouseEvent e) {
System.out.println("鼠标点击事件");
if (e.getSource() == login) {
System.out.println("点击的是登录按钮");
//获取用户名和密码两个文本输入框的内容
String usernameInput = username.getText();
String passwordInput = password.getText();
//获取用户输入的验证码
String codeInput = code.getText();

// 创建一个User对象
User userInfo = new User(usernameInput, passwordInput);
System.out.println("用户输入的用户名是:" + usernameInput);
System.out.println("用户输入的密码是:" + passwordInput);

if (codeInput.length() == 0) {
System.out.println("验证码不能为空!!!");
} else if (usernameInput.length() == 0 || passwordInput.length() == 0) {
System.out.println("用户名或密码不能为空!!!");
showJDialog("用户名或密码为空");
} else if (!codeInput.equalsIgnoreCase(rightCode.getText())) {
System.out.println("验证码输入错误");
} else if (contains(userInfo)) {
System.out.println("用户或密码正确,用户存在");
this.setVisible(false);//关闭当前登录页
new GameJFrame();//打开游戏界面
} else {
System.out.println("用户名或密码错误");
}
} else if (e.getSource() == register) {
System.out.println("点击了注册按钮");
} else if (e.getSource() == rightCode) {
System.out.println("更新验证码");
//获取一个新的验证码
String code = CodeUtil.getCode();
rightCode.setText(code);
}
}

@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标按下不松");
if (e.getSource() == login) {
login.setIcon(new ImageIcon("day16\\image\\login\\登录按下.png"));
} else if (e.getSource() == register) {
register.setIcon(new ImageIcon("day16\\image\\login\\注册按下.png"));
}
}

//mousePressed mouseReleased两个按钮用于实现反复点击按钮时,按钮的闪动效果
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标按下松开");
if (e.getSource() == login) {
login.setIcon(new ImageIcon("day16\\image\\login\\登录按钮.png"));
} else if (e.getSource() == register) {
register.setIcon(new ImageIcon("day16\\image\\login\\注册按钮.png"));
}
}

@Override
public void mouseEntered(MouseEvent e) {

}

@Override
public void mouseExited(MouseEvent e) {

}

// 判断用户在集合中是否存在
public boolean contains(User userInfo) {
for (User rightUser : userList) {
if (userInfo.getUsername().equals(rightUser.getUsername()) && userInfo.getPassword().equals(rightUser.getPassword())) {
return true;
}
}
//反正不存在
return false;
}
}

2.3 注册文件RegisterJFrame.java

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
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

//注册界面
public class RegisterJFrame extends JFrame implements MouseListener {
// 添加注册用户名
JTextField registerUsername = new JTextField();
JTextField registerPassword = new JTextField();
JTextField registerConfirmPassword = new JTextField();
JButton reSet = new JButton();
JButton register = new JButton();

public RegisterJFrame(){
initJFrame();//窗口初始化
initView();//窗口中内容初始化

this.setVisible(true);//显示窗口,一定要写在最后
}

private void initJFrame() {
this.setSize(488, 430);
this.setTitle("注册");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//关闭模式

}

private void initView() {
// 添加注册用户名
JLabel registerUsernameText = new JLabel(new ImageIcon("day16\\image\\register\\注册用户名.png"));
registerUsernameText.setBounds(110, 135, 79, 17);
this.getContentPane().add(registerUsernameText);
registerUsername.setBounds(200, 134, 200, 30);
this.getContentPane().add(registerUsername);
// 添加注册密码
JLabel registerPasswordText = new JLabel(new ImageIcon("day16\\image\\register\\注册密码.png"));
registerPasswordText.setBounds(110, 175, 64, 16);
this.getContentPane().add(registerPasswordText);

registerPassword.setBounds(200, 171, 200, 30);
this.getContentPane().add(registerPassword);
// 添加再次输入密码
JLabel registerConfirmPasswordText = new JLabel(new ImageIcon("day16\\image\\register\\再次输入密码.png"));
registerConfirmPasswordText.setBounds(100, 215, 97, 17);
this.getContentPane().add(registerConfirmPasswordText);

registerConfirmPassword.setBounds(200, 210, 200, 30);
this.getContentPane().add(registerConfirmPassword);
// 添加重置按钮
reSet.setIcon(new ImageIcon("day16\\image\\register\\重置按钮.png"));
reSet.setBounds(100, 270, 128, 47);
reSet.setBorderPainted(false);//去掉默认的边框
reSet.setContentAreaFilled(false);//去除默认背景
// 添加鼠标点击事件的监听
reSet.addMouseListener(this);
this.getContentPane().add(reSet);
// 添加注册按钮

register.setBounds(280, 270, 128, 47);
register.setIcon(new ImageIcon("day16\\image\\register\\注册按钮.png"));
register.setBorderPainted(false);//去掉默认的边框
register.setContentAreaFilled(false);//去除默认背景
// 添加监听事件
register.addMouseListener(this);
this.getContentPane().add(register);
// 添加背景图片
JLabel background = new JLabel(new ImageIcon("day16\\image\\login\\background.png"));
background.setBounds(0, 0, 470, 390);
this.getContentPane().add(background);
}

@Override
public void mouseClicked(MouseEvent e) {
// System.out.println("鼠标点击" + e.getSource());
//获取输入框的内容
String registerUsernameInput = registerUsername.getText();
String registerPasswordInput = registerPassword.getText();
String registerConfirmPasswordInput = registerConfirmPassword.getText();
if (e.getSource() == register) {
System.out.println("点击注册按钮");
if (registerUsernameInput.isEmpty()) {
showJDialog("请输入用户名");
} else if (registerPasswordInput.isEmpty()) {
showJDialog("请输入密码");
} else if (registerConfirmPasswordInput.isEmpty()) {
showJDialog("请输入确认密码");
} else if (containUserName(registerUsernameInput)) {
showJDialog("当前用户名已存在,请重新输入");
} else if (!registerPasswordInput.equals(registerConfirmPasswordInput)) {
showJDialog("注册密码与确认密码不一致,请重新输入");
} else {
User registerUser = new User(registerUsernameInput, registerPasswordInput);
LoginJFrame.userList.add(registerUser);
showJDialog("注册成功");
this.setVisible(false);//注册成功,关闭当前窗口
new LoginJFrame();//登录
}
// System.out.println(LoginJFrame.userList + "----");
} else if (e.getSource() == reSet) {
System.out.println("重置");
//清空输入框内容
registerUsername.setText("");
registerPassword.setText("");
registerConfirmPassword.setText("");
}
}

@Override
public void mousePressed(MouseEvent e) {
System.out.println("鼠标点击不松开");

}

@Override
public void mouseReleased(MouseEvent e) {
System.out.println("鼠标点击松开");

}

@Override
public void mouseEntered(MouseEvent e) {
// System.out.println("鼠标移入");
}

@Override
public void mouseExited(MouseEvent e) {
// System.out.println("鼠标移出");
}

// 判断新注册的用户名是否已经存在
private boolean containUserName(String username) {
for (User user : LoginJFrame.userList) {
if (user.getUsername().equals(username)) {
return true;
}
}
return false;
}

private 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);
}

}

2.4 游戏文件GameJFrame.java

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
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
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;

//KeyListener 键盘监听的接口
//ActionListener 事件监听
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
// 创建选项下面的条目
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
JMenuItem girl = new JMenuItem("女生");
JMenuItem animal = new JMenuItem("动物");
JMenuItem sport = new JMenuItem("运动");
// 记录图片的渲染位置
// data[x][y]=0 表示空白模块的位置
int[][] data = new int[4][4];
// 空白模块的位置坐标``
int x = 0;
int y = 0;
// 背景图路径,方便动态更换背景图
String path = "day16\\image\\animal\\animal1\\";
// 定义一个二维数组,用于判断胜利时候的数据
int[][] win = {
{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 0}
};
// 计步器
int step = 0;
Random r = new Random();
public GameJFrame() {
//初始化窗口
initJFrame();
// 设置菜单
initJMenu();
// 初始化数据(打乱图片顺序)
initDate();
// 初始化图片 直接渲染打乱顺序的图片
initImage();
// 窗口的显示
this.setVisible(true);
}

private void initJFrame() {
this.setSize(603, 680);
this.setTitle("game demo");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
// 关闭模式
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//取消默认居中放置,只有取消了才会按照XY轴的形式添加组件
this.setLayout(null);
// 给整个窗口添加键盘监听
//this:表示当前类的实例
this.addKeyListener(this);

}

private void initDate() {
// 定义一个数组
int[] tempArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
// 打乱数组中的顺序
for (int i = 0; i < tempArr.length; i++) {
// 获取到随机索引
int index = r.nextInt(tempArr.length);
// 遍历数组,将当前数据跟随机索引上的数据进行交换
int temp = tempArr[i];
tempArr[i] = tempArr[index];
tempArr[index] = temp;
}
//给二维数组添加数据
for (int i = 0; i < tempArr.length; i++) {
// 记录空白模块的位置
if (tempArr[i] == 0) {
x = i / 4;
y = i % 4;
}
data[i / 4][i % 4] = tempArr[i];
}
}

private void initJMenu() {
// 创建整个菜单选项
JMenuBar jMenuBar = new JMenuBar();
// 创建菜单上面的两个选项的对象:功能 关于我们
JMenu functionJmenu = new JMenu("功能");
JMenu aboutJmenu = new JMenu("关于我们");
JMenu changeImage = new JMenu("更换图片");

// 给这些JMenuItem对象添加事件监听
girl.addActionListener(this);
animal.addActionListener(this);
sport.addActionListener(this);
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);

// 将每个选项添加到对应的条目中去
functionJmenu.add(changeImage);
functionJmenu.add(replayItem);
functionJmenu.add(reLoginItem);
functionJmenu.add(closeItem);
aboutJmenu.add(accountItem);
changeImage.add(girl);
changeImage.add(animal);
changeImage.add(sport);
//将选项添加到菜单当中
jMenuBar.add(functionJmenu);
jMenuBar.add(aboutJmenu);

// 将菜单添加到窗口中
this.setJMenuBar(jMenuBar);


}

private void initImage() {
System.out.println("渲染图片");
//每次加载图片都要清楚一次上次的渲染
this.getContentPane().removeAll();
// 当当前的数据正确时,显示游戏胜利的图片
if (victory()) {
JLabel winImg = new JLabel(new ImageIcon("day16\\image\\win.png"));
winImg.setBounds(203, 283, 197, 73);
this.getContentPane().add(winImg);
}
// 添加计步器
JLabel stepCount = new JLabel("步数" + step);
stepCount.setBounds(50, 30, 100, 20);
this.getContentPane().add(stepCount);

// 循环添加所有的图片
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int num = data[i][j];
//创建一个JLabel的对象(管理容器)
JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
//设置JLabel对象的大小,宽高
// 让图片偏移,使得图片整体居中
jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);
// 给图片添加边框
// BevelBorder.RAISED或0 图片凸起
// BevelBorder.LOWERED或1 图片凹下去
jLabel.setBorder(new BevelBorder(BevelBorder.RAISED));

//把容器添加到界面中去
this.getContentPane().add(jLabel);
}
}
//java渲染图片的规则是 先渲染的在上层,后渲染的在下层,所以要先渲染图片,后渲染背景图
// 渲染背景图
JLabel background = new JLabel(new ImageIcon("day16\\image\\background.png"));
// 设置背景图的位置
background.setBounds(40, 40, 508, 560);


// 将背景图添加到容器中
this.getContentPane().add(background);

// 每次渲染重绘一次
this.getContentPane().repaint();
}

//判断当前数据是否跟win中的数据一样,一样则表示游戏胜利
private 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;
}

//重写接口KeyListener的三个抽象方法
@Override
public void keyTyped(KeyEvent e) {
System.out.println("键盘输出");
}

@Override
public void keyPressed(KeyEvent e) {
System.out.println("键盘按压不松开");
int code = e.getKeyCode();
// 长按 键盘A键时 显示完整的图片
if (code == 65) {
// 先把所有图片删除
this.getContentPane().removeAll();
// 再加载一张完整的图片
JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
all.setBounds(83, 134, 420, 420);
this.getContentPane().add(all);
// 再次添加背景图片
JLabel background = new JLabel(new ImageIcon("day16\\image\\background.png"));
background.setBounds(40, 40, 508, 560);
this.getContentPane().add(background);
//刷新 重绘界面
this.getContentPane().repaint();
}
}

@Override
public void keyReleased(KeyEvent e) {
// 如果游戏胜利了,则不用执行之后的代码了
if (victory()) {
return;
}
System.out.println("键盘松开" + e.getKeyCode() + "---" + e.getKeyChar());

// 对上,下,左,右进行判断
// 左: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++;//更新空白模块的坐标
step++;//计步器自增

} else if (code == 38) {
System.out.println("向上移动");
if (x >= 3) {
return;
}
// 将空白模块下的图片移动往上移动
data[x][y] = data[x + 1][y];
data[x + 1][y] = 0;
x++;
step++;//计步器自增
} else if (code == 39) {
System.out.println("向右移动");
if (y <= 0) {
return;
}
data[x][y] = data[x][y - 1];
data[x][y - 1] = 0;
y--;
step++;//计步器自增
} else if (code == 40) {
System.out.println("向下移动");
if (x <= 0) {
return;
}
data[x][y] = data[x - 1][y];
data[x - 1][y] = 0;
x--;
step++;//计步器自增
} else if (code == 87) {
// 键盘按下 W键 时,直接胜利
data = new int[][]{
{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 0}
};
} else {
System.out.println("其他的一些键盘操作");
}
initImage();//再次渲染图片

}

@Override
public void actionPerformed(ActionEvent e) {
// 获取当前被点击的条目对象
// System.out.println("获取被点击的条目对象" + e.getSource());
Object obj = e.getSource();
// 判断
if (obj == replayItem) {
System.out.println("重新游戏");
step = 0;//计步器清零
initDate();//重新打乱顺序
initImage();//重新渲染图片
} else if (obj == reLoginItem) {
System.out.println("重新登录");
this.setVisible(false);//关闭当前窗口
new LoginJFrame();//打开登录窗口
} else if (obj == closeItem) {
System.out.println("关闭游戏");
System.exit(0);//直接关闭当前虚拟机
} else if (obj == accountItem) {
System.out.println("公众号");
// 创建一个弹窗对象
JDialog jDialog = new JDialog();
jDialog.setBounds(0, 0, 258, 258);//弹窗的位置
// 把图片添加到弹框中去
jDialog.getContentPane().add(new JLabel(new ImageIcon("day16\\image\\about.png")));
// 设置弹框大小
jDialog.setSize(344, 344);
//弹框置顶
jDialog.setAlwaysOnTop(true);
//弹框居中
jDialog.setLocationRelativeTo(null);
//弹框不关闭就不能执行其他操作
jDialog.setModal(true);//添加一个遮罩
//让弹框显示出来
jDialog.setVisible(true);
} else if (obj == girl) {
path = "day16\\image\\girl\\girl" + r.nextInt(1, 13) + "\\";
step = 0;//计步器清零
initDate();//重新打乱顺序
initImage();//重新渲染图片
} else if (obj == animal) {
path = "day16\\image\\animal\\animal" + r.nextInt(1, 8) + "\\";
step = 0;//计步器清零
initDate();//重新打乱顺序
initImage();//重新渲染图片
} else if (obj == sport) {
path = "day16\\image\\sport\\sport" + r.nextInt(1, 10) + "\\";
step = 0;//计步器清零
initDate();//重新打乱顺序
initImage();//重新渲染图片
}
}
}

2.5 生成验证码的工具类CodeUtil.java

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

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;
}
}

2.6 用户类User.java

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
public class User {
private String username;
private String password;

public User() {
}

public User(String username, String password) {
this.username = username;
this.password = password;
}

/**
* 获取
* @return username
*/
public String getUsername() {
return username;
}

/**
* 设置
* @param username
*/
public void setUsername(String username) {
this.username = username;
}

/**
* 获取
* @return password
*/
public String getPassword() {
return password;
}

/**
* 设置
* @param password
*/
public void setPassword(String password) {
this.password = password;
}

}


图形游戏
https://chen77.top/2024/05/14/server/图形游戏/
作者
小陈
发布于
2024年5月14日
许可协议