五子棋初级实验版-人机对战(课程设计)

程序说明:大学期间的课程设计,黑棋先行,此程序仅仅试探性的的摸清五子棋程序框架设计的基本思路,其具体的五子棋下棋思路还有待完善,此程序仅从防守的角度给予回应对方棋子,也没有禁手的设置。

其源代码如下:

public class Untitled7 extends javax.swing.JFrame {
  javax.swing.JButton jbBegin = new javax.swing.JButton("重新开始");
  javax.swing.JButton jbBack = new javax.swing.JButton("悔棋");
  javax.swing.JPanel jpButt = new javax.swing.JPanel();

  int M = 15;
  int board[][] = new int[M][M];//存储棋盘上的落子状况
  int FLAG = 1;//胜负状态标志

  public Untitled7(){
    jpButt.setLayout(new java.awt.FlowLayout());
    jpButt.add(jbBegin);
    jpButt.add(jbBack);

    gbPanel gp = new gbPanel();
    this.getContentPane().add(jpButt,java.awt.BorderLayout.NORTH);
    this.getContentPane().add(gp,java.awt.BorderLayout.CENTER);

    this.setSize(310,372);
    this.setResizable(false);
    this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
    this.setVisible(true);
  }
  public static void main(String[] args) {
    new Untitled7();
  }

  class gbPanel extends javax.swing.JPanel{
    public gbPanel(){
        this.addMouseListener(new mouselis());//落子事件
    }
    public void paintComponent(java.awt.Graphics g){
      super.paintComponent(g);
      javax.swing.ImageIcon icon1 = new javax.swing.ImageIcon("五子棋_棋盘.jpg");
      g.drawImage(icon1.getImage(),0,0,this);//在panel中绘制棋盘
      for(int i=0;i<M;i++)
        for(int j=0;j<M;j++){
          if(1==board[i][j]){//重绘黑子
            g.drawImage(new mouselis().iconB.getImage(),i*20+1,j*20+1,this);
          }
          else if(2==board[i][j]){//重绘白字
            g.drawImage(new mouselis().iconW.getImage(),i*20+1,j*20+1,this);
          }
        }
    }
    class mouselis extends java.awt.event.MouseAdapter{
     javax.swing.ImageIcon iconB = new javax.swing.ImageIcon("五子棋_黑子.jpg");
     javax.swing.ImageIcon iconW = new javax.swing.ImageIcon("五子棋_白子.jpg");
     String strb = "黑方";
     String strw = "白方";
     public void mouseClicked(java.awt.event.MouseEvent e) {
       int xb = e.getX()/20;//获取黑棋落子的行号
       int yb = e.getY()/20;//获取黑棋落子的列号
       int mb = xb*20;//
       int nb = yb*20;//
       if(1==FLAG){
         if (0 == board[xb][yb]) { //该点为空,可以着子
           getGraphics().drawImage(iconB.getImage(), mb + 1, nb + 1, gbPanel.this);
           board[xb][yb] = 1;//修改存储信息
           win(board, xb, yb, strb);//判断胜负
           if(1==FLAG){
             int xw = gow(board) / 15;//获取白棋落子的行号
             int yw = gow(board) % 15;
             int mw = xw * 20;
             int nw = yw * 20;
             getGraphics().drawImage(iconW.getImage(), mw + 1, nw + 1, gbPanel.this);
             board[xw][yw] = 2;
             win(board, xw, yw, strw);
           }
         } //end if black
       }
     }//end void mouseClicked()

     int gow(int board[][]){
       int k=0;int max=0;int tagb = 0;int tagw = 0;
       int bla[] = new int[4];
       int whi[] = new int[4];
       java.util.Vector v4= new java.util.Vector();
       java.util.Vector v3= new java.util.Vector();
       java.util.Vector v2= new java.util.Vector();
       java.util.Vector v1= new java.util.Vector();
       java.util.Vector v0= new java.util.Vector();

       for(int i=0;i<M;i++){
         for(int j=0;j<M;j++){

           for(int t=0;t<4;t++){
             bla[t] = 0;//init bla[]
             whi[t] = 0;//init whi[]
             tagb=0;
             tagw=0;
           }//end for for

           if(0==board[i][j]){ //当前坐标可以着子
             int buf[][]={{1,0},{1,1},{0,1},{-1,1}};//四个方向

             for(int m=0;m<4;m++){//向四个方向搜索
               int num = 1;
               for(int n=-1;n<2;n+=2){//每个方向的正反两个方向
                 int t=1,row,col;
                 while(t!=0){
                   row = i+buf[m][0]*n*t;//行值++或行值--
                   col = j+buf[m][1]*n*t;
                   if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(2==board[row][col])){
                     whi[m]++;//坐标row,col处为白子
                     t++;
                   }
                   else if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(1==board[row][col])){
                     tagw = 1;//连续白子后的棋子为对方棋子,默认为空
                     t = 0;
                   }
                   else
                     t=0;
                 }
                 t=1;
                 while(t!=0){
                   row = i+buf[m][0]*n*t;
                   col = j+buf[m][1]*n*t;
                   if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(1==board[row][col])){
                     bla[m]++;//坐标row,col处为黑子
                     t++;
                   }
                   else if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(2==board[row][col])){
                     tagb = 2;//连续黑子后的棋子为对方棋子,默认为空
                     t = 0;
                   }
                   else
                     t=0;
                 }
               }
             }
           }//end if
           int z=0;
           for(int p = 0;p < 4;p++){
             for (int q = 0; q < 4; q++) {
               if (whi[q] > 3 ) {//当前i,j坐标处的四个方向的白色棋子大于3,自己着子后就获胜
                 v4.addElement(new Integer(k));
               }
               else if(bla[q]>3){//当前i,j坐标处的四个方向的黑色棋子大于3,自己必须防守,否则就败
                 v3.addElement(new Integer(k));
               }
               else if ( (whi[q] == 3)) {//当前i,j坐标处的四个方向的白色棋子等于3,进行冲4
                 v2.addElement(new Integer(k));
               }
               else if ( (tagb==0)&&(bla[q]==3)) {//当前i,j坐标处的四个方向的黑色棋子等于3,且为活三
                 v1.addElement(new Integer(k));
               }
               else {
                 if (max < (bla[p] + whi[q])) {//选取连接白子和黑子最多的点
                   max = (bla[p] + whi[q]);
                   v0.removeAllElements();
                   v0.addElement(new Integer(k));
                 }
                 else if(max == (bla[p] + whi[q])){
                   v0.addElement(new Integer(k));
                 }
               }
             }
           }
           k++;
         }//end for j
       }//end for i

       if (!v4.isEmpty()) {
         return Integer.parseInt(v4.elementAt(0).toString());
       }
       else if (!v3.isEmpty()) {
         return Integer.parseInt(v3.elementAt(0).toString());
       }
       else if (!v2.isEmpty()) {
         return Integer.parseInt(v2.elementAt(0).toString());
       }
       else if (!v1.isEmpty()) {
         return Integer.parseInt(v1.elementAt(0).toString());
       }
       else
         return Integer.parseInt(v0.elementAt(0).toString());
     }//end int gow()


     public void win(int qi[][],int m,int n,String str){

       int buf[][]={{1,0},{1,1},{0,1},{-1,1}};
       int color = qi[m][n];
       for(int i=0;i<4;i++){
         int num = 1;
         for(int k=-1;k<2;k+=2){
           int t=1,row,col;
           while(t!=0){
               row = m+buf[i][0]*k*t;
               col = n+buf[i][1]*k*t;
               if((row>=0)&&(col>=0)&&(row<15)&&(col<15)&&(color==qi[row][col])){
                 num++;
                 if(num==5){
                   javax.swing.JOptionPane.showMessageDialog(Untitled7.this,
                       str+"胜利",
                       "结果",
                       javax.swing.JOptionPane.INFORMATION_MESSAGE);
                   FLAG = 2;
                 }
                 t++;
               }
               else
                 t=0;
           }
         }
       }
     }

   }//end class mouselis
 }//end class gbpanel
}//end

运行结果截图:

转载于:https://my.oschina.net/chwencong/blog/2209152

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值