QiPan.java
~~~
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class QiPan extends JPanel implements MouseListener {
private int width;//棋盤兩線之間的距離
boolean focus=false;//棋子的狀態
int jiang1_i=4;//"帥"的i坐標
int jiang1_j=0;//"帥"的j坐標
int jiang2_i=4;//"將"的i坐標
int jiang2_j=9;//"將"的j坐標
int startI=-1;//棋子的開始位置
int startJ=-1;
int endI=-1;//棋子的終止位置
int endJ=-1;
public QiZi qiZi[][];//棋子的數組
XiangQi xq=null;//聲明XiangQi的引用
GuiZe guiZe;//聲明GuiZe的引用
public QiPan(QiZi qiZi[][],int width,XiangQi xq){
this.xq=xq;
this.qiZi=qiZi;
this.width=width;
guiZe=new GuiZe(qiZi);
this.addMouseListener(this);//為棋盤添加鼠標事件監聽器
this.setBounds(0,0,700,700);//設置棋盤的大小
this.setLayout(null);//設為空布局
}
public void paint(Graphics g1){
Graphics2D g=(Graphics2D)g1;//獲得Graphics2D對象
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);//打開抗鋸齒
Color c=g.getColor();//獲得畫筆顏色
g.setColor(XiangQi.bgColor);//將畫筆設為背景色
g.fill3DRect(60,30,580,630,false);//繪制一個矩形棋盤
g.setColor(Color.black);//畫筆顏色設為黑
for(int i=80;i<=620;i=i+60){//繪制棋盤中的橫線
g.drawLine(110,i,590,i);
}
g.drawLine(110,80,110,620);//繪制左邊線
g.drawLine(590,80,590,620);//繪制右邊線
for(int i=170;i<=530;i=i+60){//繪制中間的豎線
g.drawLine(i,80,i,320);
g.drawLine(i,380,i,620);
}
g.drawLine(290,80,410,200);//繪制兩邊的斜線
g.drawLine(290,200,410,80);
g.drawLine(290,500,410,620);
g.drawLine(290,620,410,500);
this.smallLine(g,1,2);//繪制紅炮所在位置的標志
this.smallLine(g,7,2);//繪制紅炮所在位置的標志
this.smallLine(g,0,3);//繪制兵所在位置的標志
this.smallLine(g,2,3);//繪制兵所在位置的標志
this.smallLine(g,4,3);//繪制兵所在位置的標志
this.smallLine(g,6,3);//繪制兵所在位置的標志
this.smallLine(g,8,3);//繪制兵所在位置的標志
this.smallLine(g,0,6);//繪制卒所在位置的標志
this.smallLine(g,2,6);//繪制卒所在位置的標志
this.smallLine(g,4,6);//繪制卒所在位置的標志
this.smallLine(g,6,6);//繪制卒所在位置的標志
this.smallLine(g,8,6);//繪制卒所在位置的標志
this.smallLine(g,1,7);//繪制白炮所在位置的標志
this.smallLine(g,7,7);//繪制白炮所在位置的標志
g.setColor(Color.black);
Font font1=new Font("宋體",Font.BOLD,50);//設置字體
g.setFont(font1);
g.drawString("楚 河",170,365);//繪制楚河漢界
g.drawString("漢 界",400,365);
Font font=new Font("宋體",Font.BOLD,30);
g.setFont(font);//設置字體
for(int i=0;i<9;i++){
for(int j=0;j<10;j++){//繪制棋子
if(qiZi[i][j]!=null){
if(this.qiZi[i][j].getFocus()!=false){//是否被選中
g.setColor(XiangQi.focusbg);//選中后的背景色
g.fillOval(110+i*60-25,80+j*60-25,50,50);//繪制該棋子
g.setColor(XiangQi.focuschar);//字符的顏色
}
else{
g.fillOval(110+i*60-25,80+j*60-25,50,50);//繪制該棋子
g.setColor(qiZi[i][j].getColor());//設置畫筆顏色
}
g.drawString(qiZi[i][j].getName(),110+i*60-15,80+j*60+10);
g.setColor(Color.black);//設為黑色
}
}
}
g.setColor(c);//還原畫筆顏色
}
public void smallLine(Graphics2D g,int i,int j){
int x=110+60*i;//計算坐標
int y=80+60*j;
if(i>0){//繪制左上方的標志
g.drawLine(x-3,y-3,x-20,y-3);g.drawLine(x-3,y-3,x-3,y-20);
}
if(i<8){//繪制右上方的標志
g.drawLine(x+3,y-3,x+20,y-3);g.drawLine(x+3,y-3,x+3,y-20);
}
if(i>0){//繪制左下方的標志
g.drawLine(x-3,y+3,x-20,y+3);g.drawLine(x-3,y+3,x-3,y+20);
}
if(i<8){//繪制右下方的標志
g.drawLine(x+3,y+3,x+20,y+3);g.drawLine(x+3,y+3,x+3,y+20);
}
}
public int[] getPos(MouseEvent e){
int[] pos=new int[2];
pos[0]=-1;
pos[1]=-1;
Point p=e.getPoint();//獲得事件發生的坐標點
double x=p.getX();
double y=p.getY();
if(Math.abs((x-110)/1%60)<=25){//獲得對應于數組x下標的位置
pos[0]=Math.round((float)(x-110))/60;
}
else if(Math.abs((x-110)/1%60)>=35){
pos[0]=Math.round((float)(x-110))/60+1;
}
if(Math.abs((y-80)/1%60)<=25){//獲得對應于數組y下標的位置
pos[1]=Math.round((float)(y-80))/60;
}
else if(Math.abs((y-80)/1%60)>=35){
pos[1]=Math.round((float)(y-80))/60+1;
}
return pos;
}
public void noFocus(int i,int j){
if(this.qiZi[i][j]!=null)//如果該位置有棋子
{
if(this.xq.color==0)//如果是紅方
{
if(this.qiZi[i][j].getColor().equals(XiangQi.color1))//如果棋子是紅色
{
this.qiZi[i][j].setFocus(true);//將該棋子設為選中狀態
focus=true;//將focus設為true
startI=i;//保存該坐標點
startJ=j;
}
}
else//如果是白方
{
if(this.qiZi[i][j].getColor().equals(XiangQi.color2))//如果該棋子是白色
{
this.qiZi[i][j].setFocus(true);//將該棋子設為選中狀態
focus=true;//將focus設為true
startI=i;//保存該坐標點
startJ=j;
}
}
}
}
public void success(){
qiZi[endI][endJ]=qiZi[startI][startJ];//吃掉該棋子
qiZi[startI][startJ]=null;//將原來的位置設為空
this.xq.repaint();//重繪
JOptionPane.showMessageDialog(this.xq,"恭喜您,您獲勝了","提示",
JOptionPane.INFORMATION_MESSAGE);//給出獲勝信息
this.xq.cat.tiaoZhanZhe=null;
this.xq.color=0;
this.xq.caiPan=false;
this.xq.next();//還原棋盤,進入下一盤
this.xq.jtfHost.setEnabled(false);
this.xq.jtfPort.setEnabled(false);//設置各控件的狀態
this.xq.jtfNickName.setEnabled(false);
this.xq.jbConnect.setEnabled(false);
this.xq.jbDisconnect.setEnabled(true);
this.xq.jbChallenge.setEnabled(true);
this.xq.jbYChallenge.setEnabled(false);
this.xq.jbNChallenge.setEnabled(false);
this.xq.jbFail.setEnabled(false);
startI=-1;//還原保存點
startJ=-1;
endI=-1;
endJ=-1;
jiang1_i=4;//"帥"的i坐標
jiang1_j=0;//"帥"的j坐標
jiang2_i=4;//"將"的i坐標
jiang2_j=9;//"將"的j坐標
focus=false;
}
public void noJiang(){
qiZi[endI][endJ]=qiZi[startI][startJ];
qiZi[startI][startJ]=null;//走棋
qiZi[endI][endJ].setFocus(false);//將該棋設為非選中狀態
this.xq.repaint();//重繪
if(qiZi[endI][endJ].getName().equals("帥")){//如果移動的是"帥"
jiang1_i=endI;//更新"帥"的位置坐標
jiang1_j=endJ;
}
else if(qiZi[endI][endJ].getName().equals("將")){//如果移動的是"將"
jiang2_i=endI;//更新"將"的位置坐標
jiang2_j=endJ;
}
if(jiang1_i==jiang2_i){//如果"將"和"帥"在一條豎線上
int count=0;
for(int jiang_j=jiang1_j+1;jiang_j<jiang2_j;jiang_j++){//遍歷這條豎線
if(qiZi[jiang1_i][jiang_j]!=null){
count++;break;
}
}
if(count==0){//如果等于零則照將
JOptionPane.showMessageDialog(this.xq,"照將!!!你失敗了!!!","提示",
JOptionPane.INFORMATION_MESSAGE);//給出失敗信息
this.xq.cat.tiaoZhanZhe=null;
this.xq.color=0;//還原棋盤,進入下一盤
this.xq.caiPan=false;
this.xq.next();//進入下一盤
this.xq.jtfHost.setEnabled(false);
this.xq.jtfPort.setEnabled(false);//設置各控件狀態
this.xq.jtfNickName.setEnabled(false);
this.xq.jbConnect.setEnabled(false);
this.xq.jbDisconnect.setEnabled(true);
this.xq.jbChallenge.setEnabled(true);
this.xq.jbYChallenge.setEnabled(false);
this.xq.jbNChallenge.setEnabled(false);
this.xq.jbFail.setEnabled(false);
jiang1_i=4;//"帥"的i坐標
jiang1_j=0;//"帥"的j坐標
jiang2_i=4;//"將"的i坐標
jiang2_j=9;//"將"的j坐標
}
}
startI=-1;
startJ=-1;//還原保存點
endI=-1;
endJ=-1;
focus=false;
}
public void noQiZi(){
try{//將該移動信息發送給對方
this.xq.cat.dout.writeUTF("<#MOVE#>"+this.xq.cat.tiaoZhanZhe+startI+startJ+endI+endJ);
this.xq.caiPan=false;
qiZi[endI][endJ]=qiZi[startI][startJ];
qiZi[startI][startJ]=null;//走棋
qiZi[endI][endJ].setFocus(false);//將該棋設為非選中狀態
this.xq.repaint();//重繪
if(qiZi[endI][endJ].getName().equals("帥")){//如果移動的是"帥"
jiang1_i=endI;//更新"帥"的位置坐標
jiang1_j=endJ;
}
else if(qiZi[endI][endJ].getName().equals("將")){//如果移動的是"將"
jiang2_i=endI;//更新"將"的位置坐標
jiang2_j=endJ;
}
if(jiang1_i==jiang2_i)//如果"將"和"帥"在一條豎線上
{
int count=0;
for(int jiang_j=jiang1_j+1;jiang_j<jiang2_j;jiang_j++){//遍歷這條豎線
if(qiZi[jiang1_i][jiang_j]!=null){
count++;break;
}
}
if(count==0){//如果等于零則照將
JOptionPane.showMessageDialog(this.xq,"照將!!!你失敗了!!!","提示",
JOptionPane.INFORMATION_MESSAGE);//給出失敗信息
this.xq.cat.tiaoZhanZhe=null;
this.xq.color=0;//還原棋盤,進入下一盤
this.xq.caiPan=false;
this.xq.next();//進入下一盤
this.xq.jtfHost.setEnabled(false);
this.xq.jtfPort.setEnabled(false);
this.xq.jtfNickName.setEnabled(false);//設置各控件狀態
this.xq.jbConnect.setEnabled(false);
this.xq.jbDisconnect.setEnabled(true);
this.xq.jbChallenge.setEnabled(true);
this.xq.jbYChallenge.setEnabled(false);
this.xq.jbNChallenge.setEnabled(false);
this.xq.jbFail.setEnabled(false);
jiang1_i=4;//"帥"的i坐標
jiang1_j=0;//"帥"的j坐標
jiang2_i=4;//"將"的i坐標
jiang2_j=9;//"將"的j坐標
}
}
startI=-1;
startJ=-1;//還原保存點
endI=-1;
endJ=-1;
focus=false;
}
catch(Exception ee){ee.printStackTrace();}
}
public void move(int startI,int startJ,int endI,int endJ){
if(qiZi[endI][endJ]!=null&&(qiZi[endI][endJ].getName().equals("帥")||
qiZi[endI][endJ].getName().equals("將"))){//如果"將"被吃了
qiZi[endI][endJ]=qiZi[startI][startJ];
qiZi[startI][startJ]=null;//走棋
this.xq.repaint();//重繪
JOptionPane.showMessageDialog(this.xq,"很遺憾,您失敗了!!!","提示",
JOptionPane.INFORMATION_MESSAGE);//給出失敗信息
this.xq.cat.tiaoZhanZhe=null;
this.xq.color=0;//還原棋盤進入下一盤
this.xq.caiPan=false;
this.xq.next();
this.xq.jtfHost.setEnabled(false);//還原各個控件的狀態
this.xq.jtfPort.setEnabled(false);
this.xq.jtfNickName.setEnabled(false);
this.xq.jbConnect.setEnabled(false);
this.xq.jbDisconnect.setEnabled(true);
this.xq.jbChallenge.setEnabled(true);
this.xq.jbYChallenge.setEnabled(false);
this.xq.jbNChallenge.setEnabled(false);
this.xq.jbFail.setEnabled(false);
jiang1_i=4;//"帥"的i坐標
jiang1_j=0;//"帥"的j坐標
jiang2_i=4;//"將"的i坐標
jiang2_j=9;//"將"的j坐標
}
else{//如果不是"將"
qiZi[endI][endJ]=qiZi[startI][startJ];
qiZi[startI][startJ]=null;//走棋
this.xq.repaint();//重繪
if(qiZi[endI][endJ].getName().equals("帥")){
jiang1_i=endI;//如果是"帥"
jiang1_j=endJ;
}
else if(qiZi[endI][endJ].getName().equals("將")){
jiang2_i=endI;//如果是"將"
jiang2_j=endJ;
}
if(jiang1_i==jiang2_i){//如果兩將在一條線上
int count=0;
for(int jiang_j=jiang1_j+1;jiang_j<jiang2_j;jiang_j++){
if(qiZi[jiang1_i][jiang_j]!=null){//有棋子
count++;break;
}
}
if(count==0){
JOptionPane.showMessageDialog(this.xq,"對方照將!!!你勝利了!!!",
"提示",JOptionPane.INFORMATION_MESSAGE);//給出失敗信息
this.xq.cat.tiaoZhanZhe=null;
this.xq.color=0;//還原棋盤,進入下一盤
this.xq.caiPan=false;
this.xq.next();
this.xq.jtfHost.setEnabled(false);
this.xq.jtfPort.setEnabled(false);//設置各空間位置
this.xq.jtfNickName.setEnabled(false);
this.xq.jbConnect.setEnabled(false);
this.xq.jbDisconnect.setEnabled(true);
this.xq.jbChallenge.setEnabled(true);
this.xq.jbYChallenge.setEnabled(false);
this.xq.jbNChallenge.setEnabled(false);
this.xq.jbFail.setEnabled(false);
jiang1_i=4;//"帥"的i坐標
jiang1_j=0;//"帥"的j坐標
jiang2_i=4;//"將"的i坐標
jiang2_j=9;//"將"的j坐標
}
}
}
this.xq.repaint();//重繪
}
@Override
public void mouseClicked(MouseEvent e) {
if(this.xq.caiPan==true){//判斷是否輪到該玩家走棋
int i=-1,j=-1;
int[] pos=getPos(e);
i=pos[0];
j=pos[1];
if(i>=0&&i<=8&&j>=0&&j<=9){//如果在棋盤范圍內
if(focus==false){//如果其面沒有選中棋子
this.noFocus(i,j);
}
else{//如果以前選中過棋子
if(qiZi[i][j]!=null){//如果該處有棋子
if(qiZi[i][j].getColor()==qiZi[startI][startJ].getColor())
{//如果是自己的棋子
qiZi[startI][startJ].setFocus(false);
qiZi[i][j].setFocus(true);//更改選中對象
startI=i;startJ=j;//保存修改
}
else{//如果是對方棋子
endI=i;//保存該點
endJ=j;
String name=qiZi[startI][startJ].getName();//獲得該棋子的名字
//看是否可以移動
boolean canMove=guiZe.canMove(startI,startJ,endI,endJ,name);
if(canMove)//如果可以移動
{
try{//將該移動信息發送給對方
this.xq.cat.dout.writeUTF("<#MOVE#>"+
this.xq.cat.tiaoZhanZhe+startI+startJ+endI+endJ);
this.xq.caiPan=false;
if(qiZi[endI][endJ].getName().equals("帥")||
qiZi[endI][endJ].getName().equals("將"))
{//如果終點處是對方的"將"
this.success();
}
else{//如果終點不是對方的"將"
this.noJiang();
}
}
catch(Exception ee){ee.printStackTrace();}
}
}
}
else{//如果沒有棋子
endI=i;
endJ=j;//保存終點
String name=qiZi[startI][startJ].getName();//獲得該棋的名字
boolean canMove=guiZe.canMove(startI,startJ,endI,endJ,name);//判斷是否可走
if(canMove){//如果可以移動
this.noQiZi();
}
}
}
}
this.xq.repaint();//重繪
}
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
}
~~~