你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
网络象棋原理及Java实现(中)
 

public boolean handleEvent(Event evt)

    {

        switch (evt.id)

        {

            case Event.MOUSE_DOWN :

                if(!chessArray.change)

                {

                chessArray.information ("现在不能走棋;"+chessArray.information);

                return false;//如果此时不允许修改,则返回

                }

                if (judgePlace(evt.x,evt.y)&&evt.clickCount==1)

                {//如果点击点落在棋子范围内

                  if(chooseCh==false&&chessArray.chArray[numy][numx]!=0)

                  {//如果没有选中棋子,即处在选棋状态,并且点击点有棋子

                    if(chessArray.chArray[numy][numx]<200)

                    {

                        chessArray.information ("请走您自己的子");

                        return false;

                    }

                    chooseCh=true;

                    int ch=chessArray.chArray[numy][numx];

                    numCh=judgeChoice(ch);

                    numxBak=numx;

                    numyBak=numy;

                    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],Color.lightGray);

                    //将棋子颜色改为灰色说明此棋子已被选中

                    chequer[numCh].repaint();

                    chessArray.changeCount1 =numy*10+numx;

                    return true;

                  }

                  if(chooseCh)

                  {//如果选中棋子,即处在走棋状态

  if(numxBak==numx&&numyBak==numy){//如果棋子的代码相同,则认为在同一位置

//点击两次,返回

                        chooseCh=false;//变为允许选棋状态

                        walkCh(false);

                        return true;

                    }

                    if(!chRule())return false;//若不符合规则,返回

                    walkCh(true);

                    chooseCh=false;//变为允许选棋状态

                    chessArray.change=false;//数据已改动,可以发送数据

                    chessArray.readyOut=true;//数据已改动,可以发送数据

                    chessArray.information("正在发送数据......");

                    chessArray.changeCount2 =numy*10+numx;

                    return true;

                  }

                }

                return true;

            default:

                return false;

        }  

    }

    public boolean chRule()

    {

        /*此方法用来判断走棋是否合法,代码从略*/  

 }…………………….代码四…………………………….

上面的代码中的两个变量chessArray.changeCount1, chessArray.changeCount2应当引起您的特别注意,它们就是每次被传输的数据。为什么会是它呢?

网络数据传输应当本着这样的原则:数量少作用大,对代码四细一分析便可发现,真正有用的数据只有五个:棋子代码code算一个,始末位置坐标四个x1,x2,x3,x4。五个数据当然可以分五次进行发送,但这五个数位数实在太少,不如进行简单的运算以减少数量。

所以有:x1×10000+y1×1000+code;

    x2×10+y2;

下面给出服务器与客户机的源代码,因为玩家既可能选择庄家(服务器)也可能选择挑战者(客户机),故两程序必须同时参与编译。

/* chessClient 实现客户机方面的数据接受与发送*/

import java.awt.*;import java.net.*;

import java.io.*;

import chessArray;

 

public class chessClient implements Runnable

{   Thread thread;

    Socket socket;

    String name=null;

    OutputStream outS;

    InputStream inS;

    public chessClient(String st)

    {

        name=st;

        thread=new Thread(this);

    }

    public synchronized void run()

    {

        try{

            if(name==null)

                socket=new Socket(InetAddress.getLocalHost (),1666);

            else socket=new Socket(name,1666);

            chessArray.information("网络连接成功,正等待庄家走棋");

            System.out.println(name);

        }catch(IOException e){

            System.out.println(e);

            return ;

        }

        while(true){

            try{

                outS=socket.getOutputStream ();

                inS=socket.getInputStream ();

            }catch(IOException e){

                System.out.println(e);

                chessArray.information("网络连接有误,对家可能已退出");

            }

            while(true)

            try{

                if(chessArray.readyOut )

                {

                    outS.write (chessArray.changeCount1 );

                    outS.write (chessArray.changeCount2 );

                    if(chessArray.changeCount1 !=254){

                        chessArray.information("等待对家走棋......");

                    }else{

                chessArray.information("已告诉庄家,等待对家走棋......");

                        chessArray.change=false;

                    }

                    chessArray.readyOut=false;

                    chessArray.readyIn=true;

                }else if(chessArray.readyIn )

                {

                    chessArray.changeCount1=inS.read ();

                    chessArray.changeCount2=inS.read();

                    if(chessArray.changeCount1==254)

                    {

                    chessArray.information("庄家已选择重下,若继续,请等待");

                        chessArray.changeCount1=-1;

                        chessArray.chA(chessArray.arrayBak);

                        chessArray.readyOut=false;

                        chessArray.repaint=true;

                        chessArray.netChange =false;

                        chessArray.change=false;

                        chessArray.readyIn=true;

                    }else

                    {

                        chessArray.netChange =true;

                        chessArray.readyIn=false;

                    }

                try{

                    thread.sleep(1000);

                }catch(InterruptedException e)

                {       };

                }

            }catch(IOException e){

                chessArray.information("网络连接有误,对家可能已退出");

            }

        }

    }

    public void start()

    {   thread.start(); }

}

/* chessServer实现服务器方面的数据接受与发送*/

import java.awt.*;import java.net.*;import java.io.*;import chessArray;public class chessServer extends Dialog implements Runnable{    Thread thread;

    ServerSocket server=null;

    Socket socket;

    OutputStream outS;

    InputStream inS;

    Label lb=new Label ("正在等待挑战者......");

    public chessServer(Frame frbak)

    {

        super(frbak,"等待连接",false);

        setBackground(Color.cyan);

        int width=300;

        int height=70;

        thread=new Thread(this);

        setFont(new Font("chequer",Font.BOLD,26));

        this.add("Center",lb);

        setBounds(chessArray.offsize.width/2-width/2,chessArray.offsize.height/2-height/2,width,height);

        show();

    }

 

    public synchronized void run()

    {

        try{

            server=new ServerSocket(1666);

        }catch(IOException e){

            return ;

        }

        while(true)

        {

            try{

                socket=server.accept ();

                this.setVisible (false);

                chessArray.change =true;

                chessArray.information("网络连接成功,您可以走棋了");

                outS=socket.getOutputStream ();

                inS=socket.getInputStream ();

            }catch(IOException e){

                chessArray.information("网络连接有误,对家可能已退出");

                System.out.println(e);

            }

            /* 此处删掉部分与chessClient相同的代码*/

    }

    public void start()

    {  thread.start();  }

}

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089