📄 chessboard.java
字号:
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 + -