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

📄 baw.java

📁 可以找个朋友玩玩的小游戏!希望大家支持!
💻 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 + -