首页 > 代码库 > Java 多客户端版 2048 源码

Java 多客户端版 2048 源码

byte包

Calss Byte

 1 package Byte; 2 import java.io.*; 3 public class Byte implements Serializable{ 4     public static byte[] int2Byte(int []intValue){ 5         int length=intValue.length; 6         byte[] b=new byte[length*4]; 7         for(int i=0;i<length;i++){ 8             for(int j=0;j<4;j++){ 9                 b[i*4+j]=(byte)(intValue[i]>>8*(3-j) & 0xFF);10             }11         }12         return b;13     }14     public static int[] byte2Int(byte[] b){15         int len=b.length/4;16         int []intValue=http://www.mamicode.com/new int[len];17         for(int j=0;j<len;j++){18             for(int i=0;i<4;i++){19                 intValue[j] +=(b[j*4+i] & 0xFF)<<(8*(3-i));20             }21         }22         return intValue;23     }24     public static Object ByteToObject(byte[] bytes){25         Object obj = null;26         try {27             ByteArrayInputStream bi = new ByteArrayInputStream(bytes);28             ObjectInputStream oi = new ObjectInputStream(bi);29     30             obj = (Object) oi.readObject();31     32             bi.close();33             oi.close();34         }35         catch(Exception e) {36             e.printStackTrace();37         }38         return obj;39     }40     public static byte[] ObjectToByte(Object obj)41     {42         byte[] bytes=null;43         try {44             //object to bytearray45             ByteArrayOutputStream bo = new ByteArrayOutputStream();46             ObjectOutputStream oo = new ObjectOutputStream(bo);47             oo.writeObject(obj);48             bytes = bo.toByteArray();49             bo.close();50             oo.close();   51         }52         catch(Exception e) {53             e.printStackTrace();54         }55         return(bytes);56    }57 }

Client 包

class Window

  1 package Client;  2 import javax.swing.*;  3 import java.awt.*;  4 import java.awt.event.*;  5 import java.io.DataInputStream;  6 import java.io.DataOutputStream;  7 import java.io.IOException;  8 import java.net.DatagramPacket;  9 import java.net.InetAddress; 10 import java.net.InetSocketAddress; 11 import java.net.MulticastSocket; 12 import java.net.Socket; 13  14 import Byte.Byte; 15 /** 16  * @author 荣钦 17  * 18  */ 19 public class Window extends JFrame implements KeyListener, Runnable { 20     /** 21      *  22      */ 23     private static final long serialVersionUID = -7379543475187728667L; 24     private Container cn; 25     private JLabel sc,bestsc; 26     mainFrame mainframe; 27     JLabel statue = new JLabel(); 28     JButton [][]piece = new JButton[4][4]; 29 //    String InetAddr = "192.168.0.101"; 30     String InetAddr = "127.0.0.1"; 31 //    String InetAddr = "10.22.149.112"; 32     Socket socket=null; 33     DataInputStream in=null; 34     DataOutputStream out=null; 35     int port=5858;                                   //组播的端口 36     InetAddress group=null;                          //组播组的地址 37     MulticastSocket Msocket=null;                    //多点广播套接字  38     Thread Receive;  39     Window(){ 40         int length=376,width=679; 41         double dw=360/9; 42         /* 43          * 9:16 44          * 1:4:4:4:4:1 45          * 7:8:1 46          */ 47         this.setSize(length, width); 48         this.setLocationRelativeTo(null);                  //让窗体居中显示 49         this.setLayout(null); 50         addKeyListener(this); 51         cn=getContentPane(); 52          53         statue.setBounds((int)(dw*4),(int)(dw*10),(int)(dw*3),+(int)dw); 54         cn.add(statue); 55         sc = new JLabel(); 56         bestsc = new JLabel(); 57         bestsc.setBounds((int)(6*dw), (int)dw,(int)(4*dw),(int)(1*dw)); 58         cn.add(bestsc); 59         sc.setBounds((int)(6*dw), (int)(2*dw),(int)(4*dw),(int)(1*dw)); 60         cn.add(sc); 61         mainframe = new mainFrame(); 62         mainframe.setBackground(new Color(153,204,255)); 63         mainframe.setBounds((int)(dw/2), (int)(15*dw/2),(int)(8*dw),(int)(8*dw)); 64         cn.add(mainframe); 65         this.validate(); 66         init(); 67         this.setVisible(true); 68         this.requestFocus();//添加button 后Frame 失去焦点 69         int i,j; 70         for(i=0;i<4;i++){ 71             for(j=0;j<4;j++){ 72                 piece[i][j] = new JButton(); 73                 piece[i][j].setSize(70,70); 74                 piece[i][j].setEnabled(false); 75                 piece[i][j].setLocation(5,5); 76             } 77         } 78         mainframe.show(piece); 79         Receive=new Thread(this); 80         socket=new Socket(); 81         try {  82             if(socket.isConnected()){}                //请求和服务器建立套接字连接: 83             else{ 84                 InetAddress  address=InetAddress.getByName(InetAddr); 85                 InetSocketAddress socketAddress=new InetSocketAddress(address,4331); 86                 socket.connect(socketAddress);  87                 in =new DataInputStream(socket.getInputStream()); 88                 out = new DataOutputStream(socket.getOutputStream()); 89                 System.out.println("identity:"+in.read()); 90                 if(!(Receive.isAlive())) 91                     Receive=new Thread(this); 92                  Receive.start(); 93             } 94             group=InetAddress.getByName("239.255.8.0");//设置广播组的地址为239.255.8.0 95             Msocket=new MulticastSocket(port);    //多点广播套接字将在port端口广播 96             Msocket.joinGroup(group); //加入group 97         }  98         catch (IOException ee) { 99             System.out.println(ee);100             socket=new Socket();101         }102         103     }104     /*105      * 初始化106      */107     void init(){108         statue.setText("");109         statue.setVisible(false);110         this.requestFocus();//添加button 后Frame 失去焦点111     }112 113 114     /*115      * 按键事件116      * (non-Javadoc)117      * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)118      */119     public void keyTyped(KeyEvent arg0) {120     }121     public void keyReleased(KeyEvent arg0) {122     }123     public void keyPressed(KeyEvent arg0) {124 125         switch(arg0.getKeyCode()){126             case KeyEvent.VK_LEFT:127             case KeyEvent.VK_A:{128                 slip(0);129                 break;130             }131             case KeyEvent.VK_RIGHT:132             case KeyEvent.VK_D:{133                 slip(1);134                 break;135             }136             case KeyEvent.VK_UP:137             case KeyEvent.VK_W:{138                 slip(2);139                 break;140             }141             case KeyEvent.VK_DOWN:142             case KeyEvent.VK_S:{143                 slip(3);144                 break;145             }                146         }147     }148     void slip(int control){149         try {150             out.write(control);151         } catch (IOException e) {152             e.printStackTrace();153         }154     }155     public void run() {156         int[] pieces = null;157         int i,j;158         while(true) {   159             byte data[]=new byte[80];160             DatagramPacket packet=null;161             packet=new DatagramPacket(data,data.length,group,port); //待接收的数据包,即数据存于字节数组data中)162             try { Msocket.receive(packet);163                 data=http://www.mamicode.com/packet.getData();164             }165             catch(Exception e) {}166             pieces = Byte.byte2Int(data);167             for(i=0;i<4;i++)168                 for(j=0;j<4;j++){169                     pieceSet(piece[i][j],pieces[3+i*4+j]);170                 }171             mainframe.show(piece);172             if(pieces[0]==-1){173                 statue.setText("Game Over");174                 statue.setVisible(true);175             }176             else if(pieces[0]==1){177                 statue.setText("Win");178                 statue.setVisible(true);179             }180             else {181                 statue.setVisible(false);182             }183             sc.setFont(new Font("Arial",Font.BOLD,15));184             sc.setText("Score:"+pieces[1]);185             bestsc.setText("Best:"+pieces[2]);186             bestsc.setFont(new Font("Arial",Font.BOLD,15));187         } 188     }189     void pieceSet(JButton p,int level){190         int value=http://www.mamicode.com/1;191         int colorValue=http://www.mamicode.com/256/10*(10-level);192         p.setBackground(new Color(255,colorValue,colorValue));193         if (level==0){194             p.setText("");195             return;196         }197         int i;198         for(i=0;i<level;i++){199             value=http://www.mamicode.com/value*2;200         }201         p.setFont(new Font("Arial",Font.BOLD,20));202         p.setText(""+value);203     }204     public static void main(String args[]){205         new Window();206     }207 }

Server 包

class Server

 

  1 package Server;  2 import java.awt.event.ActionEvent;  3 import java.awt.event.ActionListener;  4 import java.io.DataInputStream;  5 import java.io.DataOutputStream;  6 import java.io.IOException;  7 import java.net.DatagramPacket;  8 import java.net.InetAddress;  9 import java.net.MulticastSocket; 10 import java.net.ServerSocket; 11 import java.net.Socket; 12  13 import javax.swing.SwingUtilities; 14 import javax.swing.Timer; 15  16 import Byte.Byte; 17  18 public class Server implements ActionListener, Runnable{ 19     private int [][]piece; 20     private int score; 21     private int bestscore; 22     private int statue; 23     private int[] controls; 24     Timer time; 25     Thread client; 26      27     int port=5858; 28     InetAddress group=null;                          //组播组的地址 29     MulticastSocket Msocket=null;                     //多点广播套接字   30     public Server(){ 31         client = new Thread(this); 32         time = new Timer(500,this); 33         init(); 34         client.start(); 35     } 36     public static void main(String args[]){ 37         new Server(); 38     } 39     public void init(){ 40         piece = new int[4][4]; 41         for(int i=0;i<4;i++) 42             for(int j=0;j<4;j++){ 43                 piece[i][j]=0; 44             } 45         controls = new int[4]; 46         for(int i=0;i<4;i++) 47             controls[i]=0; 48         score=0; 49         statue=0; 50         addNewPiece(); 51         addNewPiece(); 52         SwingUtilities.invokeLater( 53             new Runnable(){//实例化更新组件的线程 unnable run 54                 public void run() { 55                     broadcast(); 56                 } 57             } 58         ); 59          60         time.start(); 61     } 62     @Override 63     public void actionPerformed(ActionEvent arg0) { 64         int control = handle(-1); 65         if(control!=-1){ 66             Run2048(control); 67             SwingUtilities.invokeLater( 68                 new Runnable(){//实例化更新组件的线程 unnable run 69                     public void run() { 70                         addNewPiece(); 71                     } 72                 } 73             ); 74         } 75         SwingUtilities.invokeLater( 76             new Runnable(){//实例化更新组件的线程 unnable run 77                 public void run() { 78                     broadcast(); 79                 } 80             } 81         ); 82     } 83     void Run2048(int mindex){ 84         switch(mindex){ 85         case 0:{ 86             SwingUtilities.invokeLater( 87                 new Runnable(){//实例化更新组件的线程 unnable run 88                     public void run() { 89                         leftgo(0); 90                     } 91                 } 92             ); 93             SwingUtilities.invokeLater( 94                 new Runnable(){//实例化更新组件的线程 unnable run 95                     public void run() { 96                         leftgo(1); 97                     } 98                 } 99             );100             SwingUtilities.invokeLater(101                 new Runnable(){//实例化更新组件的线程 unnable run102                     public void run() {103                         leftgo(2);104                     }105                 }106             );107             SwingUtilities.invokeLater(108                 new Runnable(){//实例化更新组件的线程 unnable run109                     public void run() {110                         leftgo(3);111                     }112                 }113             );114             break;115         }116         case 1:{117             SwingUtilities.invokeLater(118                 new Runnable(){//实例化更新组件的线程 unnable run119                     public void run() {120                         rihetgo(0);121                     }122                 }123             );124             SwingUtilities.invokeLater(125                 new Runnable(){//实例化更新组件的线程 unnable run126                     public void run() {127                         rihetgo(1);128                     }129                 }130             );131             SwingUtilities.invokeLater(132                 new Runnable(){//实例化更新组件的线程 unnable run133                     public void run() {134                         rihetgo(2);135                     }136                 }137             );138             SwingUtilities.invokeLater(139                 new Runnable(){//实例化更新组件的线程 unnable run140                     public void run() {141                         rihetgo(3);142                     }143                 }144             );145             break;146         }147         case 2:{148             SwingUtilities.invokeLater(149                 new Runnable(){//实例化更新组件的线程 unnable run150                     public void run() {151                         upgo(0);152                     }153                 }154             );155             SwingUtilities.invokeLater(156                 new Runnable(){//实例化更新组件的线程 unnable run157                     public void run() {158                         upgo(1);159                     }160                 }161             );162             SwingUtilities.invokeLater(163                 new Runnable(){//实例化更新组件的线程 unnable run164                     public void run() {165                         upgo(2);166                     }167                 }168             );169             SwingUtilities.invokeLater(170                 new Runnable(){//实例化更新组件的线程 unnable run171                     public void run() {172                         upgo(3);173                     }174                 }175             );176             break;177         }178         case 3:{179             SwingUtilities.invokeLater(180                 new Runnable(){//实例化更新组件的线程 unnable run181                     public void run() {182                         downgo(0);183                     }184                 }185             );186             SwingUtilities.invokeLater(187                 new Runnable(){//实例化更新组件的线程 unnable run188                     public void run() {189                         downgo(1);190                     }191                 }192             );193             SwingUtilities.invokeLater(194                 new Runnable(){//实例化更新组件的线程 unnable run195                     public void run() {196                         downgo(2);197                     }198                 }199             );200             SwingUtilities.invokeLater(201                 new Runnable(){//实例化更新组件的线程 unnable run202                     public void run() {203                         downgo(3);204                     }205                 }206             );207             break;208         }209         }210     }211     void leftgo(int i){212         int k;//当前的下标213         int p;//遍历用214         int q=i;//第几条215         int m;//末端的下标216         int n;//消除位置217         k=0;218         m=3;219         n=k;220         while(k<=m){221             while(piece[q][k]==0){222                 for(p=k;p<m;p++)223                     piece[q][p]=piece[q][p+1];224                 piece[q][m]=0;225                 m--;226                 if(m<k)227                     return;228             }229             230             if(k>n){231                 if(piece[q][k]==piece[q][k-1]){232                     setCreateScore(++piece[q][k-1]);233                     piece[q][k]=0;234                     n=k;235                     k--;236                 }237             } 238             k++;239         }240     }241     void rihetgo(int i){242         int k;//当前的下标243         int p;//遍历用244         int q=i;//第几条245         int m;//末端的下标246         int n;//消除位置247         k=3;248         m=0;249         n=k;250         while(k>=m){251             while(piece[q][k]==0){252                 for(p=k;p>0;p--)253                     piece[q][p]=piece[q][p-1];254                 piece[q][m]=0;255                 m++;256                 if(m>k)257                     return;258             }259             if(k<n){260                 if(piece[q][k]==piece[q][k+1]){261                     setCreateScore(++piece[q][k+1]);262                     piece[q][k]=0;263                     n=k;264                     k++;265                 }266             } 267             k--;268         }269     }270     void upgo(int i){271         int k;//当前的下标272         int p;//遍历用273         int q=i;//第几条274         int m;//末端的下标275         int n;//消除位置276         k=0;277         m=3;278         n=k;279         while(k<=m){280             while(piece[k][q]==0){281                 for(p=k;p<m;p++)282                     piece[p][q]=piece[p+1][q];283                 piece[m][q]=0;284                 m--;285                 if(m<k)286                     return;287             }288             if(k>n){289                 if(piece[k][q]==piece[k-1][q]){290                     setCreateScore(++piece[k-1][q]);291                     piece[k][q]=0;292                     n=k;293                     k--;294                 }295             } 296             k++;297         }298     }299     void downgo(int i){300         int k;//当前的下标301         int p;//遍历用302         int q=i;//第几条303         int m;//末端的下标304         int n;//消除位置305         k=3;306         m=0;307         n=k;308         while(k>=m){309             while(piece[k][q]==0){310                 for(p=k;p>0;p--)311                     piece[p][q]=piece[p-1][q];312                 piece[m][q]=0;313                 m++;314                 if(m>k)315                     return;316             }317             if(k<n){318                 if(piece[k][q]==piece[k+1][q]){319                     setCreateScore(++piece[k+1][q]);320                     piece[k][q]=0;321                     n=k;322                     k++;323                 }324             } 325             k--;326         }327     }328     synchronized void setCreateScore(int level){329         int i;330         int levelValue=http://www.mamicode.com/1;331         for(i=0;i<level;i++)332             levelValue=http://www.mamicode.com/levelValue*2;333         score+=levelValue;334         if(levelValue>1023){335             statue=1;336         }337         if(score>bestscore)338             bestscore=score;339     }340     void addNewPiece(){341         int p;342         for(p=0;p<16;p++){343             if(piece[p/4][p%4]==0){344                 while(true){345                     int i=(int)(Math.random()*4);346                     int j=(int)(Math.random()*4);347                     if(piece[i][j]==0){348                         piece[i][j]++;349                         return;350                     }351                 }352             }353         }354         statue=-1;355     }356     /*357      * (non-Javadoc)358      * @see java.lang.Runnable#run()359      * 监听连接客户端360      */361     @Override362     public void run() {363         ServerSocket server=null;364         Socket socket=null;365         while(true) {366             try{  367                 server=new ServerSocket(4331);368             }369             catch(IOException e1) { 370                    System.out.println("正在监听"); //ServerSocket对象不能重复创建371             } 372             try{  373                 System.out.println(" 等待客户呼叫");374                    socket=server.accept();375                    System.out.println("客户的地址:"+socket.getInetAddress());376             } 377             catch (IOException e) {378                 System.out.println("正在等待客户");379             }380             if(socket!=null) { 381                 if(ServerThread.clientnum<ServerThread.maxclientnum)382                       new ServerThread(socket,this).start(); //为每个客户启动一个专门的线程  383                 else System.out.println("超出最大客户端数量");384             }385         }386     }387     /*388      * 数据广播389      */390     void broadcast(){391         try {392             group=InetAddress.getByName("239.255.8.0");//设置广播组的地址为393             Msocket=new MulticastSocket(port);         //多点广播套接字将在port端口广播394             Msocket.setTimeToLive(1); //多点广播套接字发送数据报范围为本地网络395             Msocket.joinGroup(group); //加入group后,socket发送的数据报被group中的成员接收到396         } catch (Exception e) {397         }398         DatagramPacket packet=null;        //待广播的数据包399         int []dataInt = new int[20];400         dataInt[0]=statue;401         dataInt[1]=score;402         dataInt[2]=bestscore;403         int i,j;404         for(i=0;i<4;i++){405             for(j=0;j<4;j++){406                 dataInt[3+i*4+j]=piece[i][j];407             }408         }409         byte []data =http://www.mamicode.com/ Byte.int2Byte(dataInt);410         packet=new DatagramPacket(data,data.length,group,port); 411         try {412             Msocket.send(packet);413         } catch (IOException e) {414             e.printStackTrace();415         } 416         if(statue!=0){417             time.stop();418             try {419                 new Thread().sleep(2*1000);420             } catch (InterruptedException e) {421                 // TODO Auto-generated catch block422                 e.printStackTrace();423             }424             init();425             time.start();426         }    427     }428     /*429      * 数据处理430      */431     public synchronized int handle(int control){432         switch (control){433         case -1:434             int i,mindex=0;435             for(i=0;i<4;i++)436                 if(controls[mindex]<controls[i])437                     mindex=i;438             if(controls[mindex]==0)439                 mindex =-1;440             for(i=0;i<4;i++)441                 controls[i]=0;442             return mindex;443         default:444             controls[control]++;445             return -1;446         }447     }448 }449 class ServerThread extends Thread{450     Server server;451     Socket socket;452     DataOutputStream out=null;453     DataInputStream  in=null;454     /*455      * 客户端信息456      */457     int identity=0;458     static int clientnum=0;459     final static int maxclientnum=10;460     private static int clientn=0;//用来设置id461     462     public ServerThread(Socket socket,Server server) {463         this.socket=socket;464         this.server=server;465         try {  466             out=new DataOutputStream(socket.getOutputStream());467             in=new DataInputStream(socket.getInputStream());468         }469         catch (IOException e){}470         try {471             out.write(identity);472         } catch (IOException e) {473             e.printStackTrace();474         }                               475         catch(Exception e) {476             System.out.println("Error: "+ e);          477         }478         /*479          * 给每一个客户端分配ID480          * 统计当前已经连接的客户端数量481          */482         clientn++;483         identity=clientn;484         clientnum++;  485         System.out.println("新连接客户端:客户端"+identity);486     }487     /*488      * (non-Javadoc)489      * @see java.lang.Thread#run()490      * 接受数据491      */492     public void run(){493          while(true) {494               try{  495                   int r=in.read();    //堵塞状态,除非读取到信息496 //                  统计数据497                   server.handle(r);498               }499               catch (IOException e) {500                   clientnum--;501                   System.out.println("客户离开");502                   return;503               }504            }505     }506 }