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
| import java.awt.BorderLayout;
import java.awt.*;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Wuziqi extends JFrame implements MouseListener {
int px=100,py=100; //棋盘黑线的坐标原点即(0,0)位置
int w=25; //一个小格是长宽为25的小格
int vline=px+16*w;//横线长度 vline=500
int hline=py+16*w;//纵线长度 16个空,17条线
boolean b; //用来判断白旗还是黑棋
int whiteCount, blackCount; //计算悔棋步数
Vector v=new Vector();
Vector white = new Vector();
Vector black = new Vector();
public static void main(String args[]) {
new Wuziqi();
}
//构造方法
public Wuziqi() {
this.setVisible(true);
this.setTitle("小志版五子棋");
this.setLocationRelativeTo(null); //在屏幕上居中显示
Container container =this.getContentPane();
container.setLayout(new BorderLayout());
this.setSize(600,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBackground(Color.orange);
//添加监听器
this.addMouseListener(this);
}
public void paint(Graphics g) {
//清除画板,重新画画
g.clearRect(0,0,600,600);
g.drawRect(px, py, 16*w, 16*w); //注意不是px+16*w
g.setColor(Color.black);
for(int i=0;i<16;i++)
g.drawLine(px, py+w*i,vline, py+w*i);
for(int i=0;i<16;i++)
g.drawLine(px+w*i, py,px+w*i, hline);
//画棋子
for(int i=0;i<v.size();i++) {
//获取棋子的坐标
String string=(String)v.get(i);
String[] cha =string.split("-");
//获取x,y的坐标,此时是(2,2)这种形式
int x=Integer.parseInt(cha[0]);
int y=Integer.parseInt(cha[1]);
//x y坐标转化棋盘中的像素位置
x=x*w+px;
y=y*w+py;
if(i%2==0){
//一定要是i%2才行;不然的话会画错棋子
g.setColor(Color.WHITE);
}else {
g.setColor(Color.BLACK);
//g.setColor(Color.white);
}
//设置好画笔的颜色,画棋子
g.fillArc(x-w/2,y-w/2,w,w,0,360);
}
}
//鼠标事件
public void mouseClicked(MouseEvent e) {
if(e.getButton()==e.BUTTON1) {
int x=e.getX();
int y=e.getY();
//棋子的坐标若在一个格的1/2边的时候就划到这一边
x=(x-x%w)+(x%w>w/2?w:0);
y=(y-y%w)+(y%w>w/2?w:0);
//把棋子的坐标变化成表格中的坐标
x=(x-px)/w;
y=(y-py)/w;
//打印下的棋子的坐标 System.out.println(x+" "+y );
//先判断一下,因为不能在棋盘外面画棋子
if(x>=0&&y>=0&&x<=16&&y<=16) {
if(v.contains(x+"-"+y)){}
//如果vector中有了这个点了就不能在这个地方画棋子了
else {
//先把棋子添加到v中,在判断一下添加到黑白棋的vector中
v.add(x+"-"+y);
//System.out.println("v"+v);
//存完之后 要重画一边 才能显示
this.repaint();
if(v.size()%2==0) {
//因为首先画的是白子,vecyor从0开始存的,所以当v中有奇数个棋子的时候,再画就应该画白子了
black.add(x+"-"+y);
this.vectory(x,y,black);
//System.out.println("black"+black );
}else {
white.add(x+"-"+y);
this.vectory(x,y,white);
//System.out.println("white:"+white );
}
}
}
}
if (e.getButton() == e.BUTTON3) { //右击悔棋的方法
//System.out.println("鼠标右击--悔棋");
if (v.isEmpty()) {
JOptionPane.showMessageDialog(this, "没有棋可悔");
} else {
if (v.size() % 2 == 0) { //判断是白棋悔棋,还是黑棋悔棋
blackCount++;
if (blackCount > 3) {
JOptionPane.showMessageDialog(this, "黑棋已经悔了3步");
} else {
v.remove(v.lastElement());
//一定要加上下面这句话,不然的话悔棋之后那个坐标还是存在black的集合中
black.remove(v.lastElement());
this.repaint();
}
} else {
whiteCount++;
if (whiteCount > 3) {
JOptionPane.showMessageDialog(this, "白棋已经悔了3步");
} else {
v.remove(v.lastElement());
white.remove(v.lastElement());
this.repaint();
}
}
}
}
}
public void vectory(int x, int y, Vector ve) {
int cv=0;//垂直方向
int ch=0;//水平方向
int ci1=0;
int ci2=0;
//判断是否能连成五个字的线,垂直方向向右
for(int i=1;i<5;i++) {
if(ve.contains((x+i)+"-"+y)) {
cv++;
}else {
break;
}
}
//垂直方向向左
for(int i=1;i<5;i++) {
if(ve.contains((x-i)+"-"+y)) {
cv++;
}else {
break;
}
}
//水平方向
for(int i=1;i<5;i++) {
if(ve.contains(x+"-"+(y+i))) {
ch++;
}else {
break;
}
}
for(int i=1;i<5;i++) {
if(ve.contains(x+"-"+(y-i))) {
ch++;
}else {
break;
}
}
//45du方向
for(int i=1;i<5;i++) {
if(ve.contains((x+i)+"-"+(y+i))) {
ci1++;
}else {
break;
}
}
for(int i=1;i<5;i++) {
if(ve.contains((x-i)+"-"+(y-i))) {
ci1++;
}else {
break;
}
}
//145du方向向右
for(int i=1;i<5;i++) {
if(ve.contains((x+i)+"-"+(y-i))) {
ci2++;
}else {
break;
}
}
for(int i=1;i<5;i++) {
if(ve.contains((x-i)+"-"+(y+i))) {
ci2++;
}else {
break;
}
}
//判断一下,只需要判断与4的关系就好了,因为上面的判断都是从1开始判断到5,只是判断了4次
if(ch>=4||cv>=4||ci1>=4||ci2>=4) {
if(v.size()%2==0) {
//通过vector中的棋子数目来判断是谁赢了,白棋如果赢了,那么vector中是奇数个
JOptionPane.showMessageDialog(null,"黑棋赢了");
}else {
JOptionPane.showMessageDialog(null, "白棋赢了");
}
this.v.clear();
this.black.clear();
this.white.clear();
this.repaint();
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}
|