⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chessboard.java

📁 java版本的五子棋java版本的五子棋
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package 五子棋2;import javax.swing.JPanel;import java.awt.*;import javax.swing.JOptionPane;public class ChessBoard extends JPanel{	    public ChessBoard(Image o, Image x, Color bg)    {   //构造函数,初始化参数;        this.x = x; this.o = o;        setBackground(bg);        table=new int [15][15];        road=new int [225];        //按顺序存放所有以下的棋的位置;        NewGame();    }    public void size(int w, int h)   {                                  //设置棋盘的大小;       width = w; height = h;       tw = (width-14*lw)/15;       th = (height-14*lw)/15;   }      public void paintComponent(Graphics g)   {                                                  //绘制棋盘       this.g = g;       super.paintComponent(g); //paint background       Insets insets = getInsets();       int x0 = insets.left; int y0 = insets.top;       int w = getWidth() - x0 - insets.right;       int h = getHeight() - y0 - insets.bottom;       size(w, h);       g.setColor(Color.black);   // foreground color       drawBoard();       draw();   }      protected void drawBoard()    {                                     //在panel上画棋盘,15*15;       g.drawLine(tw, y0, tw, height);       for(int i=1;i<14;i++)           g.drawLine((i+1)*tw+i*lw, y0, (i+1)*tw+i*lw, height);       g.drawLine(x0, th, width, th);       for(int j=1;j<14;j++)           g.drawLine(x0, (j+1)*th+j*lw, width, (j+1)*th+j*lw);   }         public void drawPiece(int player, int c,int r)   {                                                       //在棋盘上画“o”或“X”       if(player==Player)       {                                                   //如果该位置是玩家的棋,则在该位置画“x”       g.drawImage( x ,c*(tw+lw)+1, r*(th+lw)+1, tw-1, th-1, this);       }       else     	   if(player==Computer)    	   {                                                          //如果该位置是电脑的棋,则在该位置画“o”           g.drawImage( o ,c*(tw+lw)+1, r*(th+lw)+1, tw-1, th-1, this);           }   }      public void draw()   {                                                             //绘制棋盘       for(int i=0;i<15;i++)       {           for(int j=0;j<15;j++)           {               if(table[i][j]==2)                   drawPiece(Player,j,i);               if(table[i][j]==1)                   drawPiece(Computer,j,i);           }       }   }      void StartGame(int x,int y)   {                                                            //进行游戏;       if(first==0)       {                                                      //如果没选择谁先下棋,则弹出提示框;           JOptionPane.showMessageDialog(this, "请选择谁先下棋!", "Warning",JOptionPane.WARNING_MESSAGE);           NewGame();       }       else        {                                                         //进行游戏           if(!PlayerMove(x,y))return ;                       //如果要走的这部出现错误,如该步已有棋子、玩家已经胜利、棋盘已满等,则跳出,以免电脑多走;           CMove();       }   }     boolean PlayerMove(int x,int y)   {                                  //玩家走棋;       int r=setRow(y);                //将读入鼠标的坐标转化为棋盘的下标;       int c=setCol(x);       if(table[r][c]!=0)return false;//如果棋盘已经有棋子,则表示出错,跳出函数;       table[r][c]=2;//将玩家所下棋的位置社为2;       repaint();//重新绘制棋盘;       road[mcount]=r*20+c;//保存下起的位置;       mcount++;//所走步数加1;       if(IsWin(Player,c,r)){//判断玩家是否已经赢,如果是则提示,且开始新游戏;           JOptionPane.showMessageDialog(this, "玩家胜出!", "Warning",JOptionPane.WARNING_MESSAGE);           NewGame();           return false;      }      if(mcount==226){//判断棋盘是否已经满,如果是则提示和棋;           JOptionPane.showMessageDialog(this, "和棋!", "Warning",JOptionPane.WARNING_MESSAGE);           NewGame();           return false;      }           return true;   }       public int  setCol(int x)   {                                                  //转化列下表        return (int) ((x * 15) / width) ;    }    public int   setRow(int y)    {                                          //转化行下表       return (int)((y * 15) / height) ;   }       void NewGame()    {                                                //新游戏       int i,j,k;       for(i=0;i<15;i++)                          //初始化棋盘           for(j=0;j<15;j++)               table[i][j]=0;       first=0;                                       //谁先下棋标志设为0;       mcount=0;                                    //把下起步数设为0;               repaint();                                          //重绘棋盘   }      void CFirst()   {//电脑先下,把first设为1;       first=Computer;   }   void PFirst()   {//玩家先下,把first设为2;       first=Player;   }      void UnMove()   {                                                                         //悔棋       if(mcount==1&&first==1)        {       int temp,i,j;       temp=road[mcount-1];//退掉电脑走的棋       i=temp/15;       j=temp%15;       table[i][j]=0;           mcount=0;                  }       if(mcount>=2){       int temp,i,j;       temp=road[mcount-1];//退掉电脑走的棋       i=temp/15;       j=temp%15;       table[i][j]=0;       temp=road[mcount-2];//退掉玩家走的棋       i=temp/15;       j=temp%15;       table[i][j]=0;       mcount=mcount-2;//总步数减2;       }       repaint();//重绘棋盘   }      boolean IsWin(int player,int x,int y)   {                                                                                //下一步棋,判断是否会赢;       int index;       int c;       c=0;              for(index=x-4;index<x+5;index++)                 {                                                                       //判断水平方向是否存在连续的5个棋           if(index>=0){               if(index<15){                   if(table[y][index]==player){                       c++;                       if(c==5)break;                   }                   else {                       c=0;                       continue;                      }               }               else break;           }       }       if(c==5)return true;       c=0;       for(index=y-4;index<y+5;index++){////判断竖直方向是否存在连续的5个棋           if(index>=0){               if(index<15){                   if(table[index][x]==player){                       c++;                       if(c==5)break;                   }                   else {                       c=0;                       continue;                   }               }               else break;           }       }       if(c==5)return true;       c=0;       int index1=x-4;       for(index=y-4;index<y+5;index++){//判断135度斜线方向是否存在连续的5个棋           if(index>=0&&index1>=0){               if(index<15&&index1<15){                   if(table[index][index1]==player){                       c++;                       if(c==5)break;                   }                   else {                       c=0;                       index1++;                       continue;                   }               }               else break;           }           index1++;       }       if(c==5)return true;       c=0;       index1=y+4;       for(index=x-4;index<x+5;index++){//判断45度斜线方向是否存在连续的5个棋           if(index>=0&&index1<15){               if(index<15&&index1>=0){                   if(table[index1][index]==player){                       c++;                       if(c==5)break;                   }                   else {                       c=0;                       index1--;                       continue;                   }               }               else break;           }           index1--;       }       if(c==5)return true;       return false;   }      void CMove()    {                                                                   //电脑走棋!(这里为测试,所以用随机数产生行列坐标;)       if(mcount==0){           table[7][7]=1;       }       else{              cmax=evaluate(1);       System.out.println(cmax);       ci=id;       cj=jd;       pmax=evaluate(2);        System.out.println(pmax);       pi=id;       pj=jd;       if(cmax>=pmax){           cx=cj;           cy=ci;       }       else       {           cx=pj;           cy=pi;       }           	   //evaluate3(1);    	          table[cy][cx]=1;       }     road[mcount]=cy*15+cx;      mcount++;      repaint();      if(IsWin(Computer,cx,cy)){           JOptionPane.showMessageDialog(this, "电脑胜出!", "Warning",JOptionPane.WARNING_MESSAGE);           NewGame();      }      if(mcount==226){           JOptionPane.showMessageDialog(this, "和棋!", "Warning",JOptionPane.WARNING_MESSAGE);          NewGame();      }         }    //************************************************************************************   void  counter1(int m,int n,int p) //计算水平方向上个数和死活状态{	   int a1,a2;	   a1=a2=0;       if(table[m][n]==0)       {	   b=0;                                      //table[m][n]==k;b=0表示双死,b==1表示单活,b==2双活	   int i,j;	   i=j=0;	   num=0;	   while(n-1-i>=0&&table[m][n-1-i]==p)  	   {		   i++;	   }	   num=i;	   a1=n-1-i;	  	   if(n-2-i>=0)		   if(table[m][n-1-i]==0&&table[m][n-2-i]==p)		   {			   i++;			   a1--;			   a1--;		   }	 	   while(n+1+j<15&&table[m][n+1+j]==p)	   {		   j++;	   }	   a2=n+1+j;	   	   if(n+2+j<15)		   if(table[m][n+1+j]==0&&table[m][n+1+j+1]==p)		   {   			   j++;			   a2++;			   a2++;		   }	   	   	   num=i+j+1;		   	               if(a1>=0)	   if(table[m][a1]==0)		   b++;           if(a2<15)	   if(table[m][a2]==0)		   b++;	   if(b==2)		   huo[num]++;	   if(b==1)		   si[num]++;	   if(num==5)		   si[num]=huo[num]=1;       }		   }  void  counter2(int m,int n,int p)                     //计算竖直方向上个数和死活状态{	   int a1,a2;	   a1=a2=0;       if(table[m][n]==0)       {	   b=0;                                      //table[m][n]==k;b=0表示双死,b==1表示单活,b==2双活	   int i,j;	   i=j=0;	   num=0;	  	   while(m-1-i>=0&&table[m-1-i][n]==p)  	   {		   i++;	   }	   a1=m-1-i;		  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -