黑白棋子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
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class mc_07116 {
/**
* 控件属性
*/
private JFrame frame; // 五子棋游戏的窗口框架
private GameMap map; // 五子棋游戏的窗口容器
private JMenuBar bar; // 菜单
private JMenu game; // 菜单项
private JMenuItem[] items; // 菜单下拉项
/**
* 静态数据属性
*/
private static final int BOARD_SIZE = 15; // 棋盘大小(15 * 15)
private static final int ROW_WIDTH = 36; // 间距
private static final int SPACE = ROW_WIDTH / 2; // 上下边间距
/**
* 数据属性
*/
private boolean player; // true黑,false白
private char[][] board; // 后台虚拟棋盘
public mc_07116() {
player = true; // 游戏先黑子下
board = new char[BOARD_SIZE][BOARD_SIZE]; // 建立后台虚拟棋盘
clearMap();
createGUI();
}
/**
* 对GUI控件的创建
*/
private void createGUI() {
frame = new JFrame("五子棋"); // 实现五子棋游戏窗口框架
bar = new JMenuBar(); // 建立菜单栏
game = new JMenu("游戏"); // 建立名为“游戏”的菜单
items = new JMenuItem[2]; // game菜单下创建2个子菜单项
game.add(items[0] = new JMenuItem("重新开始"));// 第一个子菜单为“重新开始”
game.add(items[1] = new JMenuItem("退出")); // 第二个子菜单为“退出”
bar.add(game);// 菜单项加入菜单栏
map = new GameMap(); // 实现五子棋游戏窗口容器
map.setPreferredSize(
new Dimension(ROW_WIDTH * (BOARD_SIZE - 1) + SPACE * 2, ROW_WIDTH * (BOARD_SIZE - 1) + SPACE * 2));// 设置容器大小
frame.setJMenuBar(bar);
frame.add(map);
frame.pack();
frame.setLocation(450, 100);
frame.setResizable(false);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
}
/**
* 清空棋子
*/
protected void clearMap() {
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
board[i][j] = '+';
}
}
}
/**
* 运行游戏
*/
public void start() {
map.addMouseListener(new MouseAdapter() {
// 鼠标点击事件
public void mouseClicked(MouseEvent e) {
// 将用户鼠标事件的座标转换成棋子数组的座标。
int xPos = (int) (e.getX() / ROW_WIDTH);
int yPos = (int) (e.getY() / ROW_WIDTH);
if (board[xPos][yPos] == '+') {// 判断是否下过棋
board[xPos][yPos] = player ? 'b' : 'w'; // 给虚拟键盘赋值
map.repaint(); // 通过读取board数组进行贴图
if (isWin(xPos, yPos)) {// 如果有满足胜利条件的玩家了
map.repaint(); // 刷新图像
String str = player ? "黑方胜利" : "白方胜利";
JOptionPane.showMessageDialog(null, str, "游戏结束", JOptionPane.PLAIN_MESSAGE); // 弹出消息框
clearMap(); // 清空棋盘
map.repaint(); // 刷新棋盘
player = true; // 新一局继续黑子先下
} else {
player = player ? false : true; // 切换玩家
}
}
}
});
// 点击重新开始事件
items[0].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String str = "是否要重新开始游戏?";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "重新开始",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
clearMap(); // 清空棋盘
map.repaint(); // 刷新棋盘
player = true; // 玩家为黑棋
}
}
});
// 点击退出事件
items[1].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String str = "是否要退出游戏?";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "重新开始",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0); // 退出
}
}
});
// 点关闭按钮事件
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
String str = "是否要退出游戏?";
// 添加消息对话框
if (JOptionPane.showConfirmDialog(null, str, "退出游戏",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
System.exit(0); // 退出
}
}
});
}
/**
* 纵向找
*/
protected boolean find(int x, int y) {
int i, num = 1;
char temp = player ? 'b' : 'w';
for (i = x + 1; i < 15; i++) {// 向下找
if (board[i][y] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = x - 1; i >= 0; i--) {// 向上找
if (board[i][y] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
}
/**
* 横向找
*/
protected boolean find2(int x, int y) {
int i, num = 1;
char temp = player ? 'b' : 'w';
for (i = y + 1; i < 15; i++) { // 向右找
if (board[x][i] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = y - 1; i >= 0; i--) {// 向左找
if (board[x][i] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
}
/**
* 方向
*/
protected boolean find3(int x, int y) {
int i, j, num = 1;
char temp = player ? 'b' : 'w';
for (i = x + 1, j = y + 1; i < 15 && j < 15; i++, j++) {// 向下方
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {// 向上方
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
}
/**
* /方向
*/
protected boolean find4(int x, int y) {
int i, j, num = 1;
char temp = player ? 'b' : 'w';
for (i = x + 1, j = y - 1; i < 15 && j >= 0; i++, j--) {// 向下
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
for (i = x - 1, j = y + 1; i >= 0 && j < 15; i--, j++) { // 向上
if (board[i][j] == temp) {
num++;
if (num == 5) {
return true;
}
} else {
break;
}
}
return false;
}
/**
* 判断胜负
*/
protected boolean isWin(int x, int y) {
return (find(x, y) || find2(x, y) || find3(x, y) || find4(x, y));
}
/**
* 内部容器类,用于实现图像处理
*/
private class GameMap extends JPanel {
private static final long serialVersionUID = 16578987565248L;
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 棋盘
g.setColor(new Color(200, 100, 50)); // 设为桔黄色
g.fillRect(0, 0, ROW_WIDTH * (BOARD_SIZE + 1), ROW_WIDTH * (BOARD_SIZE + 1)); // 填充棋盘
g.setColor(Color.black); // 设为黑色
for (int i = 0; i < BOARD_SIZE; i++) {// 画竖线
g.drawLine(SPACE + ROW_WIDTH * i, SPACE, SPACE + ROW_WIDTH * i, SPACE + ROW_WIDTH * (BOARD_SIZE - 1));
}
for (int i = 0; i < BOARD_SIZE; i++) {// 画横线
g.drawLine(SPACE, SPACE + ROW_WIDTH * i, SPACE + ROW_WIDTH * (BOARD_SIZE - 1), SPACE + ROW_WIDTH * i);
}
// 画点
g.fillOval(SPACE + 3 * ROW_WIDTH - 3, SPACE + 3 * ROW_WIDTH - 3, 7, 7);
g.fillOval(SPACE + 11 * ROW_WIDTH - 3, SPACE + 3 * ROW_WIDTH - 3, 7, 7);
g.fillOval(SPACE + 3 * ROW_WIDTH - 3, SPACE + 11 * ROW_WIDTH - 3, 7, 7);
g.fillOval(SPACE + 7 * ROW_WIDTH - 3, SPACE + 7 * ROW_WIDTH - 3, 7, 7);
g.fillOval(SPACE + 11 * ROW_WIDTH - 3, SPACE + 11 * ROW_WIDTH - 3, 7, 7);
// 棋子
// 遍历数组,绘制棋子。
for (int i = 0; i < BOARD_SIZE; i++) {
for (int j = 0; j < BOARD_SIZE; j++) {
if (board[i][j] == 'b') {// 绘制黑棋
g.setColor(Color.black);
g.fillOval(SPACE + i * ROW_WIDTH - ROW_WIDTH / 2, SPACE + j * ROW_WIDTH - ROW_WIDTH / 2,
ROW_WIDTH, ROW_WIDTH);
}
if (board[i][j] == 'w') {// 绘制白棋
g.setColor(Color.white);
g.fillOval(SPACE + i * ROW_WIDTH - ROW_WIDTH / 2, SPACE + j * ROW_WIDTH - ROW_WIDTH / 2,
ROW_WIDTH, ROW_WIDTH);
}
}
}
}
}
public static void main(String[] args) {
mc_07116 game = new mc_07116();
game.start();
System.out.println("测试成功");
}
}
Your support will encourage me to continue to create!