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

📄 chessboard.java

📁 <Java编程精选集锦>随书源码
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.awt.*;
import chessArray;
//
//
// chessBoard
//
//
public class chessBoard extends Panel implements Runnable
{
	public int width,height;
	Dimension thisSize;
	int LcornerX,LcornerY;//棋盘的左上角坐标
	int lengthX,lengthY;//棋盘的长度与宽度
	int lengthMin;//棋格的最小宽度
	Thread 	thread;
	MediaTracker mt=new MediaTracker (this);//跟踪图像
	int waitCount;//纪录加载图像的程度
	String chString[][]={
			{"将","車","炮","馬","象","士","卒"},   //*将一 車二 炮三 馬四 相五 士六 兵七 卒八
			{"帅","車","炮","馬","相","士","兵"}
	};
	String chCount[]={"一","二","三","四","五","六","七","八","九","十"};
	Color chColor[]={Color.blue,Color.red};	//棋子的前景颜色
	Color backColor=Color.black ;			//棋子的背景颜色
	chessMan chequer[]=new chessMan[32];
	boolean chooseCh=false;//判断是选棋子还是选棋子欲走的地方
		//false 表示尚未选定棋子,true 表示已选定棋子
	boolean First=true;
	public static boolean Bcount=true;//次变量用来标记一个棋子,从而避免每次都得重画所有棋子
	public chessBoard()
	{//根据框架的大小绘制棋盘
		thread=new Thread(this);
		thread.start ();
	}
	public void chB()
	{
		thisSize=getSize();
		/*getSize()方法可以获取框架的尺寸,之所以将它放在paint()  方法中,是因为当框架
		  尺寸发生变化时,便自动调用paint()重画框架,这样程序便可以同时获取框架的尺寸
		*/
		width=thisSize.width;
		height=thisSize.height;
		LcornerX=width/11; LcornerY=height/12;
//		RcornerX=width-width/10; RcornerY=height-height/11;
		lengthX=(width-width/10-LcornerX)/8;
		lengthY=(height-height/11-LcornerY)/9;
		lengthMin=lengthX<lengthY?lengthX:lengthY;//取x,y方向宽度中的最小值做为棋子的直径
	}
	public void addMan()
	{
		chessArray.img=Toolkit.getDefaultToolkit().getImage ("棋盘图案\\"+"雨后初晴.jpg");
		chessArray.imgRed=Toolkit.getDefaultToolkit().getImage ("棋子图案\\"+"red1.jpg");
		chessArray.imgBlue=Toolkit.getDefaultToolkit().getImage ("棋子图案\\"+"blue1.jpg");
		int num=0;
		for(int i=0;i<10;i++)
			for(int j=0;j<9;j++)
			{
				if(chessArray.chArray[i][j]!=0)
				{
					chequer[num]=new chessMan(this.getGraphics (),this);
					chequer[num].Num=chessArray.chArray[i][j];
					chequer[num].Count =num;
					chequer[num].X =j;
					chequer[num].Y =i;
 					num++;
				}
			}
	}
	public void drawCh() 
	{
		if(!this.Bcount )
		{
			this.Bcount =true;
			return;
		}
		int num=0;
		for(int i=0;i<10;i++)
			for(int j=0;j<9;j++)
			{
				int ch;
				if(chessArray.chArray[i][j]!=0)
				{
 					ch=chessArray.chArray[i][j];
					chequer[num].Num=chessArray.chArray[i][j];
					chequer[num].chM(LcornerX+lengthX*j-this.lengthMin/2,LcornerY+lengthY*i-this.lengthMin/2,lengthMin-1,
									 chString[ch/200][ch%100/10-1],chColor[ch/200],backColor);
					chequer[num].setVisible (true);
					chequer[num].paint ();
					num++;
				}
			}
	}
	public void drawX(Graphics g,int centery)//画两条斜线
	{
		int x1[]={LcornerX+lengthX*3,LcornerX+lengthX*3,LcornerX+lengthX*3+2,//左斜线六个横坐标
					  LcornerX+lengthX*5,LcornerX+lengthX*5,LcornerX+lengthX*5-2};
		int y1[]={LcornerY+lengthY*(centery-1)+2,LcornerY+lengthY*(centery-1),LcornerY+lengthY*(centery-1),
				  //左斜线六个纵坐标
				    LcornerY+lengthY*(centery+1)-2,LcornerY+lengthY*(centery+1),LcornerY+lengthY*(centery+1)};
		g.fillPolygon (x1,y1,6);//画左斜线
		int x2[]={LcornerX+lengthX*5-2,LcornerX+lengthX*5,LcornerX+lengthX*5,//右斜线六个横坐标
					  LcornerX+lengthX*3+6,LcornerX+lengthX*3+4,LcornerX+lengthX*3+4};
		int y2[]={LcornerY+lengthY*(centery-1)+4,LcornerY+lengthY*(centery-1)+4,LcornerY+lengthY*(centery-1)+6,
				  //右斜线六个纵坐标
				    LcornerY+lengthY*(centery+1),LcornerY+lengthY*(centery+1),LcornerY+lengthY*(centery+1)-2};
		g.fillPolygon (x2,y2,6);//画右斜线
	}
	public void drawHright(Graphics g,int centerx,int centery)//画右爿形
	{
		g.fill3DRect (LcornerX+lengthX*centerx+6,LcornerY+lengthY*centery-6,
					  this.lengthMin /3-3,3,false);//画右上横
		g.fill3DRect (LcornerX+lengthX*centerx+6,LcornerY+lengthY*centery-lengthMin /3,
					  3,this.lengthMin /3-3,false);//画右上竖
		g.fill3DRect (LcornerX+lengthX*centerx+6,LcornerY+lengthY*centery+6,
					  this.lengthMin /3-3,3,false);//画右下横
		g.fill3DRect (LcornerX+lengthX*centerx+6,LcornerY+lengthY*centery+6,
					  3,this.lengthMin /3-3,false);//画右下竖
	}
	public void drawHleft(Graphics g,int centerx,int centery)//画左爿形
	{
		g.fill3DRect (LcornerX+lengthX*centerx-lengthMin /3,LcornerY+lengthY*centery-6,
					  this.lengthMin /3-3,3,false);//画左上横
		g.fill3DRect (LcornerX+lengthX*centerx-6,LcornerY+lengthY*centery-lengthMin /3,
					  3,this.lengthMin /3-3,false);//画左上竖
		g.fill3DRect (LcornerX+lengthX*centerx-lengthMin /3,LcornerY+lengthY*centery+6,
					  this.lengthMin /3-3,3,false);//画左下横
		g.fill3DRect (LcornerX+lengthX*centerx-6,LcornerY+lengthY*centery+6,
					  3,this.lengthMin /3-3,false);//画左下竖
	}
	public void paint(Graphics g)
	{//绘制棋盘
		int imgwid=chessArray.img.getWidth(this);
		int imghei=chessArray.img.getHeight(this);
		chB();
		if(mt.checkID (0))//若图像已加载完毕
		{
			g.drawImage(chessArray.img,0,0,getSize().width,getSize().height ,this);
			if(First){
				chessArray.information ("图像已加载完毕,请选择你的身份");
				First=false;
			}
		}else return;
		g.setColor(Color.lightGray);
		g.fill3DRect(LcornerX,LcornerY,4,lengthY*9+4,false);//画左边线
		for(int i=0;i<10;i++)//画横线
		{
			g.setXORMode (Color.black);
			g.setFont (new Font ("",1,lengthX/2));
			g.drawString (""+chCount[i],LcornerX/2+lengthX*9,LcornerY+lengthY*i+lengthY/3);
			if(i==9)i=15;
			g.drawString(""+(i+1),LcornerX+lengthX*i,LcornerY+lengthY*10);
			g.setPaintMode ();
			if(i==15)i=9;
			g.fill3DRect(LcornerX,LcornerY+lengthY*i,lengthX*8+4,4,false);
		}
		g.fill3DRect(LcornerX+lengthX*8,LcornerY,4,lengthY*9+4,false);//画右边线
		for(int i=1;i<8;i++)//画竖线
		{
			g.fill3DRect(LcornerX+lengthX*i,LcornerY,4,lengthY*4+4,false);
			g.fill3DRect(LcornerX+lengthX*i,LcornerY+lengthY*5,4,lengthY*4+4,false);
		}
		drawX(g,1);//画将位
		drawX(g,8);//画帅位
		for(int i=0;i<4;i++){//画兵卒位
			drawHleft(g,(i+1)*2,3);
			drawHright(g,i*2,3);
			drawHleft(g,(i+1)*2,6);
			drawHright(g,i*2,6);
		}
		for(int i=0;i<2;i++){//画炮位
			drawHleft(g,i*6+1,2);
			drawHright(g,i*6+1,2);
			drawHleft(g,i*6+1,7);
			drawHright(g,i*6+1,7);
		}
		drawCh ();
	}
	int gsize;
	public void update(Graphics g)
	{
		mt.addImage (chessArray.img,0);
		paint(g);
	}
	public synchronized void run() 
	{
		while(true)
		{
			waitCount++;
			if(waitCount==10)
			{//检查图像是否以加载完
				mt.checkID (0,true);
			}
			try{
				thread.sleep(1);
			}catch(InterruptedException e)
			{		};
			if(chessArray.netChange)
			{
				numyBak=9-chessArray.changeCount1/10;//进行网络转换,让玩家始终面对下方棋子
				numxBak=8-chessArray.changeCount1%10;
				numy=9-chessArray.changeCount2/10;
				numx=8-chessArray.changeCount2%10;
				walkCh(true);//走棋
				chessArray.netChange=false;
				chessArray.change=true;
				chessArray.information("对家已走完,该您走了");
				//网络改动已结束,
			}
			if(chessArray.repaint ){//重画棋盘
				repaint ();
				chessArray.repaint =false;
			}
		}
	}
	int numx,numy,numxBak,numyBak,numCh,chArraybak;//numch 棋子序列号;chArraybak 起点棋子代码
	//numx 落点棋子横向代码; numy 落点棋子纵向代码; numxBak 起点棋子横向代码; numxBak 起点棋子纵向代码
	int x=0,y=0,xbak=0,ybak=0;
	public int judgeChoice(int ch) //判断选中的棋子的代码,ch是数组中的数值
	{
		for(int i=0;;i++)
			if(ch==chequer[i].Num)
			return i;
	}
	public boolean judgePlace(int evtx,int evty) 
		//判断点是否在棋子的圆内,若在返回真,否则返回假
	{
		numx=(evtx-LcornerX+lengthX/2)/lengthX;//判断选中棋子的行数
		numy=(evty-LcornerY+lengthY/2)/lengthY;//判断选中棋子的列数
		x=LcornerX+numx*lengthX;
		y=LcornerY+numy*lengthY;
		if(evtx>(x-(lengthX-6)/2)&&evtx<(x+(lengthX-6)/2)&&evty>(y-(lengthY-6)/2)&&evty<(y+(lengthY-6)/2))
			return true;
		else return false;
	}
	public void winOR(Graphics g)
	{
			g.setFont (new Font("",0,this.width /4));
			if(chessArray.netChange )
				g.drawString("你输了",0,this.height /2);
			else
				g.drawString("你嬴了",0,this.height /2);
	}

	public boolean walkCh(boolean NotGiveUp)
	{
		chArraybak=chessArray.chArray[numyBak][numxBak];//备份起点棋子代码
		chessArray.chArray[numyBak][numxBak]=0;//删除起点棋子代码
		if(chessArray.chArray[numy][numx]!=0)//若将要落子的地方有棋,则将其设为不可见
			chequer[judgeChoice(chessArray.chArray[numy][numx])].setVisible(false);
 		int ch=chArraybak;
		if(chessArray.chArray[numy][numx]==10||chessArray.chArray[numy][numx]==210)
		{
			chessArray.change=false;
			winOR(this.getGraphics ());
		}
		numCh=judgeChoice(ch);
		if(NotGiveUp)chessArray.startInf (chString[ch/200][ch%100/10-1]+" "+(numxBak+1)+" "+this.chCount [numyBak]);//起点提示
		chessArray.chArray[numy][numx]=ch;//修改落点棋子代码
		this.Bcount =false;
		repaint(LcornerX+lengthX*numxBak-this.lengthMin/2,LcornerY+lengthY*numyBak-this.lengthMin/2,
				lengthMin-1,lengthMin-1);//清除起点位置的棋子
		chequer[numCh].chM(LcornerX+lengthX*numx-this.lengthMin/2,LcornerY+lengthY*numy-this.lengthMin/2,
				   lengthMin-1,chString[ch/200][ch%100/10-1],chColor[ch/200],backColor);
		chequer[numCh].repaint();//将棋子颜色改为粉红色,一次走棋过程完成
		if(NotGiveUp){//如果没有方弃选择
			chessArray.endInf (chString[ch/200][ch%100/10-1]+" "+(numx+1)+" "+this.chCount [numy]);//起点提示
			chessArray.chFile [chessArray.fCount ++]=numxBak*1000+numyBak*100+numx*10+numy;
		}

⌨️ 快捷键说明

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