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

📄 j_fir_board.java

📁 单机黑白棋显示
💻 JAVA
字号:
//棋盘类
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.Polygon;
import java.awt.Rectangle;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JOptionPane;


public class J_FIR_Board extends JPanel
	{
		public static int LINE_NUM = 15;
		public static int CHESSMAN_SIZE = 28;
		public static int STAR_SIZE = 5;
		public static int LINE_DIST = 30;
		public static int[][] DIRECTION = {{0,-1},{-1,-1},{-1,0},{-1,1}};
		
		protected static int ORI_X = 10;
		protected static int ORI_Y = 10;
		private int[] x = new int[LINE_NUM*LINE_NUM];
		private int[] y = new int[LINE_NUM*LINE_NUM];
		int[][] Board= new int[LINE_NUM][LINE_NUM];
		private int n = -1;
		public boolean updateCompleted = true;
		private boolean SingleMode = false;
		private int winner = 0;
		
				
		public J_FIR_Board() //构造函数
		{
			
			addMouseListener(new MouseListener()
				{
					public int Num_to_Pix(int Num,int d)
					{
						if (d==1) return ORI_X+LINE_DIST/2+Num*LINE_DIST; 
							else return ORI_Y+LINE_DIST/2+Num*LINE_DIST;
					}
					
					public int Pix_to_Num(int Pix,int d)
					{
						int temp;
						
						if (d==1) {
							temp = (Pix-ORI_X-LINE_DIST/2)/LINE_DIST;
							if (Num_to_Pix(temp+1,d)-Pix<Pix-Num_to_Pix(temp,d)) temp++;
						} else {
							temp = (Pix-ORI_Y-LINE_DIST/2)/LINE_DIST;
							if (Num_to_Pix(temp+1,d)-Pix<Pix-Num_to_Pix(temp,d)) temp++;
						}
						return temp;
					}
					
					public void mouseClicked(MouseEvent e)
					{
						updateCompleted = false;
						n++;
						x[n] = Pix_to_Num(e.getX(),1);
						y[n] = Pix_to_Num(e.getY(),2);
						if (x[n]<0 || y[n]<0 || x[n]>=LINE_NUM || y[n]>=LINE_NUM) {
							System.out.println("Out of chessboard!\n"); 
						} else {
								boolean ok = true;
								for (int i=n-1;i>=0;i--) if (x[i]==x[n] && y[i]==y[n]) { ok = false; break; }
								if (!ok) n--;
						}
						
						repaint();
						checkStatus();		
						updateCompleted = true;
					}
					
					public void mouseEntered(MouseEvent e)
					{
					}
					
					public void mouseExited(MouseEvent e)
					{
					}
					
					public void mousePressed(MouseEvent e)
					{
						
					}
					
					public void mouseReleased(MouseEvent e)
					{
					}
				}
			);
			addMouseMotionListener(new MouseMotionListener()
				{
					public void mouseMoved(MouseEvent e)
					{
					}
					
					public void mouseDragged(MouseEvent e)
					{
					}
				}
			);
		}
		
		public int getCurrentN()
		{
			return n;
		}
		
		public int getCurrentX(int k)
		{
				return x[k];
		}
		public int getCurrentY(int k)
		{
				return y[k];
		}
		
		//以上3个函数供J_FIR_Client调用
		
		public void MyDrawCircle(Graphics2D g,int x,int y,int r) //画棋子或星位
		{
			g.fill(new Ellipse2D.Double(LINE_DIST/2+x*LINE_DIST-r/2.0,LINE_DIST/2+y*LINE_DIST-r/2.0,r,r));
		}
		
		public void updateBoard(int u[],int v[],int n1) //接收J_FIR_Client的数据
		{
			updateCompleted = false;
			int i;
			n = n1;
			for (i=0;i<=n;i++) x[i] = u[i];
			for (i=0;i<=n;i++) y[i] = v[i];
			repaint();
			checkStatus();
			updateCompleted = true;
		}
		
		public void setSingle(boolean ModeSwitch) //设置单机/网络模式
		{
			SingleMode = ModeSwitch;
		}
		
		public void checkStatus() //判断胜负
		{
			int i,j,t,tempX,tempY;
			int k = 0;
			boolean win = false;
			for (i=0;i<LINE_NUM;i++)
				for (j=0;j<LINE_NUM;j++) Board[i][j] = 0;
				
			for (i=0;i<=n;i++) {
				Board[x[i]][y[i]] = i%2+1;
			}
			
			for (i=0;i<=n && !win;i++) {
				k = i%2+1;
				for (j=0;j<4;j++) {
					t = 1;
					tempX = x[i];
					tempY = y[i];
					do {
						tempX += DIRECTION[j][0];
						tempY += DIRECTION[j][1];
						if (tempX<0 || tempY<0 || tempX>=LINE_NUM || tempY>=LINE_NUM) break;
						if (Board[tempX][tempY]!=k) break;
						t++;
					} while (true);
					if (t>=5) { win = true; break; }
				}
			}
			
			if (win) {
				winner = k;
				if (SingleMode) {
					if (k==1) JOptionPane.showMessageDialog(null,"黑棋获胜!"); else
						if (k==2) JOptionPane.showMessageDialog(null,"白棋获胜!");
				}
			}
		}
		
		public boolean isWinner(int k) //判断胜者
		{
			if (k==winner) return true; else return false;
		}
		
		protected void paintComponent(Graphics gg)
		{
			Graphics2D g = (Graphics2D) gg;
			int i;
			
			//g.clearRect(0,0,getWidth(),getHeight());
			
			Color c = g.getColor();
			
			g.translate(ORI_X,ORI_Y);
			g.setColor(new Color(230,230,30));
			g.fill(new Rectangle(0,0,LINE_DIST*LINE_NUM,LINE_DIST*LINE_NUM));
			g.setColor(Color.black);
			for (i=0;i<LINE_NUM;i++) g.drawLine(LINE_DIST/2+i*LINE_DIST,
																					LINE_DIST/2,
																					LINE_DIST/2+i*LINE_DIST,
																					LINE_DIST*LINE_NUM-LINE_DIST/2 );
			for (i=0;i<LINE_NUM;i++) g.drawLine(LINE_DIST/2,
																					LINE_DIST/2+i*LINE_DIST,
																					LINE_DIST*LINE_NUM-LINE_DIST/2,
																					LINE_DIST/2+i*LINE_DIST );			
			//画棋盘
			MyDrawCircle(g,3,3,STAR_SIZE); 
			MyDrawCircle(g,3,LINE_NUM-4,STAR_SIZE);
			MyDrawCircle(g,LINE_NUM-4,3,STAR_SIZE);
			MyDrawCircle(g,LINE_NUM-4,LINE_NUM-4,STAR_SIZE);
			//以上画星位
			if (LINE_NUM%2==1) MyDrawCircle(g,(LINE_NUM-1)/2,(LINE_NUM-1)/2,STAR_SIZE);
			
			for (i=0; i<=n;i++)
			{				
				if (i%2==0) g.setColor(Color.black); else g.setColor(new Color(245,245,245));
				
				MyDrawCircle(g,x[i],y[i],CHESSMAN_SIZE);
			}
			
			if (n>=0) {
				g.setColor(Color.red);
				
				int LastCenterX = LINE_DIST/2+x[n]*LINE_DIST;
				int LastCenterY = LINE_DIST/2+y[n]*LINE_DIST;
				int[] LastStepSignX = { LastCenterX,LastCenterX,LastCenterX-CHESSMAN_SIZE/2};
				int[] LastStepSignY = { LastCenterY,LastCenterY-CHESSMAN_SIZE/2,LastCenterY};
				
				g.fill(new Polygon(LastStepSignX,LastStepSignY,3)); 
				//最新的一着棋标以红色三角形
			}
			
			g.setColor(c);
			
			System.out.println("n="+n); //调试时用
		}
	}

⌨️ 快捷键说明

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