📄 chesspane.java
字号:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.StringTokenizer;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import myfile.LFile;
import net.*;
class ChessPane extends JPanel{
public static final int WIDTH=48;
public static final int RED=1,BLACK=0;
public static Image pane,chessImage,sign;
private String chessManual = " "; //棋谱
public static final int [][]cflag={ //初始值
{ 0, 1, 5, 4, 3, 4, 5, 1, 0},
{-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1, 2,-1,-1,-1,-1,-1, 2,-1},
{ 6,-1, 6,-1, 6,-1, 6,-1, 6},
{-1,-1,-1,-1,-1,-1,-1,-1,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1},
{13,-1,13,-1,13,-1,13,-1,13},
{-1, 9,-1,-1,-1,-1,-1, 9,-1},
{-1,-1,-1,-1,-1,-1,-1,-1,-1},
{ 7, 8,12,11,10,11,12, 8, 7}};
private int [][]flag=new int[10][9]; //棋盘标记
private int playerColor = BLACK; //所执棋子颜色
public boolean iStarted,heStarted;
boolean isMyTurn; //是否轮到自己走了
private int oldX,oldY,newX,newY; //棋子前后的位置
private boolean chosen; //是否选中了准备走的棋子
private boolean won; //是否赢了
public int mytime,mysteptime,histime,hissteptime;
Net netRival=null;
public static AudioPlay sound=new AudioPlay();//声音
public ChessPane(Net netPlayer){ //构造函数
netRival = netPlayer;
//载入图片
pane=getToolkit().getImage("Image\\pane.jpg");
chessImage=getToolkit().getImage("Image\\xchess.gif");
sign=getToolkit().getImage("Image\\sign.gif");
reStart();
//鼠标
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent me){
if(!iStarted||!heStarted||!isMyTurn) return; //如果不是轮到我走就不响应
int mouseX=(int)me.getPoint().getX()-5;
int mouseY=(int)me.getPoint().getY()-5;
// System.out.println(mouseX+","+mouseY);
int j=(int)(mouseX/WIDTH);
int i=(int)(mouseY/WIDTH); //取得鼠标点击的坐标
if(i>=0&&j>=0&&i<10&&j<9&&flag[i][j]>=7){//点击自己的子
oldX=i;oldY=j;chosen=true;
sound.playAudio(AudioPlay.SELECT);
repaint();
}
else if(chosen&&i>=0&&j>=0&&i<10&&j<9){ //点击对方的子或空位
newX=i;newY=j;
if(canGo(oldX,oldY,newX,newY)){//能不能走
if(flag[newX][newY]==-1)
sound.playAudio(AudioPlay.GO);
else
sound.playAudio(AudioPlay.EAT);
if(flag[newX][newY]==3){ //吃掉的是对方将军
won=true;
System.out.println("Win:"+won);
sound.playAudio(AudioPlay.GAMEWIN);
}
//发送信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
netRival.sendMessage("GO "+oldX+" "+oldY+" "+newX+" "+newY+
" "+flag[oldX][oldY]+" "+won);
//记录这一步的落子
chessManual = chessManual+Integer.toString(oldX)+" "
+Integer.toString(oldY)+" "
+Integer.toString(newX)+" "
+Integer.toString(newY)+"#";
chosen=false;
changeFlag(newX,newY,flag[oldX][oldY]);
changeFlag(oldX,oldY,-1);
isMyTurn=false;
repaint();
if(won){
JOptionPane.showMessageDialog(null,"你赢了!");
int k = JOptionPane.showConfirmDialog(null,"是否要保存棋谱?","保存棋谱",0);
if(k==JOptionPane.YES_OPTION){
LFile.save(chessManual);
}
reStart();
}
}
}
}
});
}
public void setStart(){
this.iStarted = true;
}
public void changeFlag(int i,int j,int chess){
this.flag[i][j]=chess;
}
public void dealMsg(String msg){ //处理对手下子信息
System.out.println("象棋处理信息");
StringTokenizer st=new StringTokenizer(msg);
String msgtype=st.nextToken();
if(!isMyTurn&&msgtype.equals("GO")){
isMyTurn=true;
System.out.println("isMyTurn:"+isMyTurn);
int x0=Integer.valueOf(st.nextToken()).intValue();
int y0=Integer.valueOf(st.nextToken()).intValue();
int x1=Integer.valueOf(st.nextToken()).intValue();
int y1=Integer.valueOf(st.nextToken()).intValue();
int chess=Integer.valueOf(st.nextToken()).intValue();
String won=st.nextToken();
System.out.println(x0+","+y0+","+x1+","+y1);
changeFlag(9-x0,8-y0,-1);
changeFlag(9-x1,8-y1,chess-7);
repaint();
chessManual = chessManual+Integer.toString(9-x0)+" "
+Integer.toString(8-y0)+" "
+Integer.toString(9-x1)+" "
+Integer.toString(8-y1)+"#";
if(won.equals("true")){
isMyTurn=false;
System.out.println("你输了!");
sound.playAudio(AudioPlay.GAMEOVER);
JOptionPane.showMessageDialog(null,"你输了!");
int k = JOptionPane.showConfirmDialog(null,"是否要保存棋谱?","保存棋谱",0);
if(k==JOptionPane.YES_OPTION){
LFile.save(chessManual);
}
reStart();
}
}
else if(msgtype.equals("connect")){ //刚连接成功时,画棋子
if(Net.isServer){
playerColor=ChessPane.RED;
repaint();
}else{
playerColor=ChessPane.BLACK;
repaint();
}
}
else if(msgtype.equals("startchess")){ //对方准备开局
System.out.println("对方开始");
this.heStarted = true;
if(playerColor==RED) isMyTurn=true;
else isMyTurn=false;
repaint();
}
else if(msgtype.equals("giveup")){
JOptionPane.showMessageDialog(null,"对方认输了!");
reStart();
repaint();
}
repaint();
}
public void paint(Graphics g){
g.drawImage(pane,0,0,this);
// if(!Net.hasConnected) return; //未连接时不画棋子
int f;
for(int i=0;i<10;i++) //画棋子
for(int j=0;j<9;j++){
if(flag[i][j]==-1)continue;
if(playerColor==BLACK)
g.drawImage(chessImage,12+j*48,12+i*48,55+j*48,55+i*48,43*flag[i][j],0,43+43*flag[i][j],43,null);
else{
if(flag[i][j]>6) f=flag[i][j]-7;
else f=flag[i][j]+7;
g.drawImage(chessImage,12+j*48,12+i*48,55+j*48,55+i*48,43*f,0,43+43*f,43,null);
}
}
if(chosen){
g.drawImage(sign,10+48*oldY,10+48*oldX,this);
}
}
public void reStart(){
playerColor = 1-playerColor; //交换棋色,即交换先手
isMyTurn = false;
iStarted = false;
won = false;
chosen = false;
chessManual = " "; //清空棋谱缓冲
for(int i=0;i<10;i++) //还原棋盘
for(int j=0;j<9;j++)
flag[i][j]=cflag[i][j];
repaint();
mytime = 0;
mysteptime = 0;
histime = 0;
hissteptime = 0;
}
public boolean canGo(int oldX,int oldY,int newX,int newY){
int max,min,i;
int dx,dy;
switch(flag[oldX][oldY]){
case 10://将
System.out.println("将");
if(newX>=7&&newX<=9&&newY>=3&&newY<=5){
dx=Math.abs(newX-oldX);dy=Math.abs(newY-oldY);
if((dx==0&&dy==1)||(dx==1&&dy==0)) return true;
else return false;
}else if(newY==oldY&&newX>=0&&newX<3&&flag[newX][newY]==3){
for(i=newX+1;i<oldX;i++)
if(flag[i][oldY]!=-1) break;
if(i>=oldX){System.out.println("将军面对面");return true;}
}
else return false;
case 11://士
System.out.println("士");
if((oldX==7||oldX==9)&&(oldY==3||oldY==5)){
if(newX==8&&newY==4) return true;
return false;
}
else if(oldX==8&&oldY==4){
if((newX==7||newX==9)&&(newY==3||newY==5)) return true;
return false;
}
else return false;
case 12://相
System.out.println("相");
if(newX<5) {System.out.println("相不能过河"); return false;}
dx=newX-oldX;dy=newY-oldY;
if(Math.abs(dx)==2&&Math.abs(dy)==2){
if(flag[oldX+dx/2][oldY+dy/2]==-1) return true;
System.out.println("堵象脚...");
return false;
}
else return false;
case 8://马
System.out.println("马");
dx=newX-oldX;dy=newY-oldY;
if(Math.abs(dx)==2&&Math.abs(dy)==1){
if(flag[oldX+dx/2][oldY]==-1) return true;
else System.out.println("堵马脚...");
}
else if(Math.abs(dx)==1&&Math.abs(dy)==2){
if(flag[oldX][oldY+dy/2]==-1) return true;
System.out.println("堵马脚...");
return false;
}
else return false;
case 7://车
System.out.println("车");
if(newX==oldX&&newY!=oldY){
if(newY<oldY){
max=oldY;min=newY;
}else{
max=newY;min=oldY;
}
System.out.println("max&min:"+max+","+min);
for(i=min+1;i<max;i++)
if(flag[oldX][i]!=-1) break;
System.out.println("i="+i);
if(i<max) {System.out.println("不能越过其它子1");return false;}
else return true;
}
else if(newX!=oldX&&newY==oldY){
if(newX<oldX){
max=oldX;min=newX;
}else{
max=newX;min=oldX;
}
for(i=min+1;i<max;i++)
if(flag[i][oldY]!=-1) break;
if(i<max) {System.out.println("不能越过其它子2");return false;}
else return true;
}
else return false;
case 9://炮
int num=0; //记录两位置间有几个子
System.out.println("炮");
if(newX==oldX&&newY!=oldY){
if(newY<oldY){
max=oldY;min=newY;
}else{
max=newY;min=oldY;
}
for(i=min+1;i<max;i++)//计算两位置间有几个子
if(flag[oldX][i]!=-1) num++;
}
else if(newX!=oldX&&newY==oldY){
if(newX<oldX){
max=oldX;min=newX;
}else{
max=newX;min=oldX;
}
for(i=min+1;i<max;i++)//计算两位置间有几个子
if(flag[i][oldY]!=-1) num++;
}
else return false;
if(num==0&&flag[newX][newY]==-1) return true;
if(num==1&&flag[newX][newY]<10&&flag[newX][newY]>=0) return true;
return false;
case 13://兵
System.out.println("兵");
if(oldX>4){//未过河
System.out.println("未过河");
if(oldX==newX+1&&oldY==newY) return true;
}
else if(oldX<5){//已过河
System.out.println("已过河");
if((Math.abs(newY-oldY)==1&&newX==oldX)||(newY==oldY&&oldX-newX==1))
return true;
}
else return false;
}
System.out.println("靠,不能走"+this.oldX+","+this.oldY);
return false;
}
public void countTime(){
if(!iStarted||!heStarted) return;
if(isMyTurn){
mysteptime++;
mytime++;
hissteptime=0;
}else{
hissteptime++;
histime++;
mysteptime=0;
}
System.out.println("mytime:"+mytime+",mysteptime:"+mysteptime
+". histime:"+histime+",hissteptime:"+hissteptime);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -