日历
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
27 | 28 | 29 | 30 | 31 | 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 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
统计
- 随笔 - 2
- 文章 - 6
- 评论 - 5
- 引用 - 0
导航
常用链接
留言簿(1)
随笔档案
文章档案
搜索
最新评论
阅读排行榜
评论排行榜
|
用JAVA写的五子棋代码,没有AI,有检测禁手,永远是黑棋先手。以后有时间再去研究下AI了。
代码附有详细注释。
1import java.awt.*;
2import java.awt.event.*;
3import javax.swing.*;
4
5class ChessFrame extends JFrame //整个五子棋框架类
6{
7 JMenuBar jmb;
8 JMenu []jm=new JMenu[4];
9 JMenuItem []jm1jmi=new JMenuItem[3];
10 JRadioButtonMenuItem []jm2jrbmi=new JRadioButtonMenuItem[2];
11 ButtonGroup bg1;
12 JRadioButtonMenuItem []jm3jrbmi=new JRadioButtonMenuItem[3];
13 ButtonGroup bg2;
14 JMenuItem jm4jmi1;
15 public ChessFrame()
16 {
17 super("五子棋学习制作·未完成");
18 jmb = new JMenuBar();
19 jm[0] = new JMenu("游戏");
20 jm[1] = new JMenu("棋盘大小");
21 jm[2] = new JMenu("棋盘背景");
22 jm[3] = new JMenu("帮助");
23 jm1jmi[0] = new JMenuItem("游戏开始");
24 jm1jmi[1] = new JMenuItem("游戏重置");
25 jm1jmi[2] = new JMenuItem("游戏结束");
26 jm2jrbmi[0] = new JRadioButtonMenuItem("15 * 15",true);
27 jm2jrbmi[1] = new JRadioButtonMenuItem("19 * 19");
28 bg1 = new ButtonGroup();
29 jm3jrbmi[0] = new JRadioButtonMenuItem("红色",true);
30 jm3jrbmi[1] = new JRadioButtonMenuItem("橘黄色");
31 jm3jrbmi[2] = new JRadioButtonMenuItem("青色");
32 bg2 = new ButtonGroup();
33 jm4jmi1 = new JMenuItem("关于");
34 this.setLocation(255, 175);
35 this.setSize(500, 500);
36 this.setVisible(true);
37 this.setJMenuBar(jmb);
38
39 bg1.add(jm2jrbmi[0]);
40 bg1.add(jm2jrbmi[1]);
41
42
43 bg2.add(jm3jrbmi[0]);
44 bg2.add(jm3jrbmi[1]);
45 bg2.add(jm3jrbmi[2]);
46
47 jm[0].add(jm1jmi[0]);
48 jm[0].add(jm1jmi[1]);
49 jm[0].add(jm1jmi[2]);
50
51 jm[1].add(jm2jrbmi[0]);
52 jm[1].add(jm2jrbmi[1]);
53
54 jm[2].add(jm3jrbmi[0]);
55 jm[2].add(jm3jrbmi[1]);
56 jm[2].add(jm3jrbmi[2]);
57
58 jm[3].add(jm4jmi1);
59
60 jmb.add(jm[0]);
61 jmb.add(jm[1]);
62 jmb.add(jm[2]);
63 jmb.add(jm[3]);
64
65 this.addWindowListener(new WindowAdapter()
66 {
67 public void windowClosing(WindowEvent e)
68 {
69 dispose();
70 System.exit(0);
71 }
72 });
73 }
74}
75
76class ChessPanel extends JPanel //棋盘类
77{
78 private int maxrows, maxcols; //最大行数,列数
79
80 private int [][]pointState; //棋盘上每个点的状态,0为没有子,1为黑,2为白
81
82 private int start; //初始为0,表示未开始,也表示开始后的结束,1表示开始
83
84 private Color frontChessColor; //记录上次棋子的颜色,初始为白色
85
86 private int unitSize =25; // 棋盘每个单元格的边大小
87
88 private int distanceX ;//棋盘左上起点 X 坐标
89
90 private int distanceY ;//棋盘左上起点 Y 坐标
91
92 private int fiveLine;//5连标记,初始为0;1表示是
93
94 private int overline;//长连标记,初始为0;1表示是
95
96 public ChessPanel(int maxrows, int maxcols)
97 {
98 this.setLayout(null);
99 this.start=0;
100 this.frontChessColor=Color.WHITE;
101 this.maxrows = maxrows;
102 this.maxcols = maxcols;
103 this.setBackground(Color.RED);
104 this.setSize((maxrows+1)*unitSize, (maxcols+1)*unitSize);
105 initPointState();
106 initVicAOl();
107 }
108
109 public void initVicAOl() //初始化5连长连标记
110 {
111 this.fiveLine=0;
112 this.overline=0;
113 }
114
115 public int getFiveLine() //得到5连标记
116 {
117 return fiveLine;
118 }
119
120 public int getOverline() //得到长连标记
121 {
122 return overline;
123 }
124
125 public void initPointState() //初始化棋盘点
126 {
127 pointState=new int[maxrows][maxcols];
128 for(int i=0;i<maxrows;i++)
129 for(int j=0;j<maxcols;j++)
130 pointState[i][j]=0;
131 }
132
133 public void setPointState(int x, int y, int tag) //设置此点状态
134 {
135 this.pointState[x][y]=tag;
136 }
137
138 public int getPointState(int x,int y) //获得此点状态
139 {
140 return this.pointState[x][y];
141 }
142
143 public boolean isLayChess(int x,int y) //判断是否能放子
144 {
145 if(this.pointState[x][y]==0)
146 return true;
147 else return false;
148 }
149
150 public void setFrontChessColor(Color c) //设置上次棋子颜色
151 {
152 this.frontChessColor=c;
153 }
154
155 public boolean isFrontChessColorBlack() //检测上次棋子是否为黑色
156 {
157 if(this.frontChessColor.equals(Color.BLACK))
158 return true;
159 else return false;
160 }
161
162 public void setStart(int start) //设置是否开始
163 {
164 this.start=start;
165 }
166
167 public boolean isStart() //检测是否开始
168 {
169 if(this.start==1) return true;
170 else return false;
171 }
172
173 public void setMaxRowCol(int maxrows, int maxcols) //设置行数列数
174 {
175 this.maxrows = maxrows;
176 this.maxcols = maxcols;
177 initPointState();
178 }
179
180 public int getMaxrows() //获得最大行数
181 {
182 return maxrows;
183 }
184
185 public int getMaxcols() //获得最大列数
186 {
187 return maxcols;
188 }
189
190 public void setColor(Color c) //设置背景颜色
191 {
192 this.setBackground(c);
193 }
194
195 public int getUnitSize() //获得单元格的大小
196 {
197 return unitSize;
198 }
199
200 public int getDistanceX() //获得棋盘左上 X 坐标
201 {
202 return distanceX;
203 }
204
205 public int getDistanceY() //获得棋盘左上 Y 坐标
206 {
207 return distanceY;
208 }
209
210 public void paint(Graphics g) //画棋盘
211 {
212 super.paint(g);
213 g.setColor(Color.BLACK);
214 //棋盘左上起点 X 坐标
215 distanceX = (this.getWidth()-(maxcols-1)*unitSize)/2;
216 //棋盘左上起点 Y 坐标
217 distanceY = (this.getWidth()-(maxrows-1)*unitSize)*2/5;
218
219 for (int i = 0; i < maxrows; i++)
220 // 画横线
221 g.drawLine(0 + distanceX, i * unitSize + distanceY, (maxcols - 1)
222 * unitSize + distanceX, i * unitSize + distanceY);
223 for (int i = 0; i < maxcols; i++)
224 // 画竖线
225 g.drawLine(i * unitSize + distanceX, 0 + distanceY, i * unitSize
226 + distanceX, (maxrows - 1) * unitSize + distanceY);
227 int star;
228 star = maxrows / 4 + 1; // 画天元和星
229 g.fillOval((star - 1) * unitSize - 3 + distanceX, (star - 1) * unitSize
230 - 3 + distanceY, 6, 6);
231 g.fillOval((star * 3 - 1) * unitSize - 3 + distanceX, (star - 1)
232 * unitSize - 3 + distanceY, 6, 6);
233 g.fillOval((star - 1) * unitSize - 3 + distanceX, (star * 3 - 1)
234 * unitSize - 3 + distanceY, 6, 6);
235 g.fillOval((star * 3 - 1) * unitSize - 3 + distanceX, (star * 3 - 1)
236 * unitSize - 3 + distanceY, 6, 6);
237 g.fillOval((star * 2 - 1) * unitSize - 3 + distanceX, (star * 2 - 1)
238 * unitSize - 3 + distanceY, 6, 6);
239 }
240
241 public boolean checkIsVictory(int x, int y, int tag)//是否5连或长连
242 {
243 int sum=0; // 连子总数
244 for(int i=1;i<=4;i++) //横向 左
245 {
246 if((y-i)>=0&&pointState[x][y-i]==tag)
247 sum++;
248 else break;
249 }
250 for(int i=1;i<=4;i++) //横向 右
251 {
252 if((y+i)<maxcols&&pointState[x][y+i]==tag)
253 sum++;
254 else break;
255 }
256 if(sum==4) //五连
257 {
258 this.fiveLine=1;
259 return true;
260 }
261 else if(sum>4) //长连
262 this.overline=1;
263
264 sum=0; //还原
265 for(int i=1;i<=4;i++) //纵向 上
266 {
267 if((x-i)>=0&&pointState[x-i][y]==tag)
268 sum++;
269 else break;
270 }
271 for(int i=1;i<=4;i++) //纵向 下
272 {
273 if((x+i)<maxrows&&pointState[x+i][y]==tag)
274 sum++;
275 else break;
276 }
277 if(sum==4) //五连
278 {
279 this.fiveLine=1;
280 return true;
281 }
282 else if(sum>4) //长连
283 this.overline=1;
284
285 sum=0; //还原
286 for(int i=1;i<=4;i++) //斜向 右上
287 {
288 if((x-i)>=0&&(y+i)<maxcols&&pointState[x-i][y+i]==tag)
289 sum++;
290 else break;
291 }
292 for(int i=1;i<=4;i++) //斜向 左下
293 {
294 if((x+i)<maxrows&&(y-i)>=0&&pointState[x+i][y-i]==tag)
295 sum++;
296 else break;
297 }
298 if(sum==4) //五连
299 {
300 this.fiveLine=1;
301 return true;
302 }
303 else if(sum>4) //长连
304 this.overline=1;
305
306 sum=0; //还原
307 for(int i=1;i<=4;i++) //斜向 左上
308 {
309 if((x-i)>=0&&(y-i)>=0&&pointState[x-i][y-i]==tag)
310 sum++;
311 else break;
312 }
313 for(int i=1;i<=4;i++) //斜向 右下
314 {
315 if((x+i)<maxcols&&(y+i)<maxrows&&pointState[x+i][y+i]==tag)
316 sum++;
317 else break;
318 }
319 if(sum==4) //五连
320 {
321 this.fiveLine=1;
322 return true;
323 }
324 else if(sum>4) //长连
325 this.overline=1;
326
327 return false; //上面均没成功,最后返回false
328 }
329}
330
331class Chess extends Canvas //棋子类,创建的对象即一个棋子,黑白在创建时确定
332{
333 private Color c;
334 private int chessSize;
335 public Chess(Color c)
336 {
337 this.c=c;
338 this.chessSize=16;
339 this.setSize(chessSize, chessSize);
340 }
341 public int getChessSize() //获得棋子大小
342 {
343 return chessSize;
344 }
345 public void paint(Graphics g) //画棋子
346 {
347 g.setColor(c);
348 g.fillOval(0, 0, chessSize, chessSize);
349 }
350}
351
352class MyActionItemListener implements ActionListener,ItemListener//菜单监听
353{
354 ChessFrame cf;
355 ChessPanel cp;
356 public MyActionItemListener(ChessFrame cf,ChessPanel cp)
357 {
358 this.cf=cf;
359 this.cp=cp;
360 }
361 public void actionPerformed(ActionEvent e)
362 {
363 if(e.getSource().equals( //游戏开始
364 cf.getJMenuBar().getMenu(0).getMenuComponent(0)))
365 {
366 cp.removeAll();
367 cp.initPointState();
368 cp.initVicAOl();
369 cp.setFrontChessColor(Color.WHITE); //保证每次黑棋先手
370 cp.setStart(1);
371 JOptionPane.showMessageDialog(cp, "游戏开始");
372 cf.jm[1].setEnabled(false);
373 }
374 else if(e.getSource().equals( //游戏重置
375 cf.getJMenuBar().getMenu(0).getMenuComponent(1)))
376 {
377 cp.removeAll();
378 cp.initPointState();
379 cp.initVicAOl();
380 cp.setFrontChessColor(Color.WHITE); //保证每次黑棋先手
381 cp.setStart(0);
382 cf.jm[1].setEnabled(true);
383 }
384 else if(e.getSource().equals( //游戏结束
385 cf.getJMenuBar().getMenu(0).getMenuComponent(2)))
386 {
387 cf.dispose();
388 System.exit(0);
389 }
390 else if(e.getSource().equals( //帮助 关于
391 cf.getJMenuBar().getMenu(3).getMenuComponent(0)))
392 {
393 JOptionPane.showMessageDialog(cp, "Author : ZHY");
394 }
395 }
396 public void itemStateChanged(ItemEvent e)
397 {
398 if(e.getItemSelectable().equals( //棋盘大小 15 * 15
399 cf.getJMenuBar().getMenu(1).getMenuComponent(0)))
400 {
401 cf.setLocation(255, 175);
402 cf.setSize(500, 500);
403 cp.setMaxRowCol(15, 15);
404 cp.setBounds(50, 25, 400, 400);
405 }
406 else if(e.getItemSelectable().equals( //棋盘大小 19 * 19
407 cf.getJMenuBar().getMenu(1).getMenuComponent(1)))
408 {
409 cf.setLocation(180, 100);
410 cf.setSize(650, 650);
411 cp.setMaxRowCol(19, 19);
412 cp.setBounds(72, 40, 500, 500);
413 }
414 else if(e.getItemSelectable().equals( //棋盘背景 红色
415 cf.getJMenuBar().getMenu(2).getMenuComponent(0)))
416 {
417 cp.setColor(Color.RED);
418 }
419 else if(e.getItemSelectable().equals( //棋盘背景 橘黄色
420 cf.getJMenuBar().getMenu(2).getMenuComponent(1)))
421 {
422 cp.setColor(Color.ORANGE);
423 }
424 else if(e.getItemSelectable().equals( //棋盘背景 青色
425 cf.getJMenuBar().getMenu(2).getMenuComponent(2)))
426 {
427 cp.setColor(Color.CYAN);
428 }
429 }
430}
431
432class MyMouseAdapter extends MouseAdapter //面板监听
433{
434 ChessPanel cp;
435 public MyMouseAdapter(ChessPanel cp)
436 {
437 this.cp=cp;
438 }
439 public void mousePressed(MouseEvent e)
440 {
441 Chess chess;
442 int indexX=-1,indexY=-1; //要下棋子的地方
443 int tag=0; //对棋盘点做的标示,初始为0,为1是黑,为2是白
444 if(cp.isStart()&& //是否有开始
445 (e.getX()-cp.getDistanceX())>=0&& //点击点是否在棋盘内
446 (e.getX()-cp.getDistanceX())<=(cp.getUnitSize()*(cp.getMaxcols()-1))&&
447 (e.getY()-cp.getDistanceY())>=0&&
448 (e.getY()-cp.getDistanceY())<=(cp.getUnitSize()*(cp.getMaxrows()-1))
449 )
450 {
451 if(cp.isFrontChessColorBlack()) //判断要下黑子还是白子
452 {
453 chess=new Chess(Color.WHITE);
454 cp.setFrontChessColor(Color.WHITE);
455 tag=2;
456 }
457 else
458 {
459 chess=new Chess(Color.BLACK);
460 cp.setFrontChessColor(Color.BLACK);
461 tag=1;
462 }
463
464 for(int i=0;i<cp.getMaxcols();i++) //确定要下棋子的横坐标
465 if((e.getX()-cp.getDistanceX())>=(i*cp.getUnitSize()-cp.getUnitSize()/2)&&
466 (e.getX()-cp.getDistanceX())<=(i*cp.getUnitSize()+cp.getUnitSize()/2)
467 )
468 indexX=i;
469
470 for(int j=0;j<cp.getMaxrows();j++) //确定要下棋子的纵坐标
471 if((e.getY()-cp.getDistanceY())>=(j*cp.getUnitSize()-cp.getUnitSize()/2)&&
472 (e.getY()-cp.getDistanceY())<=(j*cp.getUnitSize()+cp.getUnitSize()/2)
473 )
474 indexY=j;
475
476 if(tag==0)
477 {
478 JOptionPane.showMessageDialog(cp, "出现异常,无法判断下子颜色,下子失败!");
479 return ;
480 }
481
482 if(indexX==-1||indexY==-1) //是否会出现异常
483 {
484 JOptionPane.showMessageDialog(cp, "出现异常,无法确定下子坐标,下子失败!");
485 return ;
486 }
487
488 if(cp.isLayChess(indexY, indexX)) //若可以下子
489 {
490 cp.add(chess);
491 chess.setLocation(indexX*cp.getUnitSize()-chess.getChessSize()/2+cp.getDistanceX(),
492 indexY*cp.getUnitSize()-chess.getChessSize()/2+cp.getDistanceY());
493 cp.setPointState(indexY, indexX, tag);
494
495 Check ci=new Check(cp);
496
497 cp.checkIsVictory(indexY, indexX, tag);//每下一子,做次判断
498
499 if(cp.getFiveLine()==1||(tag==2&&cp.getOverline()==1))
500 {
501 String s;
502 if(tag==1) s="黑方胜利!";
503 else s="白方胜利";
504 JOptionPane.showMessageDialog(cp, s);
505 cp.setStart(0); //一盘结束
506 }
507 else if( tag==1&&
508 (cp.getOverline()==1||ci.isIled(indexY, indexX, tag)) )
509 {
510 String s;
511 s="禁手,白方胜利!";
512 JOptionPane.showMessageDialog(cp, s);
513 cp.setStart(0); //一盘结束
514 }
515 String s;
516 if(tag==1) s="黑方";
517 else s="白方";
518 System.out.println(s+"下子点:"+indexX+" "+indexY);
519 }
520 }
521 }
522}
523
524public class FiveChess
525{
526 public static void main(String[] args)
527 {
528 ChessFrame cf = new ChessFrame();
529 ChessPanel cp = new ChessPanel(15, 15);
530 cf.add(cp);
531 cp.setLocation(50, 25);
532 cf.setLayout(null);
533 for(int i=0;i<3;i++)
534 cf.jm1jmi[i].addActionListener(new MyActionItemListener(cf,cp));
535 for(int i=0;i<2;i++)
536 cf.jm2jrbmi[i].addItemListener(new MyActionItemListener(cf,cp));
537 for(int i=0;i<3;i++)
538 cf.jm3jrbmi[i].addItemListener(new MyActionItemListener(cf,cp));
539 cf.jm4jmi1.addActionListener(new MyActionItemListener(cf,cp));
540 cp.addMouseListener(new MyMouseAdapter(cp));
541 }
542}
543
544class Check //判断盘面类
545{
546 ChessPanel cp;
547 private int [][][]aroundPointState;
548 //直接举例说明其作用,aps(aroundPointState的简写)
549 //aps[0][0][0]=2 表示此次下子点
550 //左边(第三个下标表示,此为同一阳线或阴线上的两个方向(以所下子为分界))
551 //(这里约定 0 表示 上,左上,左,左下 ; 1 表示 下,右下,右,右上)
552 //与其相邻(第一个坐标表示,0为相邻,1表示中间有与所下子相同的子相隔或是空格)
553 //的空格(第二个坐标表示,0为空格,1为与所下子相同的子)
554 //连续有2个。
555 //aps[1][1][1]=3 右边空格相隔连续与所下子相同的子有3个
556 private int [][][]intervalPointState;
557 //此跟上面aps类似,相邻相同子-空白之后的相同子-空白
558
559
560 public Check(ChessPanel cp)
561 {
562 this.cp=cp;
563 aroundPointState =new int[2][2][2];
564 intervalPointState =new int[2][2][2];
565 initAPSIPS();
566 }
567
568 private void initAPSIPS() // 初始化 aroundPointState
569 {
570 for(int i=0;i<2;i++)
571 for(int j=0;j<2;j++)
572 for(int k=0;k<2;k++)
573 {
574 aroundPointState[i][j][k]=0;
575 intervalPointState[i][j][k]=0;
576 }
577 }
578
579 public boolean isIled(int x, int y, int tag)//判断是否为禁手
580 {
581 //约定:X为横轴,XY为45°斜轴,Y为纵轴,YX为135°斜轴
582 //记录该行三的个数,该行四的个数
583 int numThreeX=0,numFourX=0;
584 int numThreeXY=0,numFourXY=0;
585 int numThreeY=0,numFourY=0;
586 int numThreeYX=0,numFourYX=0;
587
588 initAPSIPS(); //初始化
589 doJudge(x, y, tag, 0, -1, 0);//横向 左
590 doJudge(x, y, tag, 0, 1, 1); //右
591 if(isConStraightThree()||isJumpStraightThree()) //是否有活三
592 numThreeX++;
593 if(isContinuousFour()||isStraightFour()) //是否有冲四或活四
594 numFourX++;
595
596 initAPSIPS(); //初始化
597 doJudge(x, y, tag, 1, -1, 0);//升斜向 左下
598 doJudge(x, y, tag, -1, 1, 1); //右上
599 if(isConStraightThree()||isJumpStraightThree()) //是否有活三
600 numThreeXY++;
601 if(isContinuousFour()||isStraightFour()) //是否有冲四或活四
602 numFourXY++;
603
604 initAPSIPS(); //初始化
605 doJudge(x, y, tag, 1, 0, 0);//纵向 上
606 doJudge(x, y, tag, -1, 0, 1); //下
607 if(isConStraightThree()||isJumpStraightThree()) //是否有活三
608 numThreeY++;
609 if(isContinuousFour()||isStraightFour()) //是否有冲四或活四
610 numFourY++;
611
612 initAPSIPS(); //初始化
613 doJudge(x, y, tag, -1, -1, 0);//降斜向 左上
614 doJudge(x, y, tag, 1, 1, 1); //右下
615 if(isConStraightThree()||isJumpStraightThree()) //是否有活三
616 numThreeYX++;
617 if(isContinuousFour()||isStraightFour()) //是否有冲四或活四
618 numFourYX++;
619
620 if( (numThreeX+numThreeXY+numThreeY+numThreeYX)>=2 //三三
621 || (numFourX+numFourXY+numFourY+numFourYX)>=2 ) //四四 类
622 return true; //包含了四四三、四三三类
623
624 return false; //以上不符合,返回false
625 }
626
627 //这里为一个通用的方法,计算8个方向的情况
628 //xtag,ytag为方向标示 范围 -1、0、1
629 //waytag为阳线或阴线方向上的2个分方向的标示,以落子点位分界,范围 0、1
630 //x,y,tag为落子点的坐标和颜色标记
631 private boolean doJudge(int x, int y, int tag, int xtag,int ytag, int waytag)
632 {
633 int maxcount; //计算最大循环次数用的
634 if(ytag==0) //纵向时用 x
635 {
636 if(waytag==0) maxcount=x; //上
637 else maxcount=cp.getMaxrows()-1-x; //下
638 }
639 else //其他用 y
640 {
641 if(waytag==0) maxcount=y; //左上、左、左下
642 else maxcount=cp.getMaxcols()-1-y; //右下、右、右上
643 }
644
645 if( ((xtag==1&&(x+xtag)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x+xtag)>=0)) //纵向不越界
646 &&
647 ((ytag==1&&(y+ytag)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y+ytag)>=0)) //横向不越界
648 &&
649 cp.getPointState(x+xtag, y+ytag)==0 //相邻先是空格
650 )
651 {
652 aroundPointState[0][0][waytag]++;
653 for(int i=2;i<=maxcount;i++)
654 {
655 if(aroundPointState[1][1][waytag]==0&&
656 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
657 &&
658 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
659 &&
660 cp.getPointState(x+xtag*i, y+ytag*i)==0 //空格
661 )
662 aroundPointState[0][0][waytag]++;
663
664 else if( intervalPointState[0][0][waytag]==0&&
665 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
666 &&
667 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
668 &&
669 cp.getPointState(x+xtag*i, y+ytag*i)==tag //相同子
670 )
671 aroundPointState[1][1][waytag]++;
672
673 else if(aroundPointState[1][1][waytag]!=0
674 &&
675 intervalPointState[1][1][waytag]==0
676 &&
677 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
678 &&
679 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
680 &&
681 cp.getPointState(x+xtag*i, y+ytag*i)==0 //间隔空格
682 )
683 intervalPointState[0][0][waytag]++;
684
685 else if(intervalPointState[0][0][waytag]!=0&&
686 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
687 &&
688 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
689 &&
690 cp.getPointState(x+xtag*i, y+ytag*i)==tag //间隔相同子
691 )
692 intervalPointState[1][1][waytag]++;
693 else
694 break;
695 }
696 }
697
698 else if( ((xtag==1&&(x+xtag)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x+xtag)>=0)) //纵向不越界
699 &&
700 ((ytag==1&&(y+ytag)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y+ytag)>=0)) //横向不越界
701 &&
702 cp.getPointState(x+xtag, y+ytag)==tag //相邻先是相同子
703 )
704 {
705 aroundPointState[0][1][waytag]++;
706 for(int i=2;i<=maxcount;i++)
707 {
708 if(aroundPointState[1][0][waytag]==0&&
709 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
710 &&
711 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
712 &&
713 cp.getPointState(x+xtag*i, y+ytag*i)==tag //相同子
714 )
715 aroundPointState[0][1][waytag]++;
716
717 else if( intervalPointState[0][1][waytag]==0&&
718 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
719 &&
720 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
721 &&
722 cp.getPointState(x+xtag*i, y+ytag*i)==0 //空格
723 )
724 aroundPointState[1][0][waytag]++;
725
726 else if( aroundPointState[1][0][waytag]!=0
727 &&
728 intervalPointState[1][0][waytag]==0
729 &&
730 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
731 &&
732 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
733 &&
734 cp.getPointState(x+xtag*i, y+ytag*i)==tag //间隔相同子
735 )
736 intervalPointState[0][1][waytag]++;
737
738 else if(intervalPointState[0][1][waytag]!=0&&
739 ((xtag==1&&(x+i)<cp.getMaxrows()) || (xtag==0) || (xtag==-1&&(x-i)>=0)) //纵向不越界
740 &&
741 ((ytag==1&&(y+i)<cp.getMaxcols()) || (ytag==0) || (ytag==-1&&(y-i)>=0)) //横向不越界
742 &&
743 cp.getPointState(x+xtag*i, y+ytag*i)==0 //间隔空格
744 )
745 intervalPointState[1][0][waytag]++;
746
747 else
748 break;
749 }
750 }
751 else return false; //相邻为不同子,直接返回
752
753 return true; //最后返回true
754 }
755
756 private boolean isConStraightThree()//判断是否为连活三
757 {
758 //有3种情况,分别列出3种情况,看其阳线或阴线周围情况是否符合
759 //先来是判断是否为连活三,情况都是以左、中、右或上、中、下来列
760 if(aroundPointState[0][1][1]==2
761 &&
762 ((aroundPointState[0][0][0]>=1&&aroundPointState[1][0][1]>=2)
763 ||(aroundPointState[0][0][0]>=2&&aroundPointState[1][0][1]>=1))
764 )
765 return true;
766 else if(aroundPointState[0][1][0]==1&&aroundPointState[0][1][1]==1
767 &&
768 ((aroundPointState[1][0][0]>=1&&aroundPointState[1][0][1]>=2)
769 ||(aroundPointState[1][0][0]>=2&&aroundPointState[1][0][1]>=1))
770 )
771 return true;
772 else if(aroundPointState[0][1][0]==2
773 &&
774 ((aroundPointState[1][0][0]>=1&&aroundPointState[0][0][1]>=2)
775 ||(aroundPointState[1][0][0]>=2&&aroundPointState[0][0][1]>=1))
776 )
777 return true;
778
779 return false; //以上3种情况都不是,非连活三
780 }
781
782 private boolean isJumpStraightThree() //判断是否为跳活三
783 {
784 //有两种情况,左2右1、左1右2 分别列出3种情况,看其阳线或阴线周围情况是否符合
785 //先左2右1 判断子顺序 左、中、右
786 if(aroundPointState[0][1][1]==1&&aroundPointState[1][0][1]==1
787 &&intervalPointState[0][1][1]==1
788 &&
789 ((aroundPointState[0][0][0]>=1&&intervalPointState[1][0][1]>=2)
790 ||(aroundPointState[0][0][0]>=2&&intervalPointState[1][0][1]>=1))
791 )
792 return true;
793
794 else if(aroundPointState[0][1][0]==1&&
795 aroundPointState[0][0][1]==1&&aroundPointState[1][1][1]==1
796 &&
797 ((aroundPointState[1][0][0]>=1&&intervalPointState[0][0][1]>=2)
798 ||(aroundPointState[1][0][0]>=2&&intervalPointState[0][0][1]>=1))
799 )
800 return true;
801
802 else if(aroundPointState[0][0][0]==1
803 &&aroundPointState[1][1][0]==2
804 &&
805 ((intervalPointState[0][0][0]>=1&&aroundPointState[0][0][1]>=2)
806 ||(intervalPointState[0][0][0]>=2&&aroundPointState[0][0][1]>=1))
807 )
808 return true;
809
810 //接下来 左1右2 判断子顺序 左、中、右
811 if(aroundPointState[0][0][1]==1&&aroundPointState[1][1][1]==2
812 &&
813 ((aroundPointState[0][0][0]>=1&&intervalPointState[0][0][1]>=2)
814 ||(aroundPointState[0][0][0]>=2&&intervalPointState[0][0][1]>=1))
815 )
816 return true;
817
818 else if(aroundPointState[0][0][0]==1&&
819 aroundPointState[1][1][0]==1&&aroundPointState[0][1][1]==1
820 &&
821 ((intervalPointState[0][0][0]>=1&&aroundPointState[1][0][1]>=2)
822 ||(intervalPointState[0][0][0]>=2&&aroundPointState[1][0][1]>=1))
823 )
824 return true;
825
826 else if(aroundPointState[0][1][0]==1&&aroundPointState[1][0][0]==1
827 &&intervalPointState[0][1][0]==1
828 &&
829 ((aroundPointState[0][0][1]>=1&&intervalPointState[1][0][0]>=2)
830 ||(aroundPointState[0][0][1]>=2&&intervalPointState[1][0][0]>=1))
831 )
832 return true;
833
834 return false; //以上6种情况都不是,非跳活三
835 }
836
837 private boolean isContinuousFour() //是否为冲四
838 {
839 //这里判断是否为冲四,依旧是列举每种情况,看是否是,4类,每类4中情况
840
841 //左1右3 左1、右3、右2、右1
842 if(aroundPointState[0][0][1]==1&&aroundPointState[1][1][1]==3&&
843 aroundPointState[0][1][0]==0)
844 return true;
845 else if(aroundPointState[0][0][0]==1&&aroundPointState[1][1][0]==1
846 &&intervalPointState[0][1][0]==0&&aroundPointState[0][1][1]==2)
847 return true;
848 else if(aroundPointState[0][1][0]==1&&aroundPointState[1][0][0]==1
849 &&intervalPointState[0][1][0]==1&&aroundPointState[0][1][1]==1)
850 return true;
851 else if(aroundPointState[0][1][0]==2&&aroundPointState[1][0][0]==1
852 &&intervalPointState[0][1][0]==1&&aroundPointState[0][1][1]==0)
853 return true;
854
855 //左2右2 左1、左2、右2、右1
856 if(aroundPointState[0][1][0]==0&&aroundPointState[0][1][1]==1&&
857 aroundPointState[1][0][1]==1&&intervalPointState[0][1][1]==2)
858 return true;
859 else if(aroundPointState[0][1][0]==1&&
860 aroundPointState[0][0][1]==1 &&aroundPointState[1][1][1]==2)
861 return true;
862 else if(aroundPointState[0][0][0]==1&&aroundPointState[1][1][0]==2
863 &&aroundPointState[0][1][1]==1)
864 return true;
865 else if(aroundPointState[0][1][0]==1&&aroundPointState[1][0][0]==1
866 &&intervalPointState[0][1][0]==2&&aroundPointState[0][1][1]==0)
867 return true;
868
869 //左3右1 左1、左2、左3、右1
870 if(aroundPointState[0][1][0]==0&&aroundPointState[0][1][1]==2&&
871 aroundPointState[1][0][1]==1&&intervalPointState[0][1][1]==1)
872 return true;
873 else if(aroundPointState[0][1][0]==1&&aroundPointState[0][1][1]==1
874 &&aroundPointState[1][0][1]==1&&intervalPointState[0][1][1]==1)
875 return true;
876 else if(aroundPointState[0][1][0]==2&&
877 aroundPointState[0][0][1]==1&&aroundPointState[1][1][1]==1)
878 return true;
879 else if(aroundPointState[0][0][0]==1&&aroundPointState[1][1][0]==3
880 &&aroundPointState[0][1][1]==0)
881 return true;
882
883 //4个连一起 左、中间2个、右
884 if(
885 aroundPointState[0][1][1]==3&&( (aroundPointState[0][0][0]==0
886 &&aroundPointState[0][1][0]==0&&aroundPointState[1][0][1]>=1)
887 ||(aroundPointState[0][0][0]>=1&&aroundPointState[1][0][1]==0) )
888 )
889 return true;
890
891 else if(
892 ( (aroundPointState[0][1][0]==1&&aroundPointState[0][1][1]==2)
893 ||(aroundPointState[0][1][0]==2&&aroundPointState[0][1][1]==1) )
894 &&
895 ( (aroundPointState[1][0][0]==0&&aroundPointState[1][0][1]>=1)
896 ||(aroundPointState[1][0][0]>=1&&aroundPointState[1][0][1]==0) )
897 )
898 return true;
899
900 else if(
901 aroundPointState[0][1][0]==3&&( (aroundPointState[0][0][1]==0
902 &&aroundPointState[0][1][1]==0&&aroundPointState[1][0][0]>=1)
903 ||(aroundPointState[0][0][1]>=1&&aroundPointState[1][0][0]==0) )
904 )
905 return true;
906
907 return false; //以上都不是 返回false
908 }
909
910 private boolean isStraightFour() //是否为活四
911 {
912 //判断是否为活四,4种情况,列出 左、中间2个、右
913 if( aroundPointState[0][1][1]==3&&
914 ( (aroundPointState[0][0][0]>=1&&aroundPointState[1][0][1]>=2)
915 ||(aroundPointState[0][0][0]>=2&&aroundPointState[1][0][1]>=1) )
916 )
917 return true;
918 else if(
919 ( (aroundPointState[0][1][0]==1&&aroundPointState[0][1][1]==2)
920 ||(aroundPointState[0][1][0]==2&&aroundPointState[0][1][1]==1) )
921 &&
922 ( (aroundPointState[1][0][0]>=1&&aroundPointState[1][0][1]>=2)
923 ||(aroundPointState[1][0][0]>=2&&aroundPointState[1][0][1]>=1) )
924 )
925 return true;
926 else if( aroundPointState[0][1][0]==3&&
927 ( (aroundPointState[1][0][0]>=1&&aroundPointState[0][0][1]>=2)
928 ||(aroundPointState[1][0][0]>=2&&aroundPointState[0][0][1]>=1) )
929 )
930 return true;
931
932 return false; //以上情况都不是,返回false
933 }
934}
|