📄 baw.java
字号:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class baw extends JFrame implements MouseListener,MouseMotionListener
{
MyPanel p1=new MyPanel();
public baw()
{
setTitle("黑白棋");
getContentPane().add(p1);
p1.sz[4][4]=p1.sz[5][5]=1;
p1.sz[4][5]=p1.sz[5][4]=2;
// p1.sz[3][3]=p1.sz[6][6]=6;
p1.addMouseListener(this);
p1.addMouseMotionListener(this);
}
public static void main(String[] args)
{
baw w1=new baw();
w1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
w1.setSize(310,330);
w1.setResizable(false); //将大小改为不可更改的
w1.setVisible(true);
}
public void actionPerformed(ActionEvent e){}//鼠标事件
public void mouseClicked(MouseEvent e){}//点击
public void mouseEntered(MouseEvent e){}//进入
public void mouseExited(MouseEvent e){}//退出
public void mouseReleased(MouseEvent e)//松开
{
p1.x=e.getX();
p1.y=e.getY();
if(p1.z==true)
p1.repaint();
}
public void mousePressed(MouseEvent e)//按下
{
if(p1.whowin==0)
p1.z=true;
}
public void mouseDragged(MouseEvent e){}//拖拉
public void mouseMoved(MouseEvent e){}//移动
}
class MyPanel extends JPanel
{
int qipan=8;//设置棋盘大小
int x,y;//棋子的坐标
int count;//计算胜负的变量
int whowin=0;//1代表黑棋赢,2代表白旗赢,3代表平局
int[][] sz=new int[10][10];//0代表没有棋子,1代表黑子,2代表白子
int[][] bf=new int[10][10];//棋盘数组的备份
//9代表棋子周围的空白处,很有可能能下棋子的地方
//8代表棋子周围肯定能下棋的地方
boolean z=false;//true 代表下棋子
boolean k=true;//true 代表黑子
boolean fo=true;//代表棋盘是否有子可下 true为有
boolean hei=false;//代表棋盘是否有黑子 true为有
boolean bai=false;//代表棋盘是否有白字 true为有
//i是行(x),j是列(y)
boolean found=true;//是否发现变换的棋子 true代表有
boolean found2=true;//用来判断是否双方都不能下子
public void paintComponent(Graphics g)
{
//棋盘&&棋子
super.paintComponent(g);//清空
g.setColor(Color.orange);
g.fillRect(0,0,490,510);
g.setColor(Color.black);
for(int i=1;i<=qipan+1;i++)
{
if(i!=qipan+1)
{
g.drawString(String.valueOf(i),i*30+12,20);
g.drawString(String.valueOf(i),12,i*30+15);
}
g.drawLine(30,i*30,30+30*qipan,i*30);
g.drawLine(i*30,30,i*30,30+30*qipan);
}
if(x<30||y<30||x>=270||y>=270||bf[x/30][y/30]!=8)
{
z=false;
}
//下棋
if(z==true)
{
x=x/30*30+15;
y=y/30*30+15;
if(k==true) //黑子
{
if(sz[x/30][y/30]==0&&bf[x/30][y/30]==8)
{
g.setColor(Color.black);
g.fillOval(x-13,y-13,26,26);
sz[x/30][y/30]=1;
k=false;
}
z=false;
}
else //白子
{
if(sz[x/30][y/30]==0&&bf[x/30][y/30]==8)
{
g.setColor(Color.white);
g.fillOval(x-13,y-13,26,26);
sz[x/30][y/30]=2;
k=true;
}
z=false;
}
//棋子转换
//1--从中到右
for(int i=x/30+1;i<=8;i++)
{
if(sz[i][y/30]==0||sz[i][y/30]==8||sz[i][y/30]==6)
break;
if(sz[x/30][y/30]==sz[i][y/30])
{
for(int k=x/30+1;k<=i;k++)
sz[k][y/30]=sz[x/30][y/30];
break;
}
}
//2--从中到右下
for(int i=x/30+1,j=y/30+1;i<=8&&j<=8;i++,j++)
{
if(sz[i][j]==0||sz[i][j]==8||sz[i][j]==6)
break;
if(sz[x/30][y/30]==sz[i][j])
{
for(int k=x/30+1,w=y/30+1;k<=i&&w<=j;k++,w++)
sz[k][w]=sz[x/30][y/30];
break;
}
}
//3--从中到下
for(int j=y/30+1;j<=8;j++)
{
if(sz[x/30][j]==0||sz[x/30][j]==8||sz[x/30][j]==6)
break;
if(sz[x/30][y/30]==sz[x/30][j])
{
for(int w=y/30+1;w<=j;w++)
sz[x/30][w]=sz[x/30][y/30];
break;
}
}
//4--从中到左下
for(int i=x/30-1,j=y/30+1;i>=1&&j<=8;i--,j++)
{
if(sz[i][j]==0||sz[i][j]==8||sz[i][j]==6)
break;
if(sz[x/30][y/30]==sz[i][j])
{
for(int k=x/30-1,w=y/30+1;k>=i&&w<=j;k--,w++)
sz[k][w]=sz[x/30][y/30];
break;
}
}
//5--从中到左
for(int i=x/30-1;i>=1;i--)
{
if(sz[i][y/30]==0||sz[i][y/30]==8||sz[i][y/30]==6)
break;
if(sz[x/30][y/30]==sz[i][y/30])
{
for(int k=x/30-1;k>=i;k--)
sz[k][y/30]=sz[x/30][y/30];
break;
}
}
//6--从中到左上
for(int i=x/30-1,j=y/30-1;i>=1&&j>=1;i--,j--)
{
if(sz[i][j]==0||sz[i][j]==8||sz[i][j]==6)
break;
if(sz[x/30][y/30]==sz[i][j])
{
for(int k=x/30-1,w=y/30-1;k>=i&&w>=j;k--,w--)
sz[k][w]=sz[x/30][y/30];
break;
}
}
//7--从中到上
for(int j=y/30-1;j>=1;j--)
{
if(sz[x/30][j]==0||sz[x/30][j]==8||sz[x/30][j]==6)
break;
if(sz[x/30][y/30]==sz[x/30][j])
{
for(int w=y/30-1;w>=j;w--)
sz[x/30][w]=sz[x/30][y/30];
break;
}
}
//8--从中到右上
for(int i=x/30+1,j=y/30-1;i<=8&&j>=1;i++,j--)
{
if(sz[i][j]==0||sz[i][j]==8||sz[i][j]==6)
break;
if(sz[x/30][y/30]==sz[i][j])
{
for(int k=x/30+1,w=y/30-1;k<=i&&w>=j;k++,w--)
sz[k][w]=sz[x/30][y/30];
break;
}
}
this.repaint();
}
//判断是否有地方可下棋子和是否有人胜利
if(fo==false)
{
hei=false;
bai=false;
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==1)
{
hei=true;
}
if(sz[i][j]==2)
{
bai=true;
}
}
}
if(hei==false&&bai==false)
heiVSbai();
//判断对方是否也无法下子
//先判断很有可能可以下棋的位子
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==1||sz[i][j]==2)
{
if(sz[i-1][j-1]==0)
sz[i-1][j-1]=9;
if(sz[i][j-1]==0)
sz[i][j-1]=9;
if(sz[i+1][j-1]==0)
sz[i+1][j-1]=9;
if(sz[i+1][j]==0)
sz[i+1][j]=9;
if(sz[i+1][j+1]==0)
sz[i+1][j+1]=9;
if(sz[i][j+1]==0)
sz[i][j+1]=9;
if(sz[i-1][j+1]==0)
sz[i-1][j+1]=9;
if(sz[i-1][j]==0)
sz[i-1][j]=9;
}
}
}
//具体判断能下棋的位子
found2=false;
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==9)
{
if(k==true)
sz[i][j]=2;
else
sz[i][j]=1;
//1--从中到右
for(int a=i+1;a<=8;a++)
{
if(sz[a][j]==0||sz[a][j]==9||sz[a][j]==8||sz[a][j]==6)
break;
if(sz[i][j]==sz[a][j]&&sz[i][j]!=sz[i+1][j])
{
found2=true;
break;
}
}
//2--从中到右下
for(int a=i+1,b=j+1;a<=8&&b<=8;a++,b++)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i+1][j+1])
{
found2=true;
break;
}
}
//3--从中到下
for(int b=j+1;b<=8;b++)
{
if(sz[i][b]==0||sz[i][b]==9||sz[i][b]==8||sz[i][b]==6)
break;
if(sz[i][j]==sz[i][b]&&sz[i][j]!=sz[i][j+1])
{
found2=true;
break;
}
}
//4--从中到左下
for(int a=i-1,b=j+1;a>=1&&b<=8;a--,b++)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i-1][j+1])
{
found2=true;
break;
}
}
//5--从中到左
for(int a=i-1;a>=1;a--)
{
if(sz[a][j]==0||sz[a][j]==9||sz[a][j]==8||sz[a][j]==6)
break;
if(sz[i][j]==sz[a][j]&&sz[i][j]!=sz[i-1][j])
{
found2=true;
break;
}
}
//6--从中到左上
for(int a=i-1,b=j-1;a>=1&&b>=1;a--,b--)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i-1][j-1])
{
found2=true;
break;
}
}
//7--从中到上
for(int b=j-1;b>=1;b--)
{
if(sz[i][b]==0||sz[i][b]==9||sz[i][b]==8||sz[i][b]==6)
break;
if(sz[i][j]==sz[i][b]&&sz[i][j]!=sz[i][j-1])
{
found2=true;
break;
}
}
//8--从中到右上
for(int a=i+1,b=j-1;a<=8&&b>=1;a++,b--)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i+1][j-1])
{
found2=true;
break;
}
}
sz[i][j]=0;
}
}
}
if(found2==false)
{
JOptionPane jop=new JOptionPane();
jop.showConfirmDialog(null,"双方都无棋可走!","提示!",-1);
heiVSbai();
}
if(found2==true)
{
if(k==true)
{
k=false;
JOptionPane jop=new JOptionPane();
jop.showConfirmDialog(null,"黑棋无子可走!","提示!",-1);
}
else
{
k=true;
JOptionPane jop=new JOptionPane();
jop.showConfirmDialog(null,"白棋无子可走!","提示!",-1);
}
}
this.repaint();
}
//判断很有可能可以下棋的位子
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==1||sz[i][j]==2)
{
if(sz[i-1][j-1]==0)
sz[i-1][j-1]=9;
if(sz[i][j-1]==0)
sz[i][j-1]=9;
if(sz[i+1][j-1]==0)
sz[i+1][j-1]=9;
if(sz[i+1][j]==0)
sz[i+1][j]=9;
if(sz[i+1][j+1]==0)
sz[i+1][j+1]=9;
if(sz[i][j+1]==0)
sz[i][j+1]=9;
if(sz[i-1][j+1]==0)
sz[i-1][j+1]=9;
if(sz[i-1][j]==0)
sz[i-1][j]=9;
}
}
}
fo=false;
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==9)
{
if(k==true)
sz[i][j]=1;
else
sz[i][j]=2;
//1--从中到右
for(int a=i+1;a<=8;a++)
{
if(sz[a][j]==0||sz[a][j]==9||sz[a][j]==8||sz[a][j]==6)
break;
if(sz[i][j]==sz[a][j]&&sz[i][j]!=sz[i+1][j])
{
found=true;
break;
}
}
//2--从中到右下
for(int a=i+1,b=j+1;a<=8&&b<=8;a++,b++)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i+1][j+1])
{
found=true;
break;
}
}
//3--从中到下
for(int b=j+1;b<=8;b++)
{
if(sz[i][b]==0||sz[i][b]==9||sz[i][b]==8||sz[i][b]==6)
break;
if(sz[i][j]==sz[i][b]&&sz[i][j]!=sz[i][j+1])
{
found=true;
break;
}
}
//4--从中到左下
for(int a=i-1,b=j+1;a>=1&&b<=8;a--,b++)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i-1][j+1])
{
found=true;
break;
}
}
//5--从中到左
for(int a=i-1;a>=1;a--)
{
if(sz[a][j]==0||sz[a][j]==9||sz[a][j]==8||sz[a][j]==6)
break;
if(sz[i][j]==sz[a][j]&&sz[i][j]!=sz[i-1][j])
{
found=true;
break;
}
}
//6--从中到左上
for(int a=i-1,b=j-1;a>=1&&b>=1;a--,b--)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i-1][j-1])
{
found=true;
break;
}
}
//7--从中到上
for(int b=j-1;b>=1;b--)
{
if(sz[i][b]==0||sz[i][b]==9||sz[i][b]==8||sz[i][b]==6)
break;
if(sz[i][j]==sz[i][b]&&sz[i][j]!=sz[i][j-1])
{
found=true;
break;
}
}
//8--从中到右上
for(int a=i+1,b=j-1;a<=8&&b>=1;a++,b--)
{
if(sz[a][b]==0||sz[a][b]==9||sz[a][b]==8||sz[a][b]==6)
break;
if(sz[i][j]==sz[a][b]&&sz[i][j]!=sz[i+1][j-1])
{
found=true;
break;
}
}
if(found==true)
{
sz[i][j]=8;
fo=true;
}
else
sz[i][j]=0;
}
found=false;
}
}
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
System.out.print(sz[i][j]+" ");
if(bf[i][j]==8)
bf[i][j]=0;//把上一次数组里的8清除
}
System.out.println();
}
System.out.println("---------------------------------------------");
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==8)
{
g.setColor(Color.BLUE);
g.drawLine(i*30+5,j*30+5,i*30+30-5,j*30+30-5);
g.drawLine(i*30+30-5,j*30+5,i*30+5,j*30+30-5);
bf[i][j]=sz[i][j];
sz[i][j]=0;
}
if(sz[i][j]==1)
{
g.setColor(Color.black);
g.fillOval(i*30-13+15,j*30-13+15,26,26);
}
if(sz[i][j]==2)
{
g.setColor(Color.white);
g.fillOval(i*30-13+15,j*30-13+15,26,26);
}
if(sz[i][j]==6)
{
g.setColor(Color.GREEN);
g.fillRect(i*30+4,j*30+4,24,24);
}
}
}
}
//计算胜负
public void heiVSbai()
{
int counthei=0;
int countbai=0;
for(int j=1;j<=8;j++)
{
for(int i=1;i<=8;i++)
{
if(sz[i][j]==1)
counthei++;
if(sz[i][j]==2)
countbai++;
}
}
JOptionPane jop=new JOptionPane();
jop.showConfirmDialog(null,"黑棋 "+counthei+" VS 白棋 "+countbai,"提示!",-1);
if(counthei>countbai)
{
whowin=1;
jop.showConfirmDialog(null,"黑棋胜利!","提示!",-1);
System.exit(0);
}
if(counthei<countbai)
{
whowin=2;
jop.showConfirmDialog(null,"白棋胜利!","提示!",-1);
System.exit(0);
}
if(counthei==countbai)
{
whowin=3;
jop.showConfirmDialog(null,"平局!","提示!",-1);
System.exit(0);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -