Adol  
日历
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345
统计
  • 随笔 - 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(255175);
 35        this.setSize(500500);
 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==1return 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, 66);
231        g.fillOval((star * 3 - 1* unitSize - 3 + distanceX, (star - 1)
232                * unitSize - 3 + distanceY, 66);
233        g.fillOval((star - 1* unitSize - 3 + distanceX, (star * 3 - 1)
234                * unitSize - 3 + distanceY, 66);
235        g.fillOval((star * 3 - 1* unitSize - 3 + distanceX, (star * 3 - 1)
236                * unitSize - 3 + distanceY, 66);
237        g.fillOval((star * 2 - 1* unitSize - 3 + distanceX, (star * 2 - 1)
238                * unitSize - 3 + distanceY, 66);
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(00, 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(255175);
402            cf.setSize(500500);
403            cp.setMaxRowCol(1515);
404            cp.setBounds(5025400400);
405        }

406        else if(e.getItemSelectable().equals(  //棋盘大小 19 * 19
407                cf.getJMenuBar().getMenu(1).getMenuComponent(1)))
408        {
409            cf.setLocation(180100);
410            cf.setSize(650650);
411            cp.setMaxRowCol(1919);
412            cp.setBounds(7240500500);
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(1515);            
530        cf.add(cp);
531        cp.setLocation(5025);
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-10);//横向  左
590        doJudge(x, y, tag, 011); //
591        if(isConStraightThree()||isJumpStraightThree())  //是否有活三
592            numThreeX++;
593        if(isContinuousFour()||isStraightFour())  //是否有冲四或活四
594            numFourX++;
595        
596        initAPSIPS();   //初始化                          
597        doJudge(x, y, tag, 1-10);//升斜向  左下
598        doJudge(x, y, tag, -111); //右上
599        if(isConStraightThree()||isJumpStraightThree())  //是否有活三
600            numThreeXY++;
601        if(isContinuousFour()||isStraightFour())  //是否有冲四或活四
602            numFourXY++;
603        
604        initAPSIPS();   //初始化                          
605        doJudge(x, y, tag, 100);//纵向  上
606        doJudge(x, y, tag, -101); //
607        if(isConStraightThree()||isJumpStraightThree())  //是否有活三
608            numThreeY++;
609        if(isContinuousFour()||isStraightFour())  //是否有冲四或活四
610            numFourY++;            
611        
612        initAPSIPS();   //初始化                          
613        doJudge(x, y, tag, -1-10);//降斜向  左上
614        doJudge(x, y, tag, 111); //右下
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}
posted on 2009-08-12 23:13 Adol 阅读(1287) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © Adol Powered by: 博客园 模板提供:沪江博客