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

📄 chesspane.java

📁 java编写的一个网络象棋,通过对方ip连接,开始游戏,同时可以进行聊天,聊天部分通过线程实现,可以同时进行多个会话.
💻 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 + -