简单五子棋

制作简单的五子棋

通过类的继承,使用全局变量,为了以后的修改做准备,这样也是便于修改的体现
public interface Config {
    int x0=40,y0=40;//坐标起始位置
    int ROWS=15,COLS=15;//行列数
    int SIZE=36;//单元格大小
    int Chess_Size=30;//棋子大小
    //定义一个数组保存棋盘的状态
    byte[][] CHESSES=new byte[ROWS][COLS];
}

   首先就是界面的设置
public void CHESSUI(){

//添加菜单
/*
* JMenuBar bar=new JMenuBar()
* JMenu menu=new JMenu("文件")
* bar.add(menu)
* JMenuItem item=new JMenuItem("新建")
* menu.add(item)
*设置窗体菜单
*this.setJMenuBar(bar)
* */

      this.setTitle("五子棋");
      this.setSize(600, 600);
      this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
      JPanel jpanel=new Mypanel();
      jpanel.setBackground(new Color(194,157,68));
      this.add(jpanel);
     
      this.setVisible(true);
      Graphics g=jpanel.getGraphics();
      ChessListener clis=new ChessListener(g);
      jpanel.addMouseListener(clis);
}


上面是调试之后的界面。
class Mypanel extends JPanel{

@Override
public void paint(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
SuanFa(g);
CHESS(g);
}
public void SuanFa(Graphics g){
for(int i=0;i<ROWS;i++)  这个是画表格的方法,以每一个方块为界限  用For循环实现你

{
g.drawLine(x0, y0+SIZE*i, x0+SIZE*(COLS-1),y0+SIZE*i );
}
for(int i=0;i<COLS;i++)
{
g.drawLine(x0+SIZE*i, y0, x0+SIZE*i,y0+SIZE*(ROWS-1) );
}
}
因为是定义好了 黑棋(1)和白棋(-1),由于没下一次就给数组定义一个数,所以根据数组是1还是-1来判断是什么棋,下面的方法是保存棋盘的方法
public void CHESS(Graphics g){
for(int i=0;i<ROWS;i++){
for(int j=0;j<COLS;j++)
{
if(CHESSES[i][j]!=0)
{
if(CHESSES[i][j]==1)
                     {
g.setColor(Color.BLACK);
}else if(CHESSES[i][j]==-1)
{
g.setColor(Color.WHITE);
}
int x1=x0+SIZE*j;
    int y1=y0+SIZE*i;
    g.fillOval(x1-Chess_Size/2, y1-Chess_Size/2, Chess_Size, Chess_Size);
}
}
}
}

下面是监听器部分

public class ChessListener extends MouseAdapter implements Config {
   private Graphics g;
   private byte flag=1;
   private boolean isOver=false;
    
public ChessListener(Graphics g){
this.g=g;
}
   
        
    public void mouseReleased(MouseEvent e) {
    //获得点击点的坐标
    //ROWS是行
    int x=e.getX();
    int y=e.getY();
    //行数,列数
    int r=(y-y0)/SIZE;
    int c=(x-x0)/SIZE;      没有点击在点上的话,根据距离点的范围,判断棋显示在哪里,大于一半就加一
    //判断是左还是右
    if((y-y0)%SIZE>SIZE/2){
    r++;  
    }
    if((x-x0)%SIZE>SIZE/2){
    c++;
    }
    是不是在棋盘范围内,棋盘上是不是有棋子判断是否可以落子
    if(!isOver&&c>=0&&c<COLS&&r>=0&&r<ROWS&&CHESSES[r][c]==0){
    int x1=x0+SIZE*c;
    int y1=y0+SIZE*r;
   
    CHESSES[r][c]=flag;
    落完之后改变棋子的flag
    if(flag==1){
    g.setColor(Color.BLACK);
    flag=-1;
    }
    else if(flag==-1){
    g.setColor(Color.WHITE);
    flag=1;
    }
    g.fillOval(x1-Chess_Size/2, y1-Chess_Size/2, Chess_Size, Chess_Size);
    }
  根据算法判断输赢
    if(SUANFA.Chessheng(r, c)||SUANFA.Chess45(r, c)||SUANFA.Chess135(r, c)){
    if(CHESSES[r][c]==1){
    JOptionPane.showMessageDialog(null, "黑棋赢了!");
    }else {
        JOptionPane.showMessageDialog(null, "白棋赢了!");
    }
    isOver=true;
    }
   
    }

}
五子棋算法 
public class SUANFA implements Config {
/**
* 五子棋算法
*/
//横向
public static boolean Chessheng(int r,int c){
int count=0;
for(int i=c+1;i<COLS;i++){
if (CHESSES[r][i]==CHESSES[r][c])
count++;
else{
break;
}
}
for(int i=c;i>=0;i--){
if(CHESSES[r][i]==CHESSES[r][c])
count++;
else{
break;
}
}
if(count>=5){
return true;
}
return false;
}
  public static boolean Chess45(int r,int c)
  {
  int count=0;
  //正
  for(int i=r,j=c;i>=0&&j<COLS;i--,j++){
  if(CHESSES[i][j]==CHESSES[r][c]){
  count++;
  }
  else {
  break;
}
  }
  for(int i=r+1,j=c-1;i<ROWS&&j>=0;i++,j--)
  {
  if(CHESSES[i][j]==CHESSES[r][c])
  {
            count++;
  }
  else{
  break;
  }
 
  }
if(count>=5){
  return true;
}
 
  return false;
 
  }public static boolean Chess135(int r,int c)
  {
  int count=0;
  //正
  for(int i=r,j=c;i>=0&&j>=0;i--,j--){
  if(CHESSES[i][j]==CHESSES[r][c]){
  count++;
  }
  else {
  break;
}
  }
  for(int i=r+1,j=c+1;i<ROWS&&j<COLS;i++,j++)
  {
  if(CHESSES[i][j]==CHESSES[r][c])
  {
            count++;
  }
  else{
  break;
  }
 
  }
if(count>=5){
  return true;
}
 
  return false;
  }
}


猜你喜欢

转载自mr20747252013.iteye.com/blog/2159562